From c6e17862938e0f0a21bd8a1c130a93c1eb4e0b27 Mon Sep 17 00:00:00 2001 From: geraldovictor <32902812+geraldovictor@users.noreply.github.com> Date: Tue, 14 Nov 2023 11:40:58 -0300 Subject: [PATCH] 50 sugerir pauta (#12) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Corrige docker para o windows Co-authored-by: Ricardo Loureiro Co-authored-by: Geraldo Victor * Adiciona componente de sugestão de pauta Co-authored-by: Ricardo Loureiro Co-authored-by: Geraldo Victor * Tela Sugestao de pauta Co-authored-by: VitoriaAquere Co-authored-by: Diego-Carlito * Adiciona service de e-mail Co-authored-by: Geraldo Victor Co-authored-by: Diego-Carlito * Integração do frontend com o backend Co-authored-by: Geraldo Victor Co-authored-by: Diego-Carlito * Descomenta código commitado por engano * Ajusta formatação e corrige requisição para endpoint do email * Corrige testes iniciais de criação de componentes Co-authored-by: VitoriaAquere * Adiciona componente de participação * Adiciona rota para a página de participação * Ajustes de formatação e validação * Adiciona indicação de que o email está sendo enviado * Adiciona modulo de rotas nos testes * Adiciona teste ao frontend * Adiciona e corrige testes ao componente de sugestão de agenda * Corrige code smells * Corrige url e nome de variável --------- Co-authored-by: Diego Carlito Co-authored-by: Ricardo Loureiro Co-authored-by: VitoriaAquere --- docker-compose.yml | 2 +- src/app/app-routing.module.ts | 4 + src/app/app.module.ts | 4 + .../background/background.component.html | 3 +- .../background/background.component.spec.ts | 4 +- src/app/environment/environment.ts | 3 +- .../login-social/login-social.component.css | 3 +- .../participate/participate.component.css | 25 ++++++ .../participate/participate.component.html | 9 ++ .../participate/participate.component.spec.ts | 25 ++++++ .../participate/participate.component.ts | 10 +++ .../suggest-agenda.component.css | 71 +++++++++++++++ .../suggest-agenda.component.html | 20 +++++ .../suggest-agenda.component.spec.ts | 89 +++++++++++++++++++ .../suggest-agenda.component.ts | 71 +++++++++++++++ .../video-viewer.component.spec.ts | 2 +- src/app/services/auth.service.spec.ts | 14 +-- src/app/services/auth.service.ts | 16 ++-- src/app/services/email.service.spec.ts | 19 ++++ src/app/services/email.service.ts | 18 ++++ .../user-token-interceptor.service.spec.ts | 2 +- src/app/services/user.service.spec.ts | 8 +- src/app/services/user.service.ts | 10 +-- src/app/services/video.service.spec.ts | 2 +- src/shared/model/email.model.ts | 24 +++++ 25 files changed, 426 insertions(+), 32 deletions(-) create mode 100644 src/app/pages/participate/participate.component.css create mode 100644 src/app/pages/participate/participate.component.html create mode 100644 src/app/pages/participate/participate.component.spec.ts create mode 100644 src/app/pages/participate/participate.component.ts create mode 100644 src/app/pages/suggest-agenda/suggest-agenda.component.css create mode 100644 src/app/pages/suggest-agenda/suggest-agenda.component.html create mode 100644 src/app/pages/suggest-agenda/suggest-agenda.component.spec.ts create mode 100644 src/app/pages/suggest-agenda/suggest-agenda.component.ts create mode 100644 src/app/services/email.service.spec.ts create mode 100644 src/app/services/email.service.ts create mode 100644 src/shared/model/email.model.ts diff --git a/docker-compose.yml b/docker-compose.yml index 709082f9..ba3d1d7f 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -11,4 +11,4 @@ services: volumes: - .:/unb-tv-web - /unb-tv-web/node_modules - command: ng serve --host 0 --port 4200 + command: ng serve --host 0 --port 4200 --poll 2000 diff --git a/src/app/app-routing.module.ts b/src/app/app-routing.module.ts index 31eca30f..b1f37e8b 100644 --- a/src/app/app-routing.module.ts +++ b/src/app/app-routing.module.ts @@ -12,6 +12,8 @@ import { CheckCodeRestPasswordComponent } from './pages/check-code-rest-password import { ResetPasswordComponent } from './pages/reset-password/reset-password.component'; import { AuthGuard } from './services/auth.guard'; import { EditUserComponent } from './pages/edit-user/edit-user.component'; +import { SuggestAgendaComponent } from './pages/suggest-agenda/suggest-agenda.component'; +import { ParticipateComponent } from './pages/participate/participate.component'; const routes: Routes = [ { path: 'login', component: LoginComponent }, @@ -22,6 +24,8 @@ const routes: Routes = [ { path: 'activeAccount', component: ActiveAccountComponent }, { path: 'sendCodeResetPassword', component: CheckCodeRestPasswordComponent }, { path: 'changePassword', component: ResetPasswordComponent }, + { path: 'suggestAgenda', component: SuggestAgendaComponent }, + { path: 'participate', component: ParticipateComponent }, { path: 'profile', component: ProfileComponent, canActivate: [AuthGuard], }, { path: 'editUser/:id', component: EditUserComponent, canActivate: [AuthGuard], }, { path: '', component: HomePageComponent, canActivate: [AuthGuard], } diff --git a/src/app/app.module.ts b/src/app/app.module.ts index 3d7a5c4e..85123e85 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -22,6 +22,8 @@ import { CheckCodeRestPasswordComponent } from './pages/check-code-rest-password import { AuthGuard } from './services/auth.guard'; import { AuthService } from './services/auth.service'; import { EditUserComponent } from './pages/edit-user/edit-user.component'; +import { SuggestAgendaComponent } from './pages/suggest-agenda/suggest-agenda.component'; +import { ParticipateComponent } from './pages/participate/participate.component'; @NgModule({ declarations: [ @@ -40,6 +42,8 @@ import { EditUserComponent } from './pages/edit-user/edit-user.component'; ResetPasswordComponent, CheckCodeRestPasswordComponent, EditUserComponent, + SuggestAgendaComponent, + ParticipateComponent, ], imports: [ BrowserModule, diff --git a/src/app/components/background/background.component.html b/src/app/components/background/background.component.html index a8cfbc76..530c9a93 100644 --- a/src/app/components/background/background.component.html +++ b/src/app/components/background/background.component.html @@ -8,7 +8,8 @@
Início
|
Agora na TV
|
Programação
| -
Transmissões
+
Transmissões
| +
Participe
hamburguer diff --git a/src/app/components/background/background.component.spec.ts b/src/app/components/background/background.component.spec.ts index c7ae10a4..53021daf 100644 --- a/src/app/components/background/background.component.spec.ts +++ b/src/app/components/background/background.component.spec.ts @@ -1,6 +1,7 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; import { BackgroundComponent } from './background.component'; +import { RouterTestingModule } from '@angular/router/testing'; describe('BackgroundComponent', () => { let component: BackgroundComponent; @@ -8,7 +9,8 @@ describe('BackgroundComponent', () => { beforeEach(async () => { await TestBed.configureTestingModule({ - declarations: [ BackgroundComponent ] + declarations: [ BackgroundComponent ], + imports: [RouterTestingModule] }) .compileComponents(); diff --git a/src/app/environment/environment.ts b/src/app/environment/environment.ts index e21e43da..6ed41a3c 100644 --- a/src/app/environment/environment.ts +++ b/src/app/environment/environment.ts @@ -1,4 +1,5 @@ export const EDUPLAY_CLIENT_KEY = "a1cdba06226408fcda63b49c50223c68d56005d234cc98bcdc1ae787d2b4de1d"; export const environment = { - apiURL: 'https://unb-tv-backend-2be1ed3a0485.herokuapp.com/api', + usersAPIURL: 'https://unb-tv-backend-2be1ed3a0485.herokuapp.com/api', + adminAPIURL: 'https://admin-unb-tv-2023-2-dc0dd53d3aca.herokuapp.com/api' }; diff --git a/src/app/pages/login-social/login-social.component.css b/src/app/pages/login-social/login-social.component.css index fcca13ed..807ed9e3 100644 --- a/src/app/pages/login-social/login-social.component.css +++ b/src/app/pages/login-social/login-social.component.css @@ -104,4 +104,5 @@ color: #0087C8; margin-left: -140px; margin-top: 18.5px -} \ No newline at end of file +} + diff --git a/src/app/pages/participate/participate.component.css b/src/app/pages/participate/participate.component.css new file mode 100644 index 00000000..2fe148f9 --- /dev/null +++ b/src/app/pages/participate/participate.component.css @@ -0,0 +1,25 @@ +.font-unb { + font-size: 13px; + font-family: "unb-pro", sans-serif; +} + +.containner h1 { + color: #0087C8; + font-size: 13px; + font-family: "unb-pro", sans-serif; + font-style: normal; + font-weight: 700; + line-height: 12.35px; + margin-left: 29px; + margin-top: 45px; + margin-bottom: 40px; + text-align: start; +} + +.containner { + width: 360px; + margin-left: auto; + margin-right: auto; + text-align: center; + height: -300px; +} \ No newline at end of file diff --git a/src/app/pages/participate/participate.component.html b/src/app/pages/participate/participate.component.html new file mode 100644 index 00000000..480da1f1 --- /dev/null +++ b/src/app/pages/participate/participate.component.html @@ -0,0 +1,9 @@ +
+

+ Sugira uma pauta +

+

+ Solicite uma transmissão +

+
+ diff --git a/src/app/pages/participate/participate.component.spec.ts b/src/app/pages/participate/participate.component.spec.ts new file mode 100644 index 00000000..4f87ffae --- /dev/null +++ b/src/app/pages/participate/participate.component.spec.ts @@ -0,0 +1,25 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ParticipateComponent } from './participate.component'; +import { RouterTestingModule } from '@angular/router/testing'; + +describe('ParticipateComponent', () => { + let component: ParticipateComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ ParticipateComponent ], + imports: [ RouterTestingModule ] + }) + .compileComponents(); + + fixture = TestBed.createComponent(ParticipateComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/pages/participate/participate.component.ts b/src/app/pages/participate/participate.component.ts new file mode 100644 index 00000000..4632bd98 --- /dev/null +++ b/src/app/pages/participate/participate.component.ts @@ -0,0 +1,10 @@ +import { Component } from '@angular/core'; + +@Component({ + selector: 'app-participate', + templateUrl: './participate.component.html', + styleUrls: ['./participate.component.css'] +}) +export class ParticipateComponent { + +} diff --git a/src/app/pages/suggest-agenda/suggest-agenda.component.css b/src/app/pages/suggest-agenda/suggest-agenda.component.css new file mode 100644 index 00000000..a1836637 --- /dev/null +++ b/src/app/pages/suggest-agenda/suggest-agenda.component.css @@ -0,0 +1,71 @@ + +.containner { + width: 360px; + margin-left: auto; + margin-right: auto; + text-align: center; + height: -300px; +} + +.containner h1 { + color: #0087C8; + font-size: 13px; + font-family: "unb-pro", sans-serif; + font-style: normal; + font-weight: 700; + line-height: 12.35px; + margin-left: 29px; + margin-top: 45px; + margin-bottom: 40px; + text-align: start; +} + +.first { + border: 0.15px solid #3C3C3B; + margin-left: 29px; + width: 330px; + border-radius: 9px; + height: 30px; + padding: 9px 0 10px 28px; +} + +form ::placeholder { + font-size: 13px; + font-family: "unb-pro", sans-serif; +} + +.descricao { + border: 0.15px solid #3C3C3B; + margin-left: 29px; + width: 330px; + border-radius: 9px; + height: 100px; + padding: 9px 0 10px 28px; +} + +.descricao::placeholder { + top: -35px; +} + +button { + background-color: #0087C8; + padding: 3px 33px 3px 33px; + border-radius: 9px; + margin-top: 7px; +} + +span { + color: white; + font-family: "unb-pro", sans-serif; + font-size: 13px; +} + +.input:focus { + outline: none !important; + border: 0.25px solid #00A550; +} + +.required-field { + outline: none !important; + border: 2px solid red; +} \ No newline at end of file diff --git a/src/app/pages/suggest-agenda/suggest-agenda.component.html b/src/app/pages/suggest-agenda/suggest-agenda.component.html new file mode 100644 index 00000000..53e492f6 --- /dev/null +++ b/src/app/pages/suggest-agenda/suggest-agenda.component.html @@ -0,0 +1,20 @@ +
+
+

Sugestão de Pautas

+
+ + + + + + + +
+ +
+
+
+
diff --git a/src/app/pages/suggest-agenda/suggest-agenda.component.spec.ts b/src/app/pages/suggest-agenda/suggest-agenda.component.spec.ts new file mode 100644 index 00000000..5c50eef8 --- /dev/null +++ b/src/app/pages/suggest-agenda/suggest-agenda.component.spec.ts @@ -0,0 +1,89 @@ +import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { FormBuilder, ReactiveFormsModule } from '@angular/forms'; +import { By } from '@angular/platform-browser'; +import { of, throwError } from 'rxjs'; +import { EmailService } from 'src/app/services/email.service'; +import { SuggestAgendaComponent } from './suggest-agenda.component'; + + +const mockData = "email has been sent" +class EmailServiceMock { + sendEmail() { + return of(mockData); + } +} + + +describe('SuggestAgendaComponent', () => { + let component: SuggestAgendaComponent; + let fixture: ComponentFixture; + let emailService: EmailService; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [SuggestAgendaComponent], + imports: [HttpClientTestingModule, + ReactiveFormsModule], + providers: [FormBuilder, { provide: EmailService, useValue: new EmailServiceMock() }] + }) + .compileComponents(); + + fixture = TestBed.createComponent(SuggestAgendaComponent); + component = fixture.componentInstance; + emailService = TestBed.inject(EmailService); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); + + it('should have a valid form on initialization', () => { + fixture.detectChanges(); + expect(component.suggestAgendaForm).toBeTruthy(); + }); + + it('should call suggestAgendaComponent method when the form is submitted', () => { + fixture.detectChanges(); + spyOn(component, 'sendSuggestAgenda').and.callThrough(); + const form = component.suggestAgendaForm; + form.setValue({ descricao: 'Descrição', responsavel: 'Usuário Teste', telefoneResponsavel: '999999999', tema: '', quando: '', local: '', emailContato: '' }); + + const submitButton = fixture.nativeElement.querySelector( + 'button[type="submit"]' + ); + submitButton.click(); + + expect(component.sendSuggestAgenda).toHaveBeenCalled(); + }); + + it('should call onRequiredFieldsChange when responsavel input value changes', () => { + fixture.detectChanges(); + spyOn(component, 'onRequiredFieldsChange'); + + const input = fixture.debugElement.query(By.css('input[name="responsavel"]')).nativeElement; + input.value = 'novo valor'; + input.dispatchEvent(new Event('change')); + + expect(component.onRequiredFieldsChange).toHaveBeenCalled(); + }); + + it('should call sendEmail', () => { + fixture.detectChanges(); + const mySpy = spyOn(emailService, 'sendEmail').and.callThrough(); + const form = component.suggestAgendaForm; + form.setValue({ descricao: 'Descrição', responsavel: 'Usuário Teste', telefoneResponsavel: '999999999', tema: '', quando: '', local: '', emailContato: '' }) + component.sendSuggestAgenda(); + expect(mySpy).toHaveBeenCalled(); + }); + + it('should call sendEmail and return an error', () => { + fixture.detectChanges(); + const mySpy = spyOn(emailService, 'sendEmail').and.returnValue(throwError(() => new Error('Erro'))); + const form = component.suggestAgendaForm; + form.setValue({ descricao: 'Descrição', responsavel: 'Usuário Teste', telefoneResponsavel: '999999999', tema: '', quando: '', local: '', emailContato: '' }) + component.sendSuggestAgenda(); + expect(mySpy).toHaveBeenCalled(); + }); + +}); diff --git a/src/app/pages/suggest-agenda/suggest-agenda.component.ts b/src/app/pages/suggest-agenda/suggest-agenda.component.ts new file mode 100644 index 00000000..e53faaf3 --- /dev/null +++ b/src/app/pages/suggest-agenda/suggest-agenda.component.ts @@ -0,0 +1,71 @@ +import { Component, OnInit } from '@angular/core'; +import { FormBuilder, FormGroup, Validators } from '@angular/forms'; +import { EmailService } from 'src/app/services/email.service'; +import { EmailData } from 'src/shared/model/email.model'; +import { HttpResponse, HttpErrorResponse } from '@angular/common/http'; + +@Component({ + selector: 'app-suggest-agenda', + templateUrl: './suggest-agenda.component.html', + styleUrls: ['./suggest-agenda.component.css'] +}) +export class SuggestAgendaComponent implements OnInit { + + suggestAgendaForm!: FormGroup; + isDescricaoFilled = false; + isResponsavelFilled = false; + isTelefoneFilled = false; + isSendingEmail = false; + + constructor( + private fb: FormBuilder, + private emailService: EmailService + ) { } + + ngOnInit(): void { + this.suggestAgendaForm = this.fb.group({ + tema: [''], + descricao: ['', [Validators.required]], + quando: [''], + local: [''], + responsavel: ['', [Validators.required]], + telefoneResponsavel: ['', [Validators.required]], + emailContato: [''], + }, + ); + } + + sendSuggestAgenda(): void { + if (this.suggestAgendaForm.valid) { + const emailData = new EmailData(); + emailData.tema = this.suggestAgendaForm.value.tema; + emailData.descricao = this.suggestAgendaForm.value.descricao; + emailData.local = this.suggestAgendaForm.value.local; + emailData.quando = this.suggestAgendaForm.value.quando; + emailData.responsavel = this.suggestAgendaForm.value.responsavel; + emailData.telefone_responsavel = this.suggestAgendaForm.value.telefoneResponsavel; + emailData.email_contato = this.suggestAgendaForm.value.emailContato; + const emailUnB = 'unbtv@unb.br'; + emailData.recipients = [emailUnB]; + this.isSendingEmail = true; + this.emailService.sendEmail(emailData).subscribe((res: HttpResponse) => { + alert('Sugestão enviada com sucesso'); + }, + (error: HttpErrorResponse) => { + alert('error: ' + error.message); + }, + () => { + this.isSendingEmail = false; + }); + } else { + alert('Preencha os campos obrigatórios!'); + } + } + + onRequiredFieldsChange(): void { + this.isDescricaoFilled = !!this.suggestAgendaForm.value.descricao; + this.isResponsavelFilled = !!this.suggestAgendaForm.value.responsavel; + this.isTelefoneFilled = !!this.suggestAgendaForm.value.telefoneResponsavel; + } + +} diff --git a/src/app/pages/video-viewer/video-viewer.component.spec.ts b/src/app/pages/video-viewer/video-viewer.component.spec.ts index 0fcedda5..e682490b 100644 --- a/src/app/pages/video-viewer/video-viewer.component.spec.ts +++ b/src/app/pages/video-viewer/video-viewer.component.spec.ts @@ -2,8 +2,8 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; import { HttpClientTestingModule } from '@angular/common/http/testing'; import { RouterTestingModule } from "@angular/router/testing"; import { VideoViewerComponent } from './video-viewer.component'; -import { VideoService } from '../../services/video.service'; import { SafePipe } from 'src/app/pipes/safe.pipe'; +import { VideoService } from 'src/app/services/video.service'; describe('VideoViewerComponent', () => { let component: VideoViewerComponent; diff --git a/src/app/services/auth.service.spec.ts b/src/app/services/auth.service.spec.ts index d4bec24a..cd99307a 100644 --- a/src/app/services/auth.service.spec.ts +++ b/src/app/services/auth.service.spec.ts @@ -30,7 +30,7 @@ describe('AuthService', () => { service.registerUser(userResponse).subscribe(res => { expect(res).toEqual(userResponse); }); - const req = httpMock.expectOne(`${service.apiURL}/auth/register`); + const req = httpMock.expectOne(`${service.usersAPIURL}/auth/register`); expect(req.request.method).toBe('POST'); req.flush(userResponse); }); @@ -44,7 +44,7 @@ describe('AuthService', () => { service.loginUser(userResponse).subscribe(res => { expect(res).toEqual(userResponse); }); - const req = httpMock.expectOne(`${service.apiURL}/auth/login`); + const req = httpMock.expectOne(`${service.usersAPIURL}/auth/login`); expect(req.request.method).toBe('POST'); req.flush(userResponse); }); @@ -57,7 +57,7 @@ describe('AuthService', () => { service.activeAccount(userResponse).subscribe(res => { expect(res).toEqual(userResponse); }); - const req = httpMock.expectOne(`${service.apiURL}/auth/activate-account`); + const req = httpMock.expectOne(`${service.usersAPIURL}/auth/activate-account`); expect(req.request.method).toBe('PATCH'); req.flush(userResponse); }); @@ -69,7 +69,7 @@ describe('AuthService', () => { service.resendCode(userResponse).subscribe(res => { expect(res).toEqual(userResponse); }); - const req = httpMock.expectOne(`${service.apiURL}/auth/resend-code`); + const req = httpMock.expectOne(`${service.usersAPIURL}/auth/resend-code`); expect(req.request.method).toBe('POST'); req.flush(userResponse); }); @@ -81,7 +81,7 @@ describe('AuthService', () => { service.sendEmailPassword(userResponse).subscribe(res => { expect(res).toEqual(userResponse); }); - const req = httpMock.expectOne(`${service.apiURL}/auth/reset-password/request`); + const req = httpMock.expectOne(`${service.usersAPIURL}/auth/reset-password/request`); expect(req.request.method).toBe('POST'); req.flush(userResponse); }); @@ -94,7 +94,7 @@ describe('AuthService', () => { service.verifyCodePassword(userResponse).subscribe(res => { expect(res).toEqual(userResponse); }); - const req = httpMock.expectOne(`${service.apiURL}/auth/reset-password/verify`); + const req = httpMock.expectOne(`${service.usersAPIURL}/auth/reset-password/verify`); expect(req.request.method).toBe('POST'); req.flush(userResponse); }); @@ -108,7 +108,7 @@ describe('AuthService', () => { service.updatePassword(userResponse).subscribe(res => { expect(res).toEqual(userResponse); }); - const req = httpMock.expectOne(`${service.apiURL}/auth/reset-password/change`); + const req = httpMock.expectOne(`${service.usersAPIURL}/auth/reset-password/change`); expect(req.request.method).toBe('PATCH'); req.flush(userResponse); }); diff --git a/src/app/services/auth.service.ts b/src/app/services/auth.service.ts index b94bb0cc..7f4a6a3a 100644 --- a/src/app/services/auth.service.ts +++ b/src/app/services/auth.service.ts @@ -8,36 +8,36 @@ import { Observable } from 'rxjs'; providedIn: 'root' }) export class AuthService { - public apiURL = environment.apiURL; + public usersAPIURL = environment.usersAPIURL; constructor(private http: HttpClient) { } registerUser(user: any): Observable { - return this.http.post(`${this.apiURL}/auth/register`, user); + return this.http.post(`${this.usersAPIURL}/auth/register`, user); } loginUser(user: any): Observable { - return this.http.post(`${this.apiURL}/auth/login`, user); + return this.http.post(`${this.usersAPIURL}/auth/login`, user); } activeAccount(emailCode: any): Observable { - return this.http.patch(`${this.apiURL}/auth/activate-account`, emailCode); + return this.http.patch(`${this.usersAPIURL}/auth/activate-account`, emailCode); } resendCode(email: any): Observable { - return this.http.post(`${this.apiURL}/auth/resend-code`, email); + return this.http.post(`${this.usersAPIURL}/auth/resend-code`, email); } sendEmailPassword(email: any): Observable { - return this.http.post(`${this.apiURL}/auth/reset-password/request`, email); + return this.http.post(`${this.usersAPIURL}/auth/reset-password/request`, email); } verifyCodePassword(info: any): Observable { - return this.http.post(`${this.apiURL}/auth/reset-password/verify`, info); + return this.http.post(`${this.usersAPIURL}/auth/reset-password/verify`, info); } updatePassword(user: any): Observable { - return this.http.patch(`${this.apiURL}/auth/reset-password/change`, user); + return this.http.patch(`${this.usersAPIURL}/auth/reset-password/change`, user); } isAuthenticated(): boolean { diff --git a/src/app/services/email.service.spec.ts b/src/app/services/email.service.spec.ts new file mode 100644 index 00000000..a47083aa --- /dev/null +++ b/src/app/services/email.service.spec.ts @@ -0,0 +1,19 @@ +import { TestBed } from '@angular/core/testing'; +import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { EmailService } from './email.service'; + +describe('EmailService', () => { + let service: EmailService; + + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule], + providers: [EmailService] + }); + service = TestBed.inject(EmailService); + }); + + it('should be created', () => { + expect(service).toBeTruthy(); + }); +}); diff --git a/src/app/services/email.service.ts b/src/app/services/email.service.ts new file mode 100644 index 00000000..fa91d33b --- /dev/null +++ b/src/app/services/email.service.ts @@ -0,0 +1,18 @@ +import { Injectable } from '@angular/core'; +import { HttpClient } from '@angular/common/http'; +import { Observable } from 'rxjs'; +import { IEmailData } from 'src/shared/model/email.model'; +import { environment } from '../environment/environment'; + +@Injectable({ + providedIn: 'root' +}) +export class EmailService { + private adminAPIUrl = environment.adminAPIURL + '/pauta/email'; // Ajuste conforme necessário + + constructor(private http: HttpClient) { } + + sendEmail(email: IEmailData): Observable { + return this.http.post(this.adminAPIUrl, email); + } +} \ No newline at end of file diff --git a/src/app/services/user-token-interceptor.service.spec.ts b/src/app/services/user-token-interceptor.service.spec.ts index 085d5581..3f520648 100644 --- a/src/app/services/user-token-interceptor.service.spec.ts +++ b/src/app/services/user-token-interceptor.service.spec.ts @@ -33,7 +33,7 @@ describe('TokenInterceptorService', () => { userService.getAllUsers().subscribe((res) => { expect(res).toBeTruthy(); }); - const req = httpMock.expectOne(`${userService.apiURL}/users`); + const req = httpMock.expectOne(`${userService.usersAPIURL}/users`); expect(req.request.headers.has('Authorization')).toEqual(true); }); }); diff --git a/src/app/services/user.service.spec.ts b/src/app/services/user.service.spec.ts index cc2d4167..9950ac52 100644 --- a/src/app/services/user.service.spec.ts +++ b/src/app/services/user.service.spec.ts @@ -30,7 +30,7 @@ describe('UserService', () => { expect(res).toEqual(userResponse); }); - const req = httpMock.expectOne(`${service.apiURL}/users/1`); + const req = httpMock.expectOne(`${service.usersAPIURL}/users/1`); expect(req.request.method).toBe('GET'); req.flush(userResponse); }); @@ -56,7 +56,7 @@ describe('UserService', () => { service.getAllUsers().subscribe(res => { expect(res).toEqual(userResponse); }); - const req = httpMock.expectOne(`${service.apiURL}/users`); + const req = httpMock.expectOne(`${service.usersAPIURL}/users`); expect(req.request.method).toBe('GET'); req.flush(userResponse); } @@ -74,7 +74,7 @@ describe('UserService', () => { service.updateUser(1, { "name": "Mario", "connection": "PROFESSOR", "email": "mario@gmail.com" }).subscribe(res => { expect(res).toEqual(userResponse); }); - const req = httpMock.expectOne(`${service.apiURL}/users/1`); + const req = httpMock.expectOne(`${service.usersAPIURL}/users/1`); expect(req.request.method).toBe('PATCH'); req.flush(userResponse); } @@ -92,7 +92,7 @@ describe('UserService', () => { service.deleteUser(1).subscribe(res => { expect(res).toEqual(userResponse); }); - const req = httpMock.expectOne(`${service.apiURL}/users/1`); + const req = httpMock.expectOne(`${service.usersAPIURL}/users/1`); expect(req.request.method).toBe('DELETE'); req.flush(userResponse); } diff --git a/src/app/services/user.service.ts b/src/app/services/user.service.ts index bb9279f9..4677ad41 100644 --- a/src/app/services/user.service.ts +++ b/src/app/services/user.service.ts @@ -7,23 +7,23 @@ import { Observable } from 'rxjs'; providedIn: 'root' }) export class UserService { - public apiURL = environment.apiURL; + public usersAPIURL = environment.usersAPIURL; constructor(private http: HttpClient) { } getUser(id: any): Observable { - return this.http.get(`${this.apiURL}/users/${id}`); + return this.http.get(`${this.usersAPIURL}/users/${id}`); } getAllUsers(): Observable { - return this.http.get(`${this.apiURL}/users`); + return this.http.get(`${this.usersAPIURL}/users`); } updateUser(id: any, body: any): Observable { - return this.http.patch(`${this.apiURL}/users/${id}`, body); + return this.http.patch(`${this.usersAPIURL}/users/${id}`, body); } deleteUser(id: any): Observable { - return this.http.delete(`${this.apiURL}/users/${id}`); + return this.http.delete(`${this.usersAPIURL}/users/${id}`); } } diff --git a/src/app/services/video.service.spec.ts b/src/app/services/video.service.spec.ts index 5230f2a5..84e13dd8 100644 --- a/src/app/services/video.service.spec.ts +++ b/src/app/services/video.service.spec.ts @@ -1,8 +1,8 @@ import { TestBed } from '@angular/core/testing'; import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing'; -import { VideoService } from './video.service'; import { EDUPLAY_API_URL, UNB_ID } from 'src/app/app.constant'; import { EDUPLAY_CLIENT_KEY } from '../environment/environment'; +import { VideoService } from './video.service'; describe('VideoService', () => { let service: VideoService; diff --git a/src/shared/model/email.model.ts b/src/shared/model/email.model.ts new file mode 100644 index 00000000..fa930695 --- /dev/null +++ b/src/shared/model/email.model.ts @@ -0,0 +1,24 @@ + +export interface IEmailData { + tema?: string; + descricao?: string; + quando?: string; + local?: string; + responsavel?: string; + telefone_responsavel?: string; + email_contato?: string; + recipients?: string[]; +} + +export class EmailData implements IEmailData { + constructor( + public tema?: string, + public descricao?: string, + public quando?: string, + public local?: string, + public responsavel?: string, + public telefone_responsavel?: string, + public email_contato?: string, + public recipients?: string[], + ) { } +} \ No newline at end of file