Skip to content
Snippets Groups Projects
Commit e22461ce authored by nar20's avatar nar20
Browse files

issue #7: add users_stats_id to user table

parent 93221170
Branches
No related tags found
1 merge request!32issue #7: add users_stats_id to user table
{
"version": "7",
"dialect": "postgresql",
"entries": [
{
"idx": 0,
"version": "7",
"when": 1729686694449,
"tag": "0000_cooing_doorman",
"breakpoints": true
}
]
"entries": []
}
\ No newline at end of file
......@@ -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
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
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,
......
......@@ -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)
......
......@@ -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)
......@@ -21,6 +22,9 @@ export const signUpRouter = new Hono()
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)
)
......
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(
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment