mirror of
https://github.com/nx-bat/pet-the-pond.git
synced 2026-09-22 10:29:11 -04:00
(database): new data model.
This commit is contained in:
Vendored
+30
-10
@@ -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
@@ -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}
|
||||||
`;
|
`;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user