diff --git a/src/db/migrations/meta/_journal.json b/src/db/migrations/meta/_journal.json index 966b5209f2e984b047b6fd6265601ae6a90fa1eb..eaa8fcf3b643329af83679deadefa3c53fdb6305 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 922aa603b8ceb5547163f01aff104e87c26ab2b1..a4ac9c2574aa45dcac9473ef149681fa1fa857f6 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 8ccfb6cdf080ee4f71c75f6886088e5be25fbb4e..475ffc156bf73e925240a401305e211f9e652e72 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 627de98fda75a508b76008a68c86351de25360bf..d3699613852b8ed78ad43f13fce3457f7fa6d086 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 98789ec9b8acb4940624796baf9618c53a7491aa..bea7f752b4327b810864efacac6ddb958ff75e93 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 4d2d35f1b909e31efc0d137cc9f94e37d6f23234..7564d1c77fc7719c86d13720360d35fb497f2c54 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 c14a7ab401aec85e0d78c936ce8e7da4264e694a..3b4e3792e01a0fa0458358656ff8061c11d6d91e 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(