mirror of
https://github.com/hex248/sprint.git
synced 2026-02-07 18:23:03 +00:00
Merge branch 'master' into development
This commit is contained in:
@@ -18,4 +18,4 @@ STRIPE_SECRET_KEY=your_stripe_secret_key
|
||||
RESEND_API_KEY=re_xxxxxxxxxxxxxxxx
|
||||
EMAIL_FROM=Sprint <support@sprintpm.org>
|
||||
|
||||
SEED_PASSWORD=replace-in-production
|
||||
SEED_PASSWORD=replace-in-production
|
||||
|
||||
1
packages/backend/drizzle/0029_fantastic_venom.sql
Normal file
1
packages/backend/drizzle/0029_fantastic_venom.sql
Normal file
@@ -0,0 +1 @@
|
||||
ALTER TABLE "User" ADD COLUMN "preferences" json DEFAULT '{"assignByDefault":false}'::json NOT NULL;
|
||||
1361
packages/backend/drizzle/meta/0029_snapshot.json
Normal file
1361
packages/backend/drizzle/meta/0029_snapshot.json
Normal file
File diff suppressed because it is too large
Load Diff
@@ -204,6 +204,13 @@
|
||||
"when": 1769643481882,
|
||||
"tag": "0028_quick_supernaut",
|
||||
"breakpoints": true
|
||||
},
|
||||
{
|
||||
"idx": 29,
|
||||
"version": "7",
|
||||
"when": 1769726204311,
|
||||
"tag": "0029_fantastic_venom",
|
||||
"breakpoints": true
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -95,17 +95,24 @@ const issueComments = [
|
||||
"needs product input before proceeding",
|
||||
];
|
||||
|
||||
const passwordHash = await hashPassword("a");
|
||||
const SEED_PASSWORD = process.env.SEED_PASSWORD;
|
||||
|
||||
if (!SEED_PASSWORD) {
|
||||
console.error("SEED_PASSWORD is not set");
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
const passwordHash = await hashPassword(SEED_PASSWORD);
|
||||
const users = [
|
||||
{ name: "user 1", username: "u1", email: "user1@example.com", passwordHash, avatarURL: null },
|
||||
{ name: "user 2", username: "u2", email: "user2@example.com", passwordHash, avatarURL: null },
|
||||
{ name: "demo user 1", username: "demo1", email: "demo1@example.com", passwordHash, avatarURL: null },
|
||||
{ name: "demo user 2", username: "demo2", email: "demo2@example.com", passwordHash, avatarURL: null },
|
||||
// anything past here is just to have more users to assign issues to
|
||||
{ name: "user 3", username: "u3", email: "user3@example.com", passwordHash, avatarURL: null },
|
||||
{ name: "user 4", username: "u4", email: "user4@example.com", passwordHash, avatarURL: null },
|
||||
{ name: "user 5", username: "u5", email: "user5@example.com", passwordHash, avatarURL: null },
|
||||
{ name: "user 6", username: "u6", email: "user6@example.com", passwordHash, avatarURL: null },
|
||||
{ name: "user 7", username: "u7", email: "user7@example.com", passwordHash, avatarURL: null },
|
||||
{ name: "user 8", username: "u8", email: "user8@example.com", passwordHash, avatarURL: null },
|
||||
{ name: "demo user 3", username: "demo3", email: "demo3@example.com", passwordHash, avatarURL: null },
|
||||
{ name: "demo user 4", username: "demo4", email: "demo4@example.com", passwordHash, avatarURL: null },
|
||||
{ name: "demo user 5", username: "demo5", email: "demo5@example.com", passwordHash, avatarURL: null },
|
||||
{ name: "demo user 6", username: "demo6", email: "demo6@example.com", passwordHash, avatarURL: null },
|
||||
{ name: "demo user 7", username: "demo7", email: "demo7@example.com", passwordHash, avatarURL: null },
|
||||
{ name: "demo user 8", username: "demo8", email: "demo8@example.com", passwordHash, avatarURL: null },
|
||||
];
|
||||
|
||||
async function seed() {
|
||||
@@ -312,9 +319,9 @@ async function seed() {
|
||||
console.log(`created ${commentValues.length} issue comments`);
|
||||
|
||||
console.log("database seeding complete");
|
||||
console.log("\ndemo accounts (password: a):");
|
||||
console.log(" - u1");
|
||||
console.log(" - u2");
|
||||
console.log("\ndemo accounts:");
|
||||
console.log(" - demo1");
|
||||
console.log(" - demo2");
|
||||
} catch (error) {
|
||||
console.error("failed to seed database:", error);
|
||||
process.exit(1);
|
||||
|
||||
@@ -39,6 +39,7 @@ export async function updateById(
|
||||
avatarURL?: string | null;
|
||||
iconPreference?: IconStyle;
|
||||
plan?: string;
|
||||
preferences?: Record<string, boolean>;
|
||||
},
|
||||
): Promise<UserRecord | undefined> {
|
||||
const [user] = await db.update(User).set(updates).where(eq(User.id, id)).returning();
|
||||
|
||||
@@ -14,5 +14,6 @@ export default async function me(req: AuthedRequest) {
|
||||
user: safeUser as Omit<UserRecord, "passwordHash">,
|
||||
csrfToken: req.csrfToken,
|
||||
emailVerified: user.emailVerified,
|
||||
preferences: user.preferences,
|
||||
});
|
||||
}
|
||||
|
||||
@@ -8,16 +8,16 @@ export default async function update(req: AuthedRequest) {
|
||||
const parsed = await parseJsonBody(req, UserUpdateRequestSchema);
|
||||
if ("error" in parsed) return parsed.error;
|
||||
|
||||
const { name, password, avatarURL, iconPreference } = parsed.data;
|
||||
const { name, password, avatarURL, iconPreference, preferences } = parsed.data;
|
||||
|
||||
const user = await getUserById(req.userId);
|
||||
if (!user) {
|
||||
return errorResponse("user not found", "USER_NOT_FOUND", 404);
|
||||
}
|
||||
|
||||
if (!name && !password && avatarURL === undefined && !iconPreference) {
|
||||
if (!name && !password && avatarURL === undefined && !iconPreference && preferences === undefined) {
|
||||
return errorResponse(
|
||||
"at least one of name, password, avatarURL, or iconPreference must be provided",
|
||||
"at least one of name, password, avatarURL, iconPreference, or preferences must be provided",
|
||||
"NO_UPDATES",
|
||||
400,
|
||||
);
|
||||
@@ -42,7 +42,13 @@ export default async function update(req: AuthedRequest) {
|
||||
}
|
||||
|
||||
const { updateById } = await import("../../db/queries/users");
|
||||
const updatedUser = await updateById(user.id, { name, passwordHash, avatarURL, iconPreference });
|
||||
const updatedUser = await updateById(user.id, {
|
||||
name,
|
||||
passwordHash,
|
||||
avatarURL,
|
||||
iconPreference,
|
||||
preferences,
|
||||
});
|
||||
|
||||
if (!updatedUser) {
|
||||
return errorResponse("failed to update user", "UPDATE_FAILED", 500);
|
||||
|
||||
Reference in New Issue
Block a user