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

issue #42: create action table

parent 2a76fd19
Branches
No related tags found
1 merge request!34issue #42: create action table
import { Service } from "typedi";
import type { ActionInput, ActionModel, ActionUpdate } from "../schema/action.schema";
import db from "..";
import actionTable, { actionSchemas } from "../schema/action.schema";
import { eq } from "drizzle-orm";
import { z } from "zod";
@Service()
export class ActionRepo {
async findMany():Promise<ActionModel[]>{
return z.array(actionSchemas.model).parse(await db.query.actionTable.findMany())
}
async findById(id: ActionModel['id']): Promise<ActionModel | null>{
const action = await db.query.actionTable.findFirst({
where: eq(actionTable.id, id)
})
if(!action) return null
return actionSchemas.model.parse(action)
}
async findByName(name: ActionModel['name']): Promise<ActionModel | null>{
const action = await db.query.actionTable.findFirst({
where: eq(actionTable.name, name)
})
if(!action) return null
return actionSchemas.model.parse(action)
}
async create(action: ActionInput, tx?: db): Promise<ActionModel>{
const repo = tx ?? db
const [ret] = await repo
.insert(actionTable)
.values(action)
.returning()
return actionSchemas.model.parse(ret)
}
async update(action: ActionUpdate): Promise<ActionModel>{
const [ret] = await db
.update(actionTable)
.set(action)
.where(eq(actionTable.id, action.id))
.returning()
return actionSchemas.model.parse(ret)
}
async delete(id: ActionModel['id']): Promise<ActionModel>{
const [ret] = await db
.delete(actionTable)
.where(eq(actionTable.id, id))
.returning()
return actionSchemas.model.parse(ret)
}
}
\ No newline at end of file
import { sql } from "drizzle-orm"
import { pgTable, serial, text, timestamp, varchar } from "drizzle-orm/pg-core"
import { createInsertSchema, createSelectSchema } from "drizzle-zod"
import type { z } from "zod"
const actionTable = pgTable('action', {
id: serial('id').primaryKey()
.unique()
.notNull(),
name: varchar('name', {length: 255})
.unique()
.notNull(),
createdAt: timestamp('created_at', { mode: 'string' })
.notNull()
.defaultNow(),
updatedAt: timestamp('updated_at', { mode: 'string' })
.notNull()
.defaultNow()
.$onUpdate(() => sql`current_timestamp`),
})
const actionModelSchema = createSelectSchema(actionTable)
const actionDtoSchema = actionModelSchema
const actionInputSchema = createInsertSchema(actionTable)
const actionUpdateSchema = actionInputSchema
.partial()
.required({ id: true })
export type ActionModel = z.infer<typeof actionModelSchema>
export type ActionDto = z.infer<typeof actionDtoSchema>
export type ActionInput = z.infer<typeof actionInputSchema>
export type ActionUpdate = z.infer<typeof actionUpdateSchema>
export const actionSchemas = {
model: actionModelSchema,
dto: actionDtoSchema,
input: actionInputSchema,
update: actionUpdateSchema
}
export default actionTable
\ No newline at end of file
......@@ -29,6 +29,7 @@ import resourceLikesTable from '../relations/resource-likes.relation'
import resourceEducationalStagesTable from './resource-educational-stages.schema'
import itemsTable from './items.schema'
import userAchievementsTable from '../relations/user-achievements.relation'
import actionTable from './action.schema'
export {
userTable,
......@@ -60,6 +61,7 @@ export {
achievementTable,
itemsTable,
userAchievementsTable,
actionTable,
}
export const tables = [
......@@ -88,4 +90,5 @@ export const tables = [
achievementTable,
itemsTable,
userAchievementsTable,
actionTable,
]
......@@ -47,5 +47,6 @@ await seeds.resourceEducationalStagesSeed(db)
await seeds.achievementSeed(db)
await seeds.itemsSeed(db)
await seeds.userAchievementsSeed(db)
await seeds.actionSeed(db)
await connection.end()
import type db from "@/db";
import actionTable, { type ActionInput } from "../schema/action.schema";
export default async function seed(db: db) {
await db.insert(actionTable).values(actionsData)
}
const actionsData: ActionInput[] = [
{
name: "Publicar"
},
{
name: "Favoritar"
},
{
name: "Avaliar "
},
{
name: "Comentar"
},
{
name: "Seguir Usuário"
},
{
name: "Ser Seguido"
},
{
name: "Fazer Download de um Recurso"
},
{
name: "Fazer Login"
},
{
name: "Meses de Conta"
},
{
name: "Visualizar um Recurso"
},
{
name: "Visualizar uma Coleção"
},
{
name: "Criar Coleção"
},
{
name: "Adicionar Recurso a Coleção"
},
{
name: "Adicionar Foto de Perfil"
},
{
name: "Adicionar Capa de Perfil"
},
{
name: "Adicionar Descrição do Usuário"
},
{
name: "Autenticação de Professor"
},
{
name: "Assistir Apresentação"
},
{
name: "Visualizar um Material"
},
{
name: "Compartilhar"
},
{
name: "Visualizar um Recurso de Língua Espanhola"
},
{
name: "Visualizar um Recurso de Língua Inglesa"
},
{
name: "Visualizar um Recurso de Arte"
},
{
name: "Visualizar um Recurso de Língua Portuguesa"
},
{
name: "Visualizar um Recurso de Biologia"
},
{
name: "Visualizar um Recurso de Ciências da Natureza"
},
{
name: "Visualizar um Recurso de Educação Física"
},
{
name: "Visualizar um Recurso de Filosofia"
},
{
name: "Visualizar um Recurso de Física"
},
{
name: "Visualizar um Recurso de Geografia"
},
{
name: "Visualizar um Recurso de História"
},
{
name: "Visualizar um Recurso de Matemática"
},
{
name: "Visualizar um Recurso de Química"
},
{
name: "Visualizar um Recurso de Sociologia"
},
{
name: "Visualizar um Recurso de Outras Línguas"
},
{
name: "Visualizar um Recurso de Ensino Religioso"
},
{
name: "Visualizar um Recurso de Outros"
},
{
name: "Visualizar um Recurso de Informática"
},
{
name: "Visualizar um Recurso de Direitos Humanos"
},
{
name: "Visualizar um Recurso de Educação Ambiental"
},
{
name: "Visualizar um Recurso de Educação do Campo"
},
{
name: "Visualizar um Recurso de Educação Especial"
},
{
name: "Visualizar um Recurso de Educação Indígena"
},
{
name: "Visualizar um Recurso de Educação Quilombola"
},
{
name: "Visualizar um Recurso de Educação Sexual"
},
]
\ No newline at end of file
......@@ -24,3 +24,4 @@ export { default as resourceEducationalStagesSeed } from './resource-educational
export { default as achievementSeed } from './achievement.seed'
export { default as itemsSeed } from './items.seed'
export { default as userAchievementsSeed } from './user-achievements.seed'
export { default as actionSeed } from './action.seed'
......@@ -36,6 +36,7 @@ import { publicResourceEducationalStagesRouter, resourceEducationalStagesRouter
import { achievementRouter, publicAchievementRouter } from './routes/achievement.route'
import { itemsRouter, publicItemsRouter } from './routes/items.route'
import { publicUserAchievementsRoute, userAchievementsRouter } from './routes/user-achievements.route'
import { actionRouter } from './routes/action.route'
const app = new Hono()
......@@ -121,6 +122,7 @@ app
.route('/user-institutions', userInstitutionRouter)
.route('/resourceEducationalStages', resourceEducationalStagesRouter)
.route('/items', itemsRouter)
.route('/actions', actionRouter)
.route('/achievements', achievementRouter)
.route('/resourceLikes', resourceLikesRoutes)
.route('/userAchievements', userAchievementsRouter)
......
import { ActionService } from "@/services/action.service"
import Container from "typedi"
import { honoWithJwt } from ".."
import { zValidator } from "@hono/zod-validator"
import { actionSchemas } from "@/db/schema/action.schema"
import { createApexError, HttpStatus } from "@/services/error.service"
import { z } from "zod"
const service = Container.get(ActionService)
export const actionRouter = honoWithJwt()
.post('/create', zValidator('json', actionSchemas.input),
async (c) => {
try{
const input = await c.req.valid('json')
const action = actionSchemas.dto.parse(
await service.create(input)
)
return c.json(action)
} catch (e){
return c.json(
createApexError({
status: 'error',
message: 'could not create action',
code: HttpStatus.BAD_REQUEST,
path: c.req.routePath,
suggestion: 'check the input and try again',
}),
HttpStatus.BAD_REQUEST
)
}
})
.get('/actions',
async (c) => {
try {
const actions = z.array(actionSchemas.dto).parse(await service.findMany())
return c.json({actions})
} catch (e) {
return c.notFound()
}
})
.get('/:name',
async (c) => {
try {
const name = c.req.param('name')
const action = actionSchemas.dto.parse(await service.findByName(name))
return c.json({ action })
} catch (e) {
return c.notFound()
}
})
.post('/update',
zValidator('json', actionSchemas.update),
async (c) => {
try {
const input = await c.req.valid('json')
const action = actionSchemas.dto.parse(await service.update(input))
return c.json({ action })
} catch (e) {
return c.json(
createApexError({
status: 'error',
message: 'could not update action',
code: HttpStatus.BAD_REQUEST,
path: c.req.routePath,
suggestion: 'check the input and try again',
}),
HttpStatus.BAD_REQUEST
)
}
}
)
.delete('/delete/:id',
async (c) =>{
try{
const id: number = +c.req.param('id')
const action = actionSchemas.dto.parse(
await service.delete(id)
)
return c.json(action)
} catch (e){
return c.json(
createApexError({
status: 'error',
message: 'could delete action',
code: HttpStatus.BAD_REQUEST,
path: c.req.routePath,
suggestion: 'check the input and try again',
}),
HttpStatus.BAD_REQUEST
)
}
})
\ No newline at end of file
import type db from "@/db"
import { ActionRepo } from "@/db/repo/action.repo"
import type { ActionModel, ActionInput, ActionUpdate } from "@/db/schema/action.schema"
import { Inject, Service } from "typedi"
@Service()
export class ActionService{
@Inject()
private readonly repo: ActionRepo
async findMany():Promise<ActionModel[]>{
return this.repo.findMany()
}
async findById(id: ActionModel['id']): Promise<ActionModel | null>{
return this.repo.findById(id)
}
async findByName(name: ActionModel['name']): Promise<ActionModel | null>{
return this.repo.findByName(name)
}
async create(action: ActionInput, tx?: db): Promise<ActionModel>{
return this.repo.create(action, tx)
}
async update(action: ActionUpdate): Promise<ActionModel>{
return this.repo.update(action)
}
async delete(id: ActionModel['id']): Promise<ActionModel>{
return this.repo.delete(id)
}
}
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment