diff --git a/src/controller/cachacaController.ts b/src/controller/cachacaController.ts new file mode 100644 index 0000000..eed81a2 --- /dev/null +++ b/src/controller/cachacaController.ts @@ -0,0 +1,87 @@ +import { Request, Response } from 'express' +import { z } from 'zod' + +import cachacaService from '../service/cachacaService' +import { ObjectId } from 'mongodb' + +const CachacaController = { + async createRank(req: Request, res: Response) { + try { + const body: ChachacaDTO = AnoSchema.parse(req.body) + + const response = await cachacaService.addMoradorAoRank(body.ano) + + return res.send({ + message: 'Sucesso', + rank: response + }) + + } catch (error) { + + console.error(`Error[SERVER](${new Date().toDateString()}): Server error!`, error) + + return res.status(500).json({ message: 'Something went wrong with server', error }) + } + }, + async index( req: Request, res: Response){ + try { + const body: ChachacaDTO = AnoSchema.parse(req.body) + const response = await cachacaService.showRank(body.ano) + + return res.send({ + message: 'Sucesso', + rank: response + }) + + } catch (error) { + console.error(`Error[SERVER](${new Date().toDateString()}): Server error!`, error) + return res.status(500).json({ message: 'Something went wrong with server', error }) + } + }, + async addCachaca( req: Request, res: Response){ + try { + const { moradorId } = req.query + const morador = MoradorIdSchema.parse(moradorId) + const id = new ObjectId(morador) + const response = await cachacaService.addCachacaMorador(id) + + return res.send({ + message: 'Sucesso', + rank: response + }) + + } catch (error) { + console.error(`Error[SERVER](${new Date().toDateString()}): Server error!`, error) + return res.status(500).json({ message: 'Something went wrong with server', error }) + } + }, + +} + +const MoradorIdSchema = z.string().refine((data) => { + // Check if the data is a string of 12 bytes + if (/^[0-9a-fA-F]{24}$/.test(data)) { + return true + } + + // Check if the data is a string of 24 hex characters + if (/^[0-9a-fA-F]{24}$/.test(data)) { + return true + } + + // Check if the data is an integer + if (!isNaN(+data) && Number.isInteger(+data)) { + return true + } + + return false +}, { + message: 'Must be a ObjectId. A string of 12 bytes, a string of 24 hex characters, or an integer', +}).optional() + +const AnoSchema = z.object({ + ano: z.number().min(2015) +}) +type ChachacaDTO = z.infer + +export default CachacaController diff --git a/src/controller/moradorController.ts b/src/controller/moradorController.ts index 32b020b..bf841c2 100644 --- a/src/controller/moradorController.ts +++ b/src/controller/moradorController.ts @@ -124,6 +124,10 @@ const CreateMoradorSchema = z.object({ curso: z.string(), imagem: z.string(), instagram: z.string(), + oficial:z.boolean(), + total_cachaca:z.number(), + formado:z.boolean(), + calouro:z.boolean(), }) const MoradorIdSchema = z.string().refine((data) => { diff --git a/src/models/cachaca.ts b/src/models/cachaca.ts new file mode 100644 index 0000000..49d2c42 --- /dev/null +++ b/src/models/cachaca.ts @@ -0,0 +1,13 @@ +import { ObjectId } from 'mongodb' + +class Cachaca { + constructor( + public morador_id : ObjectId, + public cachaca_para_tomar: number, + public cachaca_ja_tomada: number, + public ano_do_rank:number, + public _id?: ObjectId, + ) {} +} + +export default Cachaca diff --git a/src/models/morador.ts b/src/models/morador.ts index bb292b8..6a59687 100644 --- a/src/models/morador.ts +++ b/src/models/morador.ts @@ -8,10 +8,13 @@ class Morador { public curso: string, public imagem: string, public instagram: string, - public cachaca_para_tomar: number, - public cachaca_ja_tomada: number, + public oficial: boolean, + public total_cachaca: number, + public formado: boolean, + public calouro: boolean, public senha?: string, public _id?: ObjectId, + public ano_saida?: number ) {} } diff --git a/src/repository/cachacaRepository.ts b/src/repository/cachacaRepository.ts new file mode 100644 index 0000000..591f4e3 --- /dev/null +++ b/src/repository/cachacaRepository.ts @@ -0,0 +1,83 @@ +import { ObjectId } from 'mongodb' +import Cachaca from '../models/cachaca' +import getDatabase from '../util/database' + +const CachacaRepository = { + async verificaRegistroExistente(morador_id:(ObjectId | undefined), ano:number){ + try{ + const database = await getDatabase() + const verify = await database + .collection('cachaca') + .findOne({ + $and:[ + { morador_id: morador_id}, + { ano_do_rank: ano }, + ] + }) as Cachaca + return verify + }catch(error){ + throw new Error(`Something wrong with server, ${error}`) + } + }, + + async showRankMoradores(ano: number) { + try { + const _database = await getDatabase() + const verify = (await _database + .collection('cachaca') + .find({ ano_do_rank: ano}) + .sort({ cachaca_ja_tomada: -1 }) + .toArray()) as Cachaca[] + return verify + } catch (error) { + throw new Error(`Algo deu errado com o servidor, ${error}`) + } + }, + + async addCachaca(morador_id: ObjectId): Promise { + try { + const _database = await getDatabase() + // define uma nova cachaca para um morador + await _database.collection('cachaca').updateOne( + { + _id: new ObjectId(morador_id), + }, + { $inc: { cachaca_para_tomar: 1 } } + ) + } catch (error) { + throw new Error(`Something wrong with server, ${error}`) + } + + }, + + async updateCachaca(morador_id: ObjectId, cachaca_ja_tomada: number, cachaca_para_tomar?: number) { + try { + const _database = await getDatabase() + await _database.collection('cachaca').updateOne( + { _id: new ObjectId(morador_id) }, + { $inc: cachaca_para_tomar ? { + cachaca_para_tomar: cachaca_para_tomar, + cachaca_ja_tomada: cachaca_ja_tomada + } : { + cachaca_ja_tomada: cachaca_ja_tomada + }} + ) + } catch (error) { + throw new Error(`Something wrong with server, ${error}`) + } + }, + + async addMoradorAoRankCachaca(morador: Omit) { + try { + const _database = await getDatabase() + return await _database + .collection('cachaca') + .insertOne(morador) + } catch (error) { + throw new Error(`Something wrong with server, ${error}`) + } + }, + +} + +export default CachacaRepository diff --git a/src/repository/moradorRepository.ts b/src/repository/moradorRepository.ts index 60ee48e..b9db82c 100644 --- a/src/repository/moradorRepository.ts +++ b/src/repository/moradorRepository.ts @@ -8,7 +8,6 @@ const MoradoresRepository = { async getAllMoradores(id?: ObjectId): Promise { try { const _database = await getDatabase() - const moradores = (await _database .collection('moradores') .find({ @@ -18,7 +17,7 @@ const MoradoresRepository = { ] }) .sort({ cachaca_ja_tomada: -1 }) - .toArray()) as Morador[]; + .toArray()) as Morador[] return moradores } catch (error) { @@ -27,41 +26,6 @@ const MoradoresRepository = { }, - async addCachaca(morador_id: string): Promise { - try { - const _database = await getDatabase() - // define uma nova cachaca para um morador - await _database.collection('moradores').updateOne( - { - _id: new ObjectId(morador_id), - }, - { $inc: { cachaca_para_tomar: 1 } } - ) - } catch (error) { - throw new Error(`Something wrong with server, ${error}`) - } - - }, - - async updateCachaca(morador_id: string, cachaca_ja_tomada: number, cachaca_para_tomar?: number) { - try { - const _database = await getDatabase() - await _database.collection('moradores').updateOne( - { _id: new ObjectId(morador_id) }, - { - $inc: cachaca_para_tomar ? { - cachaca_para_tomar: cachaca_para_tomar, - cachaca_ja_tomada: cachaca_ja_tomada - } : { - cachaca_ja_tomada: cachaca_ja_tomada - } - } - ) - } catch (error) { - throw new Error(`Something wrong with server, ${error}`) - } - }, - async getOneMorador(morador_id: string): Promise { try { const _database = await getDatabase() @@ -96,7 +60,6 @@ const MoradoresRepository = { } catch (error) { throw new Error(`Something wrong with server, ${error}`) } - }, async changePassword(name: string, new_password: string) { @@ -134,7 +97,53 @@ const MoradoresRepository = { } catch (error) { throw new Error(`Something wrong with database, ${error}`) } - } + }, + + async getAllMoradores_oficiais(){ + try { + const _database = await getDatabase() + + const moradores_oficiais = (await _database + .collection('moradores') + .find({ oficial: true}) + .toArray()) as Morador[] + + return moradores_oficiais + } catch (error) { + throw new Error(`Something wrong with server, ${error}`) + } + + }, + async updateEvolvesVeteran(morador_id:ObjectId) { + try{ + const _database = await getDatabase() + await _database + .collection('moradores') + .updateOne({ _id: morador_id }, { $set: {calouro: false}}) + }catch(error){ + throw new Error(`Something wrong with server, ${error}`) + } + }, + async upadteNotOfficial(morador_id:ObjectId) { + try{ + const _database = await getDatabase() + await _database + .collection('moradores') + .updateOne({ _id: morador_id }, { $set: {oficial: false}}) + }catch(error){ + throw new Error(`Something wrong with server, ${error}`) + } + }, + async upadteFormed(morador_id:ObjectId) { + try{ + const _database = await getDatabase() + await _database + .collection('moradores') + .updateOne({ _id: morador_id }, { $set: {formado: true}}) + }catch(error){ + throw new Error(`Something wrong with server, ${error}`) + } + }, } export default MoradoresRepository diff --git a/src/routes/index.ts b/src/routes/index.ts index 045049b..9a0f1c8 100644 --- a/src/routes/index.ts +++ b/src/routes/index.ts @@ -6,6 +6,8 @@ import MoradoresController from '../controller/moradorController' import SessionController from '../controller/sessionController' import CheckoutController from '../controller/checkoutController' import ProdutosController from '../controller/produtosController' +import CachacaController from '../controller/cachacaController' + import validateJWT from '../middleware/validateJWT' import upload from '../middleware/upload' @@ -42,5 +44,11 @@ route.post('/produtos/upload-file', upload('photo'), ProdutosController.uploadPr route.post('/webhooks', WebhookController.webhook) +route.post('/cachaca',CachacaController.createRank) +route.get('/cachaca',CachacaController.index) +// route.put('/cachaca',CachacaController.index) + + + export default route diff --git a/src/service/cachacaService.ts b/src/service/cachacaService.ts new file mode 100644 index 0000000..6fc041c --- /dev/null +++ b/src/service/cachacaService.ts @@ -0,0 +1,76 @@ +import CachacaRepository from '../repository/cachacaRepository' +import MoradoresRepository from '../repository/moradorRepository' +import Cachaca from '../models/cachaca' +import { ObjectId } from 'mongodb' + + +const cachacaService = { + + async addMoradorAoRank(ano: number) { + + const morador = await MoradoresRepository.getAllMoradores_oficiais() + if (!morador) { + throw new Error('User not found') + } + + for (const idMorador of morador) { + + if (!idMorador._id) throw new Error('There is no ID') + + // Verificar se já existe um registro para o morador no ano fornecido + const existente = await CachacaRepository.verificaRegistroExistente( idMorador._id, ano -1) + + if (!existente) { + + const toInsert = new Cachaca( + idMorador._id, + 0, + 0, + ano, + ) + await CachacaRepository.addMoradorAoRankCachaca(toInsert) + + } else { + + const toInsert = new Cachaca( + idMorador._id, + existente.cachaca_para_tomar, + 0, + ano + ) + await CachacaRepository.addMoradorAoRankCachaca(toInsert) + } + } + }, + + async verifyVeterano(ano: number){ + const morador = await MoradoresRepository.getAllMoradores_oficiais() + if (!morador) { + throw new Error('User not found') + } + // Verificar se já existe um registro para o morador no ano fornecido + for (const idMorador of morador) { + const existente = await CachacaRepository.verificaRegistroExistente( idMorador._id, ano -1) + if(existente){ + await MoradoresRepository.updateEvolvesVeteran(existente.morador_id) + } + } + }, + + async addCachacaMorador(morador_id:ObjectId) { + await CachacaRepository.addCachaca(morador_id) + + }, + async updateCachacaMorador(morador_id:ObjectId,cachaca_ja_tomada: number, cachaca_para_tomar?: number) { + await CachacaRepository.updateCachaca(morador_id,cachaca_ja_tomada,cachaca_para_tomar) + }, + async showRank(ano: number) { + const rank = await CachacaRepository.showRankMoradores(ano) + return rank + }, + + + +} + +export default cachacaService diff --git a/src/service/moradorService.ts b/src/service/moradorService.ts index 605e4c1..0305727 100644 --- a/src/service/moradorService.ts +++ b/src/service/moradorService.ts @@ -51,8 +51,10 @@ const MoradoresService = { morador.curso, morador.imagem, morador.instagram, + true, 0, - 0, + false, + true, returnHashString('123456') ) @@ -70,9 +72,11 @@ const MoradoresService = { morador.curso, morador.imagem, morador.instagram, + morador.oficial, + morador.total_cachaca, + morador.formado, + morador.calouro, // coisas que nao podem ser atualizadas por aqui - oldMorador.cachaca_para_tomar, - oldMorador.cachaca_ja_tomada, oldMorador.senha, oldMorador._id, )