diff --git a/backend/codiki-exposition/src/main/java/org/codiki/exposition/publication/PublicationController.java b/backend/codiki-exposition/src/main/java/org/codiki/exposition/publication/PublicationController.java index 7dd9560..0704bc0 100644 --- a/backend/codiki-exposition/src/main/java/org/codiki/exposition/publication/PublicationController.java +++ b/backend/codiki-exposition/src/main/java/org/codiki/exposition/publication/PublicationController.java @@ -1,29 +1,22 @@ package org.codiki.exposition.publication; +import org.codiki.application.publication.PublicationUseCases; +import org.codiki.domain.publication.exception.NoPublicationSearchResultException; +import org.codiki.domain.publication.exception.PublicationNotFoundException; +import org.codiki.domain.publication.model.Publication; +import org.codiki.domain.publication.model.PublicationEditionRequest; +import org.codiki.exposition.publication.model.PreviewContentRequest; +import org.codiki.exposition.publication.model.PreviewContentResponse; +import org.codiki.exposition.publication.model.PublicationDto; +import org.codiki.exposition.publication.model.PublicationEditionRequestDto; +import org.springframework.web.bind.annotation.*; + import java.util.List; import java.util.UUID; import static org.springframework.http.HttpStatus.CREATED; import static org.springframework.http.HttpStatus.NO_CONTENT; import static org.springframework.util.ObjectUtils.isEmpty; -import org.codiki.application.publication.PublicationUseCases; -import org.codiki.domain.publication.exception.NoPublicationSearchResultException; -import org.codiki.domain.publication.exception.PublicationNotFoundException; -import org.codiki.domain.publication.model.Publication; -import org.codiki.domain.publication.model.PublicationEditionRequest; -import org.codiki.exposition.publication.model.PreviewContentRequest; -import org.codiki.exposition.publication.model.PublicationDto; -import org.codiki.exposition.publication.model.PublicationEditionRequestDto; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.ResponseStatus; -import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("/api/publications") @@ -93,8 +86,9 @@ public class PublicationController { return publications; } - @PostMapping("/preview") - public String previewPublicationContent(@RequestBody PreviewContentRequest request) { - return publicationUseCases.previewContent(request.text()); + @PostMapping(value = "/preview") + public PreviewContentResponse previewPublicationContent(@RequestBody PreviewContentRequest request) { + String previewContent = publicationUseCases.previewContent(request.text()); + return new PreviewContentResponse(previewContent); } } diff --git a/backend/codiki-exposition/src/main/java/org/codiki/exposition/publication/model/PreviewContentResponse.java b/backend/codiki-exposition/src/main/java/org/codiki/exposition/publication/model/PreviewContentResponse.java new file mode 100644 index 0000000..afa69e7 --- /dev/null +++ b/backend/codiki-exposition/src/main/java/org/codiki/exposition/publication/model/PreviewContentResponse.java @@ -0,0 +1,5 @@ +package org.codiki.exposition.publication.model; + +public record PreviewContentResponse( + String text +) {} diff --git a/backend/rest-client-collection/Codiki/Publication/Preview content.bru b/backend/rest-client-collection/Codiki/Publication/Preview content.bru new file mode 100644 index 0000000..44009a7 --- /dev/null +++ b/backend/rest-client-collection/Codiki/Publication/Preview content.bru @@ -0,0 +1,21 @@ +meta { + name: Preview content + type: http + seq: 7 +} + +post { + url: {{url}}/api/publications/preview + body: json + auth: bearer +} + +auth:bearer { + token: {{bearerToken}} +} + +body:json { + { + "text" : "[h1]Test[/h1]" + } +} diff --git a/backend/rest-client-collection/Codiki/environments/localhost.bru b/backend/rest-client-collection/Codiki/environments/localhost.bru index 73a91db..e46e189 100644 --- a/backend/rest-client-collection/Codiki/environments/localhost.bru +++ b/backend/rest-client-collection/Codiki/environments/localhost.bru @@ -1,7 +1,7 @@ vars { url: http://localhost:8987 publicationId: ec76602f-5501-4091-868e-b471611e63de - bearerToken: eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiI1YWQ0NjJiOC04ZjllLTRhMjYtYmI4Ni1jNzRmZWY1ZDExYjYiLCJleHAiOjE3MTA4Mzc2ODQsInBzZXVkbyI6IlN0YW5kYXJkIHVzZXIiLCJlbWFpbCI6InN0YW5kYXJkLnVzZXJAY29kaWtpLm9yZyIsInJvbGVzIjoiU1RBTkRBUkQifQ.2HggC3T_4I14IpW02DZJiYfgYwc074kU8Y4AmuGf1mZzv0U8OUxpAw_xEhnKtn8NcaCozz_2vFv4o_CaBqS8Ag + bearerToken: eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJkMWQ1NTdhNi04OGIxLTQyNzQtOTk0ZS1mOWE5YTYwOTc5OTciLCJleHAiOjE3MjY5NTExNTgsInBob3RvSWQiOiI2MjhkYTFhNy0wNzAyLTRlNDktOGIwNi00ZDg2MGE2YTNkZTUiLCJwc2V1ZG8iOiJUYWtpZ3VjaGkiLCJlbWFpbCI6ImZsb3JpYW4udGhpZXJyeTcyQGdtYWlsLmNvbSIsInJvbGVzIjoiU1RBTkRBUkQifQ.4OQglB0cT2hTMO7_Bfxj7nQPYi42e0Gh06jmHj2q-SQTM6Md70Ii_BiKR__GxY14bahPAjLcIWfAYS2A0Tc1Vw categoryId: 172fa901-3f4b-4540-92f3-1c15820e8ec9 pictureId: 65b660b7-66bb-4e4a-a62c-fd0ca101f972 } diff --git a/frontend/src/app/components/publication-edition/publication-edition.component.html b/frontend/src/app/components/publication-edition/publication-edition.component.html index 7629a4e..439d537 100644 --- a/frontend/src/app/components/publication-edition/publication-edition.component.html +++ b/frontend/src/app/components/publication-edition/publication-edition.component.html @@ -86,7 +86,7 @@

{{ publication.title }}

{{ publication.description }}

-
+
} diff --git a/frontend/src/app/components/publication-edition/publication-edition.component.ts b/frontend/src/app/components/publication-edition/publication-edition.component.ts index 1fa1759..1aa2b8b 100644 --- a/frontend/src/app/components/publication-edition/publication-edition.component.ts +++ b/frontend/src/app/components/publication-edition/publication-edition.component.ts @@ -1,20 +1,20 @@ import { CommonModule, Location } from "@angular/common"; -import { Component, EventEmitter, inject, Input, OnChanges, OnDestroy, OnInit, Output } from "@angular/core"; +import { Component, EventEmitter, inject, Input, OnChanges, OnDestroy, Output } from "@angular/core"; import { FormBuilder, FormControl, FormGroup, ReactiveFormsModule, Validators } from "@angular/forms"; import { MatDialogModule } from "@angular/material/dialog"; import { MatIconModule } from "@angular/material/icon"; import { MatInputModule } from "@angular/material/input"; import { MatProgressSpinnerModule } from "@angular/material/progress-spinner"; +import { MatSelectModule } from "@angular/material/select"; import { MatTabsModule } from "@angular/material/tabs"; import { MatTooltipModule } from "@angular/material/tooltip"; -import { filter, map, Observable, of, Subscription } from "rxjs"; -import { Publication } from "../../core/rest-services/publications/model/publication"; -import { PictureSelectionDialog } from "./picture-selection-dialog/picture-selection-dialog.component"; -import { SubmitButtonComponent } from "../submit-button/submit-button.component"; -import { PublicationEditionService } from "./publication-edition.service"; -import { MatSelectModule } from "@angular/material/select"; -import { CategoryService } from "../../core/service/category.service"; +import { map, Observable, of, Subscription } from "rxjs"; import { Category } from "../../core/rest-services/category/model/category"; +import { Publication } from "../../core/rest-services/publications/model/publication"; +import { CategoryService } from "../../core/service/category.service"; +import { SubmitButtonComponent } from "../submit-button/submit-button.component"; +import { PictureSelectionDialog } from "./picture-selection-dialog/picture-selection-dialog.component"; +import { PublicationEditionService } from "./publication-edition.service"; @Component({ selector: 'app-publication-edition', @@ -46,11 +46,11 @@ export class PublicationEditionComponent implements OnChanges, OnDestroy { @Output() publicationSave = new EventEmitter(); + publicationInEdition!: Publication; private readonly categoryService = inject(CategoryService); private readonly formBuilder = inject(FormBuilder); private readonly location = inject(Location); private readonly publicationEditionService = inject(PublicationEditionService); - private publicationInEdition!: Publication; private subscriptions: Subscription[] = []; publicationEditionForm: FormGroup = this.formBuilder.group({ @@ -92,7 +92,7 @@ export class PublicationEditionComponent implements OnChanges, OnDestroy { } return 0; } - + ngOnChanges(): void { this.ngOnDestroy(); @@ -129,12 +129,13 @@ export class PublicationEditionComponent implements OnChanges, OnDestroy { this.subscriptions.push(categoryIdChangeSubscription); const publicationSubscription = this.publicationEditionService.state$.subscribe(state => { + console.log(state.publication.parsedText.substring(0, 15)); this.publicationInEdition = state.publication; - this.publicationEditionForm.controls['title'].setValue(this.publication.title, { emitEvent: false }); - this.publicationEditionForm.controls['description'].setValue(this.publication.description, { emitEvent: false }); - this.publicationEditionForm.controls['text'].setValue(this.publication.text, { emitEvent: false }); - this.publicationEditionForm.controls['illustrationId'].setValue(this.publication.illustrationId, { emitEvent: false }); - this.publicationEditionForm.controls['categoryId'].setValue(this.publication.categoryId, { emitEvent: false }); + this.publicationEditionForm.controls['title'].setValue(this.publicationInEdition.title, { emitEvent: false }); + this.publicationEditionForm.controls['description'].setValue(this.publicationInEdition.description, { emitEvent: false }); + this.publicationEditionForm.controls['text'].setValue(this.publicationInEdition.text, { emitEvent: false }); + this.publicationEditionForm.controls['illustrationId'].setValue(this.publicationInEdition.illustrationId, { emitEvent: false }); + this.publicationEditionForm.controls['categoryId'].setValue(this.publicationInEdition.categoryId, { emitEvent: false }); }); this.subscriptions.push(publicationSubscription); } diff --git a/frontend/src/app/components/publication-edition/publication-edition.service.ts b/frontend/src/app/components/publication-edition/publication-edition.service.ts index 92201a1..ef60523 100644 --- a/frontend/src/app/components/publication-edition/publication-edition.service.ts +++ b/frontend/src/app/components/publication-edition/publication-edition.service.ts @@ -9,6 +9,7 @@ import { PublicationRestService } from "../../core/rest-services/publications/pu import { copy } from "../../core/utils/ObjectUtils"; import { CodeBlockDialog } from "./code-block-dialog/code-block-dialog.component"; import { PictureSelectionDialog } from "./picture-selection-dialog/picture-selection-dialog.component"; +import { PreviewContentRequest } from "../../core/rest-services/publications/model/preview"; declare let Prism: any; @@ -76,7 +77,7 @@ export class PublicationEditionService implements OnDestroy { } private _save(state: PublicationEditionState): void { - this.stateSubject.next(state); + this.stateSubject.next(state); } get isLoading$(): Observable { @@ -268,9 +269,12 @@ export class PublicationEditionService implements OnDestroy { const state = this._state; this.isPreviewingSubject.next(true); - this.publicationRestService.preview(state.publication.text) - .then(parsedText => { - state.publication.parsedText = parsedText; + const request: PreviewContentRequest = { + text: state.publication.text + }; + this.publicationRestService.preview(request) + .then(response => { + state.publication.parsedText = response.text; this._save(state); setTimeout(() => Prism.highlightAll(), 1000); }) diff --git a/frontend/src/app/core/rest-services/publications/model/preview.ts b/frontend/src/app/core/rest-services/publications/model/preview.ts new file mode 100644 index 0000000..07b8314 --- /dev/null +++ b/frontend/src/app/core/rest-services/publications/model/preview.ts @@ -0,0 +1,7 @@ +export interface PreviewContentRequest { + text: string; +} + +export interface PreviewContentResponse { + text: string; +} \ No newline at end of file diff --git a/frontend/src/app/core/rest-services/publications/publication.rest-service.ts b/frontend/src/app/core/rest-services/publications/publication.rest-service.ts index e082a28..fc96878 100644 --- a/frontend/src/app/core/rest-services/publications/publication.rest-service.ts +++ b/frontend/src/app/core/rest-services/publications/publication.rest-service.ts @@ -2,6 +2,7 @@ import { HttpClient, HttpParams } from '@angular/common/http'; import { Injectable, inject } from '@angular/core'; import { last, lastValueFrom } from 'rxjs'; import { Publication } from './model/publication'; +import { PreviewContentRequest, PreviewContentResponse } from './model/preview'; @Injectable({ providedIn: 'root' @@ -31,9 +32,8 @@ export class PublicationRestService { return lastValueFrom(this.httpClient.get('/api/publications', { params })); } - preview(publicationText: string): Promise { - const request = { text: publicationText }; - return lastValueFrom(this.httpClient.post('/api/publications/preview', request)); + preview(request: PreviewContentRequest): Promise { + return lastValueFrom(this.httpClient.post('/api/publications/preview', request)); } delete(publicationId: string): Promise {