Skip to content

Commit 3f4043e

Browse files
Merge pull request VitorCarvalho67#43 from Daniel-Alvarenga/main
Create extracurriculares routes
2 parents 52fb382 + f190f10 commit 3f4043e

File tree

12 files changed

+460
-25
lines changed

12 files changed

+460
-25
lines changed

ToDo.md

+21-3
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,23 @@
1-
## Client
2-
- [ ] aaaaaaa
1+
# Server
32

3+
## Aluno
4+
- [x] add extracurricular
5+
- [x] edit extracurricular
6+
- [x] exclude extracurricular
7+
- [ ] conversa professor
8+
- [ ] conversa empresa
9+
- [ ] exportar currículo
10+
- [ ] colocar o boletim
411

5-
## Server
12+
## Funcionário
13+
- [ ] classificar empresa como parceira
14+
- [ ] Ver empresas
15+
16+
## Professor
17+
- [ ] Mandar mensagem aluno
18+
19+
## Empresa
20+
21+
## Coordenador
22+
23+
## Admin

client/src/services/api/aluno.js

+19
Original file line numberDiff line numberDiff line change
@@ -374,4 +374,23 @@ function enterSockets(token){
374374
authorization: `${token}`
375375
}
376376
);
377+
}
378+
379+
export const sendBoletim = async (file, token) => {
380+
try {
381+
const formData = new FormData();
382+
formData.append('file', file);
383+
384+
385+
const response = await api.post('aluno/upload/boletim', formData, {
386+
headers: {
387+
authorization: `${token}`,
388+
'Content-Type': 'multipart/form-data'
389+
}
390+
});
391+
return response;
392+
} catch (error) {
393+
console.log("ARQUIVO: " + file);
394+
// return error.response.data;
395+
}
377396
}

client/src/views/aluno/Config.vue

+26-2
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,13 @@
3838
</div>
3939
</router-link>
4040
</div>
41+
<div class="inputUpload">
42+
<p>Anexo suas notas aqui enviando um boletim</p>
43+
<input type="file" ref="boletimInput">
44+
<button @click="sendBoletim" type="button">
45+
<img :src="imgVerificar">Salvar
46+
</button>
47+
</div>
4148
</div>
4249
</main>
4350
<Footer />
@@ -49,14 +56,16 @@ import Header from '../../components/Header.vue';
4956
import AsideDashboard from '../../components/aluno/AsideDashboard.vue'
5057
import Footer from '../../components/Footer.vue';
5158
52-
import router from '../../router/index.js'
53-
import Cookies from 'js-cookie';
5459
import {
5560
getCurriculo,
61+
sendBoletim
5662
} from '../../services/api/aluno';
5763
import {
5864
getImage,
5965
} from '../../services/api/shared';
66+
67+
import imgVerificar from '../../assets/icons/verificar.png';
68+
6069
import { mixinAluno } from '../../util/authMixins.js';
6170
6271
@@ -134,6 +143,21 @@ export default {
134143
console.log("Ops.. Algo deu errado ao recuperar a imagem de perfil. 😕\n" + error);
135144
}
136145
},
146+
async sendBoletim(){
147+
const file = this.$refs.boletimInput.files[0];
148+
if (!file) return;
149+
150+
const response = await sendBoletim(file, this.aluno.token);
151+
152+
if (response.status >= 200 && response.status < 300) {
153+
alert("Notas carregadas com sucesso! 😉");
154+
await this.getCurriculoAluno();
155+
} else {
156+
alert("Ops.. Algo deu errado ao enviar notas. 😕\n" + response.message);
157+
}
158+
159+
this.$refs.boletimInput.value = '';
160+
}
137161
},
138162
mixins: [mixinAluno],
139163
async created() {

server/.env.example

+3-1
Original file line numberDiff line numberDiff line change
@@ -10,4 +10,6 @@ URL="http://localhost:5173"
1010

1111
MINIO_END_POINT="localhost"
1212
MINIO_ACCESS_KEY="xxxxxxxxxxxxxxxxxxxx"
13-
MINIO_SECRET_KEY="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
13+
MINIO_SECRET_KEY="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
14+
15+
CAPTCHA2_ID="your_captcha2_token"

server/src/modules/controllers/alunoControllers.ts

+84-13
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { Request, Response } from 'express';
1+
import { Request, Response } from 'express';
22
import { ValidateAlunoUseCase } from '../services/aluno/ValidateAlunoUseCase';
33
import { CreateAlunoUseCase } from '../services/aluno/CreateAlunoUseCase';
44
import { LoginAlunoUseCase } from "../services/aluno/LoginAlunoUseCase";
@@ -18,15 +18,19 @@ import { GetLastMessagesUseCase } from '../services/shared/GetMessagesUseCase';
1818
import { EntidadeEnum, IdentificadorEnum } from '../interfaces/sharedDTOs';
1919
import { GetMessagesBetweenUseCase } from '../services/shared/GetChatUseCase';
2020
import { CreateMessageUseCase } from '../services/shared/CreateMessageUseCase';
21+
import { RegisterExtracurricularUseCase } from '../services/aluno/CreateExtraUseCase';
22+
import { EditExtracurricularUseCase } from '../services/aluno/EditExtraUsecase';
23+
import { ExcludeExtracurricularUseCase } from '../services/aluno/ExcludeExtraUseCase';
24+
import { SendBoletimUseCase } from '../services/aluno/SendBoletimUseCase';
2125

2226
export class CreateAlunoController {
2327
async handle(req: Request, res: Response) {
2428
const { name, email, password } = req.body;
25-
29+
2630
const createAlunoUseCase = new CreateAlunoUseCase();
27-
31+
2832
const result = await createAlunoUseCase.execute({ name, email, password });
29-
33+
3034
return res.status(201).json(result);
3135
}
3236
}
@@ -158,23 +162,23 @@ export class UploadImgProfileController {
158162
async handle(req: Request, res: Response) {
159163
const email = req.body.entidade.email;
160164
const file = req.file as Express.Multer.File;
161-
165+
162166
const uploadProfileUseCase = new UploadProfileUseCase();
163167

164-
const result = await uploadProfileUseCase.execute({email, file});
168+
const result = await uploadProfileUseCase.execute({ email, file });
165169

166170
return res.status(201).json(result);
167171
}
168172
}
169173

170174
export class UploadCapaController {
171175
async handle(req: Request, res: Response) {
172-
const email = req.body.entidade.email;
176+
const email = req.body.entidade.email;
173177
const file = req.file as Express.Multer.File;
174178

175179
const uploadCapaUseCase = new UploadCapaUseCase();
176180

177-
const result = await uploadCapaUseCase.execute({email, file});
181+
const result = await uploadCapaUseCase.execute({ email, file });
178182

179183
return res.status(201).json(result);
180184
}
@@ -194,7 +198,7 @@ export class ChangePassController {
194198

195199
export class GetLastMessagesController {
196200
async handle(req: Request, res: Response) {
197-
const email = req.body.entidade.email;
201+
const email = req.body.entidade.email;
198202
const identifier = "ALUNO" as IdentificadorEnum;
199203

200204
const getLastMessagesUseCase = new GetLastMessagesUseCase();
@@ -209,7 +213,7 @@ export class GetMessagesBetweenController {
209213
async handle(req: Request, res: Response) {
210214
const email1 = req.body.entidade.email as string;
211215
const identifier1 = "ALUNO" as EntidadeEnum;
212-
216+
213217
const email2 = req.query.email2 as string;
214218
const identifier2 = req.query.identifier2 as EntidadeEnum;
215219

@@ -230,12 +234,79 @@ export class CreateMessageController {
230234
const sender = req.body.entidade.email;
231235
const { message, recipient, senderIdentifier, recipientIdentifier } = req.body;
232236

233-
console.log
234-
235237
const createMessageUseCase = new CreateMessageUseCase();
236238

237239
const result = await createMessageUseCase.execute({ message, sender, recipient, senderIdentifier, recipientIdentifier });
238240

239241
return res.status(201).json(result);
240242
}
241-
}
243+
}
244+
245+
export class RegisterExtracurricularController {
246+
async handle(req: Request, res: Response) {
247+
const alunoId = req.body.entidade.id;
248+
const { instituicao, descricao, inicio, fim } = req.body;
249+
250+
const registerExtracurricularUseCase = new RegisterExtracurricularUseCase();
251+
252+
const result = await registerExtracurricularUseCase.execute({
253+
alunoId,
254+
instituicao,
255+
descricao,
256+
inicio,
257+
fim,
258+
});
259+
260+
return res.status(201).json(result);
261+
}
262+
}
263+
264+
export class EditExtracurricularController {
265+
async handle(req: Request, res: Response) {
266+
const { instituicao, descricao, inicio, fim } = req.body;
267+
const extracurricularId = req.body.extracurricularId;
268+
const alunoId = req.body.entidade.id;
269+
270+
const editExtracurricularUseCase = new EditExtracurricularUseCase();
271+
272+
const result = await editExtracurricularUseCase.execute({
273+
extracurricularId,
274+
alunoId,
275+
instituicao,
276+
descricao,
277+
inicio,
278+
fim,
279+
});
280+
281+
return res.status(200).json(result);
282+
}
283+
}
284+
285+
export class ExcludeExtracurricularController {
286+
async handle(req: Request, res: Response) {
287+
const extracurricularId = req.body.extracurricularId;
288+
const alunoId = req.body.entidade.id;
289+
290+
const excludeExtracurricularUseCase = new ExcludeExtracurricularUseCase();
291+
292+
const result = await excludeExtracurricularUseCase.execute({
293+
extracurricularId,
294+
alunoId,
295+
});
296+
297+
return res.status(200).json(result);
298+
}
299+
}
300+
301+
export class SendBoletimController {
302+
async handle(req: Request, res: Response) {
303+
const alunoId = req.body.entidade.id;
304+
const boletim = req.file as Express.Multer.File;
305+
306+
const sendBoletimUseCase = new SendBoletimUseCase();
307+
308+
const result = await sendBoletimUseCase.execute({ alunoId, boletim });
309+
310+
return res.status(201).json(result);
311+
}
312+
}

server/src/modules/interfaces/alunoDTOs.ts

+31-2
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import { Multer } from "multer"
2+
13
export interface ValidateAlunoDTO {
24
email: string,
35
token: string
@@ -44,17 +46,44 @@ export interface GetTurmasByCursoDTO {
4446
turno: Turno
4547
}
4648

47-
export interface UploadImageDTO{
49+
export interface UploadImageDTO {
4850
email: string,
4951
file: Express.Multer.File
5052
}
5153

52-
export interface UpdatePassDTO{
54+
export interface UpdatePassDTO {
5355
email: string,
5456
oldPass: string
5557
newPass: string
5658
}
5759

60+
export interface RegisterExtracurricularDTO {
61+
alunoId: string;
62+
instituicao: string;
63+
descricao: string;
64+
inicio: Date;
65+
fim: Date;
66+
}
67+
68+
export interface EditExtracurricularDTO {
69+
alunoId: string;
70+
extracurricularId: string;
71+
instituicao?: string;
72+
descricao?: string;
73+
inicio?: Date;
74+
fim?: Date;
75+
}
76+
77+
export interface ExcludeExtracurricularDTO {
78+
extracurricularId: string;
79+
alunoId: string;
80+
}
81+
82+
export interface SendNotasDTO {
83+
alunoId: string;
84+
boletim: Express.Multer.File
85+
}
86+
5887
export enum Turno {
5988
MANHA = "MANHA",
6089
TARDE = "TARDE",
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
import { RegisterExtracurricularDTO } from '../../interfaces/alunoDTOs';
2+
import { prisma } from "../../../prisma/client";
3+
import { AppError } from "../../../errors/error";
4+
5+
export class RegisterExtracurricularUseCase {
6+
async execute(data: RegisterExtracurricularDTO) {
7+
const { alunoId, instituicao, descricao, inicio, fim } = data;
8+
9+
if (!alunoId || !instituicao || !descricao || !inicio || !fim) {
10+
throw new AppError('Todos os campos são obrigatórios.');
11+
}
12+
13+
if (new Date(inicio) >= new Date(fim)) {
14+
throw new AppError('A data de início deve ser anterior à data de fim.');
15+
}
16+
17+
const aluno = await prisma.aluno.findUnique({
18+
where: { id: alunoId },
19+
});
20+
21+
if (!aluno) {
22+
throw new AppError('Aluno não encontrado.');
23+
}
24+
25+
const existingExtracurricular = await prisma.extracurricular.findFirst({
26+
where: {
27+
alunoId,
28+
descricao,
29+
},
30+
});
31+
32+
if (existingExtracurricular) {
33+
throw new AppError('Já existe uma atividade extracurricular com esta descrição para este aluno.');
34+
}
35+
36+
const extracurricular = await prisma.extracurricular.create({
37+
data: {
38+
alunoId,
39+
instituicao,
40+
descricao,
41+
inicio,
42+
fim,
43+
},
44+
});
45+
46+
return extracurricular;
47+
}
48+
}

0 commit comments

Comments
 (0)