(database): new data model.

This commit is contained in:
2026-08-26 15:10:31 +08:00
parent 065522723e
commit 8d9acd5d7e
2 changed files with 74 additions and 39 deletions
+30 -10
View File
@@ -1,11 +1,31 @@
export type User = { export type UserFlags = {
user_id: string; blacklisted: boolean;
privacy: {
optin: boolean;
},
xp: {
current: number;
}
}; };
export type UserSettings = {
participating: boolean;
};
export type UserStatistics = {
pets: number;
};
/**
* Database User.
*/
export type User = {
/**
* User flags.
*/
flags: UserFlags;
/**
* User settings specific to each user.
*/
settings: UserSettings;
/**
* User statistics.
*/
statistics: UserStatistics;
}
+44 -29
View File
@@ -4,47 +4,42 @@ import { User } from "../types";
const client = postgres(process.env.DATABASE_URL); const client = postgres(process.env.DATABASE_URL);
const getDefaultUser = (userId: string): User => ({ const getDefaultUser = (userId: string): User => ({
user_id: userId, flags: {
privacy: { blacklisted: false
optin: true,
}, },
xp: {
current: 0 settings: {
participating: true,
}, },
statistics: {
pets: 0
}
}); });
export async function getUser(userId: string): Promise<User> { export async function getUser(userId: string): Promise<User> {
let [user] = await client<{ user_id: string; data: User }[]>` let [user] = await client<{ user_id: string; data: User }[]>`
SELECT user_id, data SELECT user_id, data FROM users
FROM users
WHERE user_id = ${userId} WHERE user_id = ${userId}
`; `;
if (!user) { if (user) return user.data;
const defaultUser = getDefaultUser(userId);
[user] = await client<{ user_id: string; data: User }[]>` [user] = await client<{ user_id: string; data: User }[]>`
INSERT INTO users (user_id, data) INSERT INTO users (user_id, data)
VALUES (${userId}, ${client.json(defaultUser)}) VALUES (${userId}, ${client.json(getDefaultUser(userId))})
ON CONFLICT (user_id) ON CONFLICT (user_id)
DO NOTHING DO NOTHING
RETURNING user_id, data RETURNING user_id, data
`; `;
if (!user) {
[user] = await client<{ user_id: string; data: User }[]>`
SELECT user_id, data FROM users WHERE user_id = ${userId}
`;
}
}
return user.data;
} }
export async function setUser(user: User): Promise<void> { export async function setUser(userId: string, data: User): Promise<void> {
await client` await client`
INSERT INTO users (user_id, data) INSERT INTO users (user_id, data)
VALUES (${user.user_id}, ${client.json(user)}) VALUES (${userId}, ${client.json(data)})
ON CONFLICT (user_id) ON CONFLICT (user_id)
DO UPDATE SET data = EXCLUDED.data DO UPDATE SET data = EXCLUDED.data
`; `;
@@ -57,18 +52,38 @@ export async function deleteUser(userId: string): Promise<void> {
`; `;
} }
export async function setUserPrivacy(userId: string, privacy: User["privacy"]): Promise<void> { export async function updateUserFlags(userId: string, flags: Partial<User["flags"]>): Promise<void> {
await client` await client`
UPDATE users UPDATE users
SET data = jsonb_set(data, '{privacy}', ${client.json(privacy)}) SET data = jsonb_set(
data,
'{flags}',
data->'flags' || ${client.json(flags)}
)
WHERE user_id = ${userId} WHERE user_id = ${userId}
`; `;
} }
export async function setUserXp(userId: string, xp: User["xp"]): Promise<void> { export async function updateUserSettings(userId: string, settings: Partial<User["settings"]>): Promise<void> {
await client` await client`
UPDATE users UPDATE users
SET data = jsonb_set(data, '{xp}', ${client.json(xp)}) SET data = jsonb_set(
data,
'{settings}',
data->'settings' || ${client.json(settings)}
)
WHERE user_id = ${userId}
`;
}
export async function updateUserStatistics(userId: string, statistics: Partial<User["statistics"]>): Promise<void> {
await client`
UPDATE users
SET data = jsonb_set(
data,
'{statistics}',
data->'statistics' || ${client.json(statistics)}
)
WHERE user_id = ${userId} WHERE user_id = ${userId}
`; `;
} }