Files
Chromacase/front/models/User.ts
Amaury 4ac6369deb Leaderboard View (#332)
* LeaderboardView init

* back scores handling

* blah

* add score controller

* commit score on end of play

* front and back fix

* podium component

* push the button

* ill be baaack

* flex css thing

* pretty

* migration leaderboard

* feat(leaderboard): wip

* feat(leaderboard): pretty

* feat(leaderboard): i might be dumb

* fix(leaderboard): misuse of nullable() for totalScore User validator
2023-12-04 23:37:06 +01:00

62 lines
1.4 KiB
TypeScript

import Model, { ModelValidator } from './Model';
import * as yup from 'yup';
import ResponseHandler from './ResponseHandler';
import API from '../API';
export const UserValidator = yup
.object({
username: yup.string().required(),
password: yup
.string()
.nullable()
.transform((value) => (value === '' ? null : value)),
emailVerified: yup.boolean().required(),
email: yup
.string()
.nullable()
.transform((value) => (value === '' ? null : value)),
googleID: yup.string().required().nullable(),
isGuest: yup.boolean().required(),
partyPlayed: yup.number().required(),
totalScore: yup.number().required(),
})
.concat(ModelValidator);
export const UserHandler: ResponseHandler<yup.InferType<typeof UserValidator>, User> = {
validator: UserValidator,
transformer: (value) => ({
...value,
email: value.email ?? null,
name: value.username,
premium: false,
data: {
gamesPlayed: value.partyPlayed as number,
totalScore: value.totalScore as number,
xp: 0,
createdAt: new Date('2023-04-09T00:00:00.000Z'),
avatar: `${API.baseUrl}/users/${value.id}/picture`,
},
}),
};
interface User extends Model {
name: string;
emailVerified: boolean;
// guest accounts don't have a mail
email: string | null;
googleID: string | null;
isGuest: boolean;
premium: boolean;
data: UserData;
}
interface UserData {
gamesPlayed: number;
xp: number;
totalScore: number;
avatar: string;
createdAt: Date;
}
export default User;