From e22461cea5ac82d300baf9ab4cf3e6ad6adec8d2 Mon Sep 17 00:00:00 2001 From: nar20 <nar20@inf.ufpr.br> Date: Wed, 23 Oct 2024 10:17:38 -0300 Subject: [PATCH] issue #7: add users_stats_id to user table --- src/db/migrations/meta/_journal.json | 10 +------ src/db/repo/user-stats.repo.ts | 22 ++++---------- src/db/schema/user-stats.schema.ts | 23 +++------------ src/db/schema/user.schema.ts | 17 +++++++++-- src/routes/user-stats.route.ts | 44 +++------------------------- src/routes/user.route.ts | 6 +++- src/services/user-stats.service.ts | 12 ++------ 7 files changed, 38 insertions(+), 96 deletions(-) diff --git a/src/db/migrations/meta/_journal.json b/src/db/migrations/meta/_journal.json index 966b520..eaa8fcf 100644 --- a/src/db/migrations/meta/_journal.json +++ b/src/db/migrations/meta/_journal.json @@ -1,13 +1,5 @@ { "version": "7", "dialect": "postgresql", - "entries": [ - { - "idx": 0, - "version": "7", - "when": 1729686694449, - "tag": "0000_cooing_doorman", - "breakpoints": true - } - ] + "entries": [] } \ No newline at end of file diff --git a/src/db/repo/user-stats.repo.ts b/src/db/repo/user-stats.repo.ts index 922aa60..a4ac9c2 100644 --- a/src/db/repo/user-stats.repo.ts +++ b/src/db/repo/user-stats.repo.ts @@ -18,28 +18,18 @@ export class UserStatsRepo { where: eq(userStatsTable.id, id) }) if(!userStats) return null - return userStatsSchemas.userStatsModelSchema.parse(userStats) + return userStatsSchemas.model.parse(userStats) } - async findByUserId( - user_id: UserStatsModel['user_id'] - ): Promise<UserStatsModel | null> { - const userStats = await db.query.userStatsTable.findFirst({ - where: eq(userStatsTable.user_id, user_id) - }) - if(!userStats) return null - return userStatsSchemas.userStatsModelSchema.parse(userStats) - } - - async create(userStats: UserStatsInput, tx?: db): Promise<UserStatsModel> { + async create(tx?: db): Promise<UserStatsModel> { const repo = tx ?? db - + const userStats: UserStatsInput = {} const [ret] = await repo .insert(userStatsTable) .values(userStats) .returning() - return userStatsSchemas.userStatsModelSchema.parse(ret) + return userStatsSchemas.model.parse(ret) } async update(userStats: UserStatsUpdate): Promise<UserStatsModel>{ @@ -49,7 +39,7 @@ export class UserStatsRepo { .where(eq(userStatsTable.id, userStats.id)) .returning() - return userStatsSchemas.userStatsModelSchema.parse(ret) + return userStatsSchemas.model.parse(ret) } async delete(id: UserStatsModel['id']): Promise<UserStatsModel>{ @@ -58,6 +48,6 @@ export class UserStatsRepo { .where(eq(userStatsTable.id, id)) .returning() - return userStatsSchemas.userStatsModelSchema.parse(ret) + return userStatsSchemas.model.parse(ret) } } \ No newline at end of file diff --git a/src/db/schema/user-stats.schema.ts b/src/db/schema/user-stats.schema.ts index 8ccfb6c..475ffc1 100644 --- a/src/db/schema/user-stats.schema.ts +++ b/src/db/schema/user-stats.schema.ts @@ -1,6 +1,4 @@ -import { relations } from "drizzle-orm"; import { integer, pgTable, serial } from "drizzle-orm/pg-core"; -import userTable from "./user.schema"; import { createInsertSchema, createSelectSchema } from "drizzle-zod"; import type { z } from "zod"; @@ -8,9 +6,6 @@ const userStatsTable = pgTable('user_stats', { id: serial('id').primaryKey() .unique() .notNull(), - user_id: integer('user_id') - .references(() => userTable.id, {onDelete: 'cascade'}) - .notNull(), score: integer('score') .notNull() .default(0), @@ -34,16 +29,6 @@ const userStatsTable = pgTable('user_stats', { .default(0), }) -export const userStatsTableRelations = relations( - userStatsTable, - ({ one }) => ({ - user: one(userTable, { - fields: [userStatsTable.user_id], - references: [userTable.id] - }), - }) -) - const userStatsModelSchema = createSelectSchema(userStatsTable) const userStatsDtoSchema = userStatsModelSchema const userStatsInputSchema = createInsertSchema(userStatsTable) @@ -57,10 +42,10 @@ export type UserStatsInput = z.infer<typeof userStatsInputSchema> export type UserStatsUpdate = z.infer<typeof userStatsUpdateSchema> export const userStatsSchemas = { - userStatsModelSchema, - userStatsDtoSchema, - userStatsInputSchema, - userStatsUpdateSchema + model: userStatsModelSchema, + dto: userStatsDtoSchema, + input: userStatsInputSchema, + update: userStatsUpdateSchema } export default userStatsTable \ No newline at end of file diff --git a/src/db/schema/user.schema.ts b/src/db/schema/user.schema.ts index 627de98..d369961 100644 --- a/src/db/schema/user.schema.ts +++ b/src/db/schema/user.schema.ts @@ -1,5 +1,5 @@ import { relations, sql } from 'drizzle-orm' -import { boolean, pgTable, serial, text, timestamp, varchar } from 'drizzle-orm/pg-core' +import { boolean, integer, pgTable, serial, text, timestamp, varchar } from 'drizzle-orm/pg-core' import { createInsertSchema, createSelectSchema } from 'drizzle-zod' import { z } from 'zod' import userStatsTable from './user-stats.schema' @@ -39,7 +39,11 @@ const userTable = pgTable('user', { deleted_at: timestamp('deleted_at', { mode: 'string' }), reactivated_at: timestamp('reactivated_at', { mode: 'string' }), active: boolean('active') - .default(true) + .default(true), + user_stats_id: integer('user_stats_id') + .references(() => userStatsTable.id) + .unique() + .notNull(), }) export const userTableRelation = relations( @@ -50,6 +54,14 @@ export const userTableRelation = relations( ) const userInputSchema = createInsertSchema(userTable) +.partial() +.required({ + name: true, + username: true, + password: true, + email: true, + birthday: true +}) const userModelSchema = createSelectSchema(userTable) const userDtoSchema = createSelectSchema(userTable).omit({ password: true @@ -59,6 +71,7 @@ const userUpdateSchema = createSelectSchema(userTable) .required({ id: true }) const userProfileSchema = userModelSchema.omit({ id: true, + user_stats_id: true, password: true, birthday: true, cpf: true, diff --git a/src/routes/user-stats.route.ts b/src/routes/user-stats.route.ts index 98789ec..bea7f75 100644 --- a/src/routes/user-stats.route.ts +++ b/src/routes/user-stats.route.ts @@ -8,50 +8,14 @@ import { createApexError, HttpStatus } from "@/services/error.service"; const service = Container.get(UserStatsService) export const userStatsRouter = honoWithJwt() - /* Nao deveria ter como criar um user stats sem user */ - .post('/', zValidator('json', userStatsSchemas.userStatsInputSchema), - async (c) => { - try{ - const input = await c.req.valid('json') - - const user_stats = userStatsSchemas.userStatsDtoSchema.parse( - await service.create(input) - ) - return c.json({ user_stats}) - } catch (e) { - return c.json( - createApexError({ - status: 'error', - message: 'could not create user stats', - code: HttpStatus.BAD_REQUEST, - path: c.req.routePath, - suggestion: 'check the input and try again', - }), - HttpStatus.BAD_REQUEST - ) - } - }) - /* Tem alguma utilidade sozinha? */ - .get('/:user_id', async (c) =>{ - try{ - const user_id = +c.req.param('user_id') - const user_stats = await service.findByUserId(user_id) - const ret = userStatsSchemas.userStatsDtoSchema.parse(user_stats) - - return c.json({ user_stats: ret}) - - } catch(e){ - return c.notFound() - } - }) /* Update é uma rota própria ou vai estar embutida nas rotas das devidas estatisticas */ .post('/update', - zValidator('json', userStatsSchemas.userStatsUpdateSchema), + zValidator('json', userStatsSchemas.update), async (c) => { try{ const input = await c.req.valid('json') - const user_stats = userStatsSchemas.userStatsDtoSchema.parse( + const user_stats = userStatsSchemas.dto.parse( await service.update(input) ) @@ -71,11 +35,11 @@ export const userStatsRouter = honoWithJwt() }) /* Nao deveria ter como deletar um user stats sozinho */ .post('/delete/:id', - zValidator('json', userStatsSchemas.userStatsUpdateSchema), + zValidator('json', userStatsSchemas.update), async (c) =>{ try{ const id: number = +c.req.param('id') - const user_stats = userStatsSchemas.userStatsDtoSchema.parse( + const user_stats = userStatsSchemas.dto.parse( await service.delete(id) ) return c.json(user_stats) diff --git a/src/routes/user.route.ts b/src/routes/user.route.ts index 4d2d35f..7564d1c 100644 --- a/src/routes/user.route.ts +++ b/src/routes/user.route.ts @@ -9,6 +9,7 @@ import { createApexError, HttpStatus } from '@/services/error.service' import { followRelationSchemas } from '@/db/relations/follows.relation' import { UserStatsService } from '@/services/user-stats.service' import { FollowRelationService } from '@/services/follow.relation.service' +import { userStatsSchemas } from '@/db/schema/user-stats.schema' const service = Container.get(UserService) const followService = Container.get(FollowRelationService) @@ -20,7 +21,10 @@ export const signUpRouter = new Hono() async (c) => { try { const input = await c.req.valid('json') - + + const userStats = userStatsSchemas.dto.parse(await userStatsService.create()) + input.user_stats_id = userStats.id + console.log(userStats) const user = userSchemas.userDtoSchema.parse( await service.create(input) ) diff --git a/src/services/user-stats.service.ts b/src/services/user-stats.service.ts index c14a7ab..3b4e379 100644 --- a/src/services/user-stats.service.ts +++ b/src/services/user-stats.service.ts @@ -1,6 +1,6 @@ import type db from "@/db"; import { UserStatsRepo } from "@/db/repo/user-stats.repo"; -import type { UserStatsInput, UserStatsModel, UserStatsUpdate } from "@/db/schema/user-stats.schema"; +import type { UserStatsModel, UserStatsUpdate } from "@/db/schema/user-stats.schema"; import { Inject, Service } from "typedi"; @Service() @@ -14,16 +14,10 @@ export class UserStatsService{ return await this.repo.findById(userStats_id) } - async findByUserId( - userStats_user_id: UserStatsModel['user_id'] - ): Promise<UserStatsModel | null>{ - return await this.repo.findByUserId(userStats_user_id) - } - async create( - userStats: UserStatsInput, tx?: db + tx?: db ): Promise<UserStatsModel>{ - return this.repo.create(userStats, tx) + return this.repo.create(tx) } async update( -- GitLab