This commit is contained in:
Yanis Rigaudeau 2023-02-05 22:06:48 +01:00
parent 51a95f9bf1
commit 39ba4856a2
No known key found for this signature in database
GPG Key ID: 351F0FC23AC83A60
9 changed files with 2709 additions and 17 deletions

View File

@ -12,7 +12,14 @@ export class Card extends Entity implements CardInfo {
super(raw); super(raw);
this.name = raw.name || ''; this.name = raw.name || '';
this.rarity = raw.rarity || CardRarity.COMMON; this.rarity = raw.rarity || CardRarity.COMMON;
stats: raw.stats || {}; this.stats = raw.stats || {
baseAtk: 0,
baseCrit: 0,
baseDef: 0,
multAtk: 0,
multCrit: 0,
multDef: 0,
};
this.thumbnail = raw.thumbnail || ''; this.thumbnail = raw.thumbnail || '';
this.model = raw.model || ''; this.model = raw.model || '';
} }

View File

@ -1,12 +1,15 @@
import { EntityCtor, EntityInfo } from '@core'; import { EntityCtor, EntityInfo } from '@core';
import { randomUUID } from 'crypto'; import { randomUUID } from 'crypto';
import { ObjectId } from 'mongodb';
export class Entity implements EntityInfo { export class Entity implements EntityInfo {
_id: ObjectId;
uuid: string; uuid: string;
createdAt: Date; createdAt: Date;
updatedAt: Date; updatedAt: Date;
constructor(raw: EntityCtor) { constructor(raw: EntityCtor) {
this._id = raw._id || new ObjectId();
this.uuid = raw.uuid || randomUUID(); this.uuid = raw.uuid || randomUUID();
this.createdAt = raw.createdAt || new Date(); this.createdAt = raw.createdAt || new Date();
this.updatedAt = raw.updatedAt || new Date(); this.updatedAt = raw.updatedAt || new Date();

View File

@ -37,8 +37,15 @@ export const ReadUserSchema = () =>
}, },
}); });
export const ListUsersSchema = () => checkSchema({});
export const UpdateUserSchema = () => export const UpdateUserSchema = () =>
checkSchema({ checkSchema({
uuid: {
isUUID: {
options: 4,
},
},
username: { username: {
isString: true, isString: true,
optional: true, optional: true,
@ -54,3 +61,31 @@ export const UpdateUserSchema = () =>
optional: true, optional: true,
}, },
}); });
export const AddCardToUserSchema = () =>
checkSchema({
uuid: {
isUUID: {
options: 4,
},
},
cardUuid: {
isUUID: {
options: 4,
},
},
});
export const RemoveCardFromUserSchema = () =>
checkSchema({
uuid: {
isUUID: {
options: 4,
},
},
cardUuid: {
isUUID: {
options: 4,
},
},
});

View File

@ -6,6 +6,7 @@ import {
LoginUser, LoginUser,
UpdateUser, UpdateUser,
ListUsers, ListUsers,
AddCardToUser,
} from '../../functions/user'; } from '../../functions/user';
import { import {
LoginUserSchema, LoginUserSchema,
@ -13,10 +14,13 @@ import {
ReadUserSchema, ReadUserSchema,
LogoutUserSchema, LogoutUserSchema,
UpdateUserSchema, UpdateUserSchema,
ListUsersSchema,
AddCardToUserSchema,
RemoveCardFromUserSchema,
} from './schema/user'; } from './schema/user';
import { CheckPermissions, getRequestId, ValidateSchema } from './middleware'; import { CheckPermissions, getRequestId, ValidateSchema } from './middleware';
function LoginHandler(services: Services): RequestHandler { function LoginUserHandler(services: Services): RequestHandler {
const login = LoginUser(services); const login = LoginUser(services);
return async (req, res, next) => { return async (req, res, next) => {
@ -30,7 +34,7 @@ function LoginHandler(services: Services): RequestHandler {
}; };
} }
function LogoutHandler(services: Services): RequestHandler { function LogoutUserHandler(services: Services): RequestHandler {
return async (req, res, next) => { return async (req, res, next) => {
if (req.session.user) { if (req.session.user) {
req.session.user = null; req.session.user = null;
@ -41,7 +45,7 @@ function LogoutHandler(services: Services): RequestHandler {
}; };
} }
function CreateHandler(services: Services): RequestHandler { function CreateUserHandler(services: Services): RequestHandler {
const createUser = CreateUser(services); const createUser = CreateUser(services);
return async (req, res, next) => { return async (req, res, next) => {
@ -54,7 +58,7 @@ function CreateHandler(services: Services): RequestHandler {
}; };
} }
function ReadHandler(services: Services): RequestHandler { function ReadUserHandler(services: Services): RequestHandler {
const readUser = ReadUser(services); const readUser = ReadUser(services);
return async (req, res, next) => { return async (req, res, next) => {
@ -67,7 +71,7 @@ function ReadHandler(services: Services): RequestHandler {
}; };
} }
function UpdateHandler(services: Services): RequestHandler { function UpdateUserHandler(services: Services): RequestHandler {
const updateUser = UpdateUser(services); const updateUser = UpdateUser(services);
return async (req, res, next) => { return async (req, res, next) => {
@ -84,7 +88,7 @@ function UpdateHandler(services: Services): RequestHandler {
}; };
} }
function ListHandler(services: Services): RequestHandler { function ListUserHandler(services: Services): RequestHandler {
const listUsers = ListUsers(services); const listUsers = ListUsers(services);
return async (req, res, next) => { return async (req, res, next) => {
@ -97,6 +101,23 @@ function ListHandler(services: Services): RequestHandler {
}; };
} }
function AddCardToUserHandler(services: Services): RequestHandler {
const addCardToUser = AddCardToUser(services);
return async (req, res, next) => {
try {
const user = await addCardToUser(
getRequestId(req),
req.params.uuid,
req.body.cardUuid,
);
res.status(200).send(user);
} catch (error) {
next({ message: 'Unknown Error' });
}
};
}
export function Routes(services: Services) { export function Routes(services: Services) {
const router = Router(); const router = Router();
@ -105,44 +126,57 @@ export function Routes(services: Services) {
'/login', '/login',
LoginUserSchema(), LoginUserSchema(),
ValidateSchema(), ValidateSchema(),
LoginHandler(services), LoginUserHandler(services),
); );
router.post( router.post(
'/logout', '/logout',
LogoutUserSchema(), LogoutUserSchema(),
ValidateSchema(), ValidateSchema(),
LogoutHandler(services), LogoutUserHandler(services),
); );
router.get( router.get(
'/read/:uuid', '/read/:uuid',
CheckPermissions(), CheckPermissions(),
ReadUserSchema(), ReadUserSchema(),
ValidateSchema(), ValidateSchema(),
ReadHandler(services), ReadUserHandler(services),
); );
router.post( router.post(
'/create', '/create',
CheckPermissions(), CheckPermissions(),
CreateUserSchema(), CreateUserSchema(),
ValidateSchema(), ValidateSchema(),
CreateHandler(services), CreateUserHandler(services),
); );
router.patch( router.patch(
'/update/:uuid', '/update/:uuid',
CheckPermissions(), CheckPermissions(),
UpdateUserSchema(), UpdateUserSchema(),
ValidateSchema(), ValidateSchema(),
UpdateHandler(services), UpdateUserHandler(services),
);
router.get(
'/list',
CheckPermissions(),
ListUsersSchema(),
ValidateSchema(),
ListUserHandler(services),
); );
router.get('/list', CheckPermissions(), ListHandler(services));
//Alteration //Alteration
router.post( router.post(
'/givecard', '/addCard/:uuid',
CheckPermissions(), CheckPermissions(),
GiveCardSchema(), AddCardToUserSchema(),
ValidateSchema(), ValidateSchema(),
GiveCardHandler(), AddCardToUserHandler(services),
);
router.post(
'/removeCard/:uuid',
CheckPermissions(),
RemoveCardFromUserSchema(),
ValidateSchema(),
//RemoveCardFromUserHandler(),
); );
return router; return router;

View File

@ -1,5 +1,5 @@
import { Collection, Db } from 'mongodb'; import { Collection, Db } from 'mongodb';
import { LoginUserBody, UpdateUserBody } from '@core'; import { Card, CardInfo, LoginUserBody, UpdateUserBody } from '@core';
import { User, UserWithPassword } from '../../entities/user'; import { User, UserWithPassword } from '../../entities/user';
import { log } from '../../functions/logger'; import { log } from '../../functions/logger';
import { getHashedPassword } from '../../functions/password'; import { getHashedPassword } from '../../functions/password';
@ -99,6 +99,34 @@ class UserModel {
log(tracker, 'LIST USERS'); log(tracker, 'LIST USERS');
return userCollection.map((userDocument) => new User(userDocument)); return userCollection.map((userDocument) => new User(userDocument));
} }
public async addCard(
tracker: string,
uuid: string,
card: Card,
): Promise<User> {
const checkUser = await this.collection.findOne({ uuid });
if (!checkUser) {
log(tracker, 'User Does Not Exist');
throw new Error();
}
await this.collection.updateOne(
{ uuid },
{
$set: {
updatedAt: new Date(),
},
$addToSet: {
cards: card,
},
},
);
const user = await this.read(tracker, uuid);
log(tracker, 'ADD CARD TO USER', user, card);
return user;
}
} }
export default UserModel; export default UserModel;

View File

@ -56,3 +56,16 @@ export function ListUsers(
return users.map((user) => user.Info()); return users.map((user) => user.Info());
}; };
} }
export function AddCardToUser(
services: Services,
): (tracker: string, uuid: string, cardUuid: string) => Promise<UserInfo> {
const { userModel, cardModel } = services;
return async (tracker, uuid, cardUuid) => {
const card = await cardModel.read(tracker, cardUuid);
const user = await userModel.addCard(tracker, uuid, card);
return user.Info();
};
}

2568
core/package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -11,6 +11,7 @@
"devDependencies": { "devDependencies": {
"@types/node": "^18.8.4", "@types/node": "^18.8.4",
"prettier": "^2.7.1", "prettier": "^2.7.1",
"mongodb": "^4.10.0",
"typescript": "^4.8.3" "typescript": "^4.8.3"
} }
} }

View File

@ -1,4 +1,7 @@
import { ObjectId } from 'mongodb';
export type EntityInfo = { export type EntityInfo = {
_id: ObjectId;
uuid: string; uuid: string;
createdAt: Date; createdAt: Date;
updatedAt: Date; updatedAt: Date;