From e4f3eea5f1b73a19ae5388eebd56cd6583600db9 Mon Sep 17 00:00:00 2001 From: Sebastian <13592751+MrSebastian@users.noreply.github.com> Date: Mon, 18 Mar 2024 22:14:58 +0100 Subject: [PATCH 1/2] implement update person in backend --- .../person/dataaccess/PersonDataAccessService.java | 2 ++ .../backend/person/dataaccess/PersonUpdateDao.java | 8 ++++++++ .../dataaccess/document/PersonDocumentMapper.java | 5 +++++ .../dataaccess/document/PersonDocumentService.java | 13 +++++++++++++ .../dataaccess/entity/PersonEntityMapper.java | 5 +++++ .../person/dataaccess/entity/PersonSQLService.java | 13 +++++++++++++ .../backend/person/rest/PersonController.java | 7 +++++++ .../backend/person/rest/PersonUpdateDTO.java | 7 +++++++ .../backend/person/service/PersonMapper.java | 4 ++++ .../backend/person/service/PersonService.java | 6 ++++++ 10 files changed, 70 insertions(+) create mode 100644 backend/src/main/java/de/mrsebastian/todoappdemo/backend/person/dataaccess/PersonUpdateDao.java create mode 100644 backend/src/main/java/de/mrsebastian/todoappdemo/backend/person/rest/PersonUpdateDTO.java diff --git a/backend/src/main/java/de/mrsebastian/todoappdemo/backend/person/dataaccess/PersonDataAccessService.java b/backend/src/main/java/de/mrsebastian/todoappdemo/backend/person/dataaccess/PersonDataAccessService.java index 4c3c76c0..50f071d6 100644 --- a/backend/src/main/java/de/mrsebastian/todoappdemo/backend/person/dataaccess/PersonDataAccessService.java +++ b/backend/src/main/java/de/mrsebastian/todoappdemo/backend/person/dataaccess/PersonDataAccessService.java @@ -12,4 +12,6 @@ public interface PersonDataAccessService { void deletePerson(UUID id); boolean personExists(UUID id); + + void updatePerson(UUID id, PersonUpdateDao personUpdateDao); } diff --git a/backend/src/main/java/de/mrsebastian/todoappdemo/backend/person/dataaccess/PersonUpdateDao.java b/backend/src/main/java/de/mrsebastian/todoappdemo/backend/person/dataaccess/PersonUpdateDao.java new file mode 100644 index 00000000..197888bb --- /dev/null +++ b/backend/src/main/java/de/mrsebastian/todoappdemo/backend/person/dataaccess/PersonUpdateDao.java @@ -0,0 +1,8 @@ +package de.mrsebastian.todoappdemo.backend.person.dataaccess; + +import jakarta.validation.constraints.NotNull; +import lombok.Builder; + +@Builder +public record PersonUpdateDao(String firstname, String lastname, @NotNull String email) { +} diff --git a/backend/src/main/java/de/mrsebastian/todoappdemo/backend/person/dataaccess/document/PersonDocumentMapper.java b/backend/src/main/java/de/mrsebastian/todoappdemo/backend/person/dataaccess/document/PersonDocumentMapper.java index 8882eecf..957e4485 100644 --- a/backend/src/main/java/de/mrsebastian/todoappdemo/backend/person/dataaccess/document/PersonDocumentMapper.java +++ b/backend/src/main/java/de/mrsebastian/todoappdemo/backend/person/dataaccess/document/PersonDocumentMapper.java @@ -2,8 +2,10 @@ import de.mrsebastian.todoappdemo.backend.person.dataaccess.PersonCreateDao; import de.mrsebastian.todoappdemo.backend.person.dataaccess.PersonDao; +import de.mrsebastian.todoappdemo.backend.person.dataaccess.PersonUpdateDao; import org.mapstruct.Mapper; import org.mapstruct.Mapping; +import org.mapstruct.MappingTarget; @Mapper public interface PersonDocumentMapper { @@ -12,4 +14,7 @@ public interface PersonDocumentMapper { @Mapping(target = "id", ignore = true) PersonDocument toPersonDocument(PersonCreateDao personCreateDao); + + @Mapping(target = "id", ignore = true) + void updatePersonDocument(PersonUpdateDao personUpdateDao, @MappingTarget PersonDocument personDocument); } diff --git a/backend/src/main/java/de/mrsebastian/todoappdemo/backend/person/dataaccess/document/PersonDocumentService.java b/backend/src/main/java/de/mrsebastian/todoappdemo/backend/person/dataaccess/document/PersonDocumentService.java index 33be7f02..1dfc336e 100644 --- a/backend/src/main/java/de/mrsebastian/todoappdemo/backend/person/dataaccess/document/PersonDocumentService.java +++ b/backend/src/main/java/de/mrsebastian/todoappdemo/backend/person/dataaccess/document/PersonDocumentService.java @@ -1,9 +1,11 @@ package de.mrsebastian.todoappdemo.backend.person.dataaccess.document; import de.mrsebastian.todoappdemo.backend.configuration.Profiles; +import de.mrsebastian.todoappdemo.backend.exception.NotFoundException; import de.mrsebastian.todoappdemo.backend.person.dataaccess.PersonCreateDao; import de.mrsebastian.todoappdemo.backend.person.dataaccess.PersonDao; import de.mrsebastian.todoappdemo.backend.person.dataaccess.PersonDataAccessService; +import de.mrsebastian.todoappdemo.backend.person.dataaccess.PersonUpdateDao; import java.util.List; import java.util.UUID; import lombok.RequiredArgsConstructor; @@ -41,4 +43,15 @@ public void deletePerson(UUID id) { public boolean personExists(UUID id) { return repository.existsById(id); } + + @Override + public void updatePerson(UUID id, PersonUpdateDao personUpdateDao) { + val personToUpdate = getPersonOrThrow(id); + personDaoMapper.updatePersonDocument(personUpdateDao, personToUpdate); + repository.save(personToUpdate); + } + + private PersonDocument getPersonOrThrow(final UUID id) { + return repository.findById(id).orElseThrow(() -> new NotFoundException(id, PersonDocument.class)); + } } diff --git a/backend/src/main/java/de/mrsebastian/todoappdemo/backend/person/dataaccess/entity/PersonEntityMapper.java b/backend/src/main/java/de/mrsebastian/todoappdemo/backend/person/dataaccess/entity/PersonEntityMapper.java index f7e4483c..3d26833e 100644 --- a/backend/src/main/java/de/mrsebastian/todoappdemo/backend/person/dataaccess/entity/PersonEntityMapper.java +++ b/backend/src/main/java/de/mrsebastian/todoappdemo/backend/person/dataaccess/entity/PersonEntityMapper.java @@ -2,8 +2,10 @@ import de.mrsebastian.todoappdemo.backend.person.dataaccess.PersonCreateDao; import de.mrsebastian.todoappdemo.backend.person.dataaccess.PersonDao; +import de.mrsebastian.todoappdemo.backend.person.dataaccess.PersonUpdateDao; import org.mapstruct.Mapper; import org.mapstruct.Mapping; +import org.mapstruct.MappingTarget; @Mapper public interface PersonEntityMapper { @@ -12,4 +14,7 @@ public interface PersonEntityMapper { @Mapping(target = "id", ignore = true) Person toEntity(PersonCreateDao personCreateDao); + + @Mapping(target = "id", ignore = true) + void updateEntity(PersonUpdateDao personUpdateDao, @MappingTarget Person personEntity); } diff --git a/backend/src/main/java/de/mrsebastian/todoappdemo/backend/person/dataaccess/entity/PersonSQLService.java b/backend/src/main/java/de/mrsebastian/todoappdemo/backend/person/dataaccess/entity/PersonSQLService.java index eed7d7fb..ae2039da 100644 --- a/backend/src/main/java/de/mrsebastian/todoappdemo/backend/person/dataaccess/entity/PersonSQLService.java +++ b/backend/src/main/java/de/mrsebastian/todoappdemo/backend/person/dataaccess/entity/PersonSQLService.java @@ -1,9 +1,11 @@ package de.mrsebastian.todoappdemo.backend.person.dataaccess.entity; import de.mrsebastian.todoappdemo.backend.configuration.Profiles; +import de.mrsebastian.todoappdemo.backend.exception.NotFoundException; import de.mrsebastian.todoappdemo.backend.person.dataaccess.PersonCreateDao; import de.mrsebastian.todoappdemo.backend.person.dataaccess.PersonDao; import de.mrsebastian.todoappdemo.backend.person.dataaccess.PersonDataAccessService; +import de.mrsebastian.todoappdemo.backend.person.dataaccess.PersonUpdateDao; import java.util.List; import java.util.UUID; import lombok.RequiredArgsConstructor; @@ -38,4 +40,15 @@ public void deletePerson(UUID id) { public boolean personExists(UUID id) { return personRepository.existsById(id); } + + @Override + public void updatePerson(UUID id, PersonUpdateDao personUpdateDao) { + val personToUpdate = getPersonOrThrow(id); + sqlDaoMapper.updateEntity(personUpdateDao, personToUpdate); + personRepository.save(personToUpdate); + } + + private Person getPersonOrThrow(final UUID id) { + return personRepository.findById(id).orElseThrow(() -> new NotFoundException(id, Person.class)); + } } diff --git a/backend/src/main/java/de/mrsebastian/todoappdemo/backend/person/rest/PersonController.java b/backend/src/main/java/de/mrsebastian/todoappdemo/backend/person/rest/PersonController.java index b84d7224..4a19b376 100644 --- a/backend/src/main/java/de/mrsebastian/todoappdemo/backend/person/rest/PersonController.java +++ b/backend/src/main/java/de/mrsebastian/todoappdemo/backend/person/rest/PersonController.java @@ -9,6 +9,7 @@ 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.ResponseStatus; @@ -37,4 +38,10 @@ public PersonDTO createPerson(@Valid @RequestBody PersonCreateDTO personCreateDT public void deletePerson(@PathVariable("id") UUID personId) { personService.deletePerson(personId); } + + @PutMapping("{id}") + @ResponseStatus(HttpStatus.NO_CONTENT) + public void updatePerson(@PathVariable("id") UUID personId, @RequestBody PersonUpdateDTO personUpdateDTO) { + personService.updatePerson(personId, personUpdateDTO); + } } diff --git a/backend/src/main/java/de/mrsebastian/todoappdemo/backend/person/rest/PersonUpdateDTO.java b/backend/src/main/java/de/mrsebastian/todoappdemo/backend/person/rest/PersonUpdateDTO.java new file mode 100644 index 00000000..7cc8b1c5 --- /dev/null +++ b/backend/src/main/java/de/mrsebastian/todoappdemo/backend/person/rest/PersonUpdateDTO.java @@ -0,0 +1,7 @@ +package de.mrsebastian.todoappdemo.backend.person.rest; + +import jakarta.validation.constraints.Email; +import jakarta.validation.constraints.NotNull; + +public record PersonUpdateDTO(String firstname, String lastname, @NotNull @Email String email) { +} diff --git a/backend/src/main/java/de/mrsebastian/todoappdemo/backend/person/service/PersonMapper.java b/backend/src/main/java/de/mrsebastian/todoappdemo/backend/person/service/PersonMapper.java index 7409e1b9..3cb446af 100644 --- a/backend/src/main/java/de/mrsebastian/todoappdemo/backend/person/service/PersonMapper.java +++ b/backend/src/main/java/de/mrsebastian/todoappdemo/backend/person/service/PersonMapper.java @@ -2,8 +2,10 @@ import de.mrsebastian.todoappdemo.backend.person.dataaccess.PersonCreateDao; import de.mrsebastian.todoappdemo.backend.person.dataaccess.PersonDao; +import de.mrsebastian.todoappdemo.backend.person.dataaccess.PersonUpdateDao; import de.mrsebastian.todoappdemo.backend.person.rest.PersonCreateDTO; import de.mrsebastian.todoappdemo.backend.person.rest.PersonDTO; +import de.mrsebastian.todoappdemo.backend.person.rest.PersonUpdateDTO; import org.mapstruct.Mapper; @Mapper @@ -12,4 +14,6 @@ public interface PersonMapper { PersonDTO toDto(PersonDao entity); PersonCreateDao toCreateDao(PersonCreateDTO createDTO); + + PersonUpdateDao toUpdateDao(PersonUpdateDTO updateDTO); } diff --git a/backend/src/main/java/de/mrsebastian/todoappdemo/backend/person/service/PersonService.java b/backend/src/main/java/de/mrsebastian/todoappdemo/backend/person/service/PersonService.java index 9f0fb4d8..5b205d41 100644 --- a/backend/src/main/java/de/mrsebastian/todoappdemo/backend/person/service/PersonService.java +++ b/backend/src/main/java/de/mrsebastian/todoappdemo/backend/person/service/PersonService.java @@ -5,6 +5,7 @@ import de.mrsebastian.todoappdemo.backend.person.dataaccess.entity.Person; import de.mrsebastian.todoappdemo.backend.person.rest.PersonCreateDTO; import de.mrsebastian.todoappdemo.backend.person.rest.PersonDTO; +import de.mrsebastian.todoappdemo.backend.person.rest.PersonUpdateDTO; import de.mrsebastian.todoappdemo.backend.person.service.events.PersonDeleteEvent; import java.util.List; import java.util.UUID; @@ -43,4 +44,9 @@ public void existsOrThrow(final UUID personId) { throw new NotFoundException(personId, Person.class); } } + + public void updatePerson(final UUID personId, final PersonUpdateDTO personUpdateDTO) { + existsOrThrow(personId); + personDAService.updatePerson(personId, personMapper.toUpdateDao(personUpdateDTO)); + } } From 9d33f5b91854418f7a64a3600399ef8c56938467 Mon Sep 17 00:00:00 2001 From: Sebastian <13592751+MrSebastian@users.noreply.github.com> Date: Mon, 18 Mar 2024 22:15:50 +0100 Subject: [PATCH 2/2] implement update person in frontend --- .../person/components/BasePersonList.vue | 6 ++ .../person/components/BasePersonListItem.vue | 7 ++ .../components/ThePersonUpdateDialog.vue | 72 +++++++++++++++++++ .../features/person/services/PersonService.ts | 6 ++ .../services/api/PersonClientInterface.ts | 3 + .../localstorage/PersonClientLocalStorage.ts | 27 ++++++- .../api/impl/localstorage/PersonMapper.ts | 7 ++ .../api/impl/rest/PersonRestClient.ts | 8 +++ .../person/services/api/model/PersonMapper.ts | 9 +++ .../services/api/model/PersonUpdateDTO.ts | 7 ++ .../features/person/types/PersonPersisted.ts | 13 ++++ frontend/frontend/src/views/PersonView.vue | 26 +++++++ 12 files changed, 189 insertions(+), 2 deletions(-) create mode 100644 frontend/frontend/src/features/person/components/ThePersonUpdateDialog.vue create mode 100644 frontend/frontend/src/features/person/services/api/model/PersonUpdateDTO.ts diff --git a/frontend/frontend/src/features/person/components/BasePersonList.vue b/frontend/frontend/src/features/person/components/BasePersonList.vue index fe97e3be..e6431782 100644 --- a/frontend/frontend/src/features/person/components/BasePersonList.vue +++ b/frontend/frontend/src/features/person/components/BasePersonList.vue @@ -5,6 +5,7 @@ :key="index" :person="person" @delete="handleDeleteRequest" + @edit="handleEditRequest" /> @@ -21,11 +22,16 @@ interface IProps { const props = defineProps(); const emit = defineEmits<{ (e: "delete", value: string): void; + (e: "edit", value: PersonPersisted): void; }>(); function handleDeleteRequest(personIdToDelete: string) { emit("delete", personIdToDelete); } + +function handleEditRequest(personToEdit: PersonPersisted) { + emit("edit", personToEdit); +} diff --git a/frontend/frontend/src/features/person/components/BasePersonListItem.vue b/frontend/frontend/src/features/person/components/BasePersonListItem.vue index 914e7f41..30b8eaf2 100644 --- a/frontend/frontend/src/features/person/components/BasePersonListItem.vue +++ b/frontend/frontend/src/features/person/components/BasePersonListItem.vue @@ -8,6 +8,7 @@ @@ -19,6 +20,7 @@ import type PersonPersisted from "@/features/person/types/PersonPersisted"; import { computed } from "vue"; import BaseDeleteIconButton from "@/components/common/buttons/icon/BaseDeleteIconButton.vue"; +import BaseEditIconButton from "@/components/common/buttons/icon/BaseEditIconButton.vue"; interface IProps { person: PersonPersisted; @@ -27,6 +29,7 @@ interface IProps { const props = defineProps(); const emit = defineEmits<{ (e: "delete", value: string): void; + (e: "edit", value: PersonPersisted): void; }>(); const fullname = computed( @@ -36,6 +39,10 @@ const fullname = computed( function handleDeleteClicked() { emit("delete", props.person.id); } + +function handleEditClicked() { + emit("edit", props.person); +} diff --git a/frontend/frontend/src/features/person/components/ThePersonUpdateDialog.vue b/frontend/frontend/src/features/person/components/ThePersonUpdateDialog.vue new file mode 100644 index 00000000..39d6ecc0 --- /dev/null +++ b/frontend/frontend/src/features/person/components/ThePersonUpdateDialog.vue @@ -0,0 +1,72 @@ + + + diff --git a/frontend/frontend/src/features/person/services/PersonService.ts b/frontend/frontend/src/features/person/services/PersonService.ts index 28a201bc..8057f47f 100644 --- a/frontend/frontend/src/features/person/services/PersonService.ts +++ b/frontend/frontend/src/features/person/services/PersonService.ts @@ -31,4 +31,10 @@ export default class PersonService { deletePerson(personId: string): Promise { return this.personClient.deletePerson(personId); } + + updatePerson(updatedPerson: PersonPersisted): Promise { + const body = + this.personMapper.persistedPersonToPersonUpdateDTO(updatedPerson); + return this.personClient.updatePerson(updatedPerson.id, body); + } } diff --git a/frontend/frontend/src/features/person/services/api/PersonClientInterface.ts b/frontend/frontend/src/features/person/services/api/PersonClientInterface.ts index 4c4d0c8e..3c372491 100644 --- a/frontend/frontend/src/features/person/services/api/PersonClientInterface.ts +++ b/frontend/frontend/src/features/person/services/api/PersonClientInterface.ts @@ -1,5 +1,6 @@ import type PersonCreateDTO from "@/features/person/services/api/model/PersonCreateDTO"; import type PersonDTO from "@/features/person/services/api/model/PersonDTO"; +import type PersonUpdateDTO from "@/features/person/services/api/model/PersonUpdateDTO"; export interface PersonClientInterface { getPersonen(): Promise; @@ -7,4 +8,6 @@ export interface PersonClientInterface { createPerson(person: PersonCreateDTO): Promise; deletePerson(id: string): Promise; + + updatePerson(id: string, person: PersonUpdateDTO): Promise; } diff --git a/frontend/frontend/src/features/person/services/api/impl/localstorage/PersonClientLocalStorage.ts b/frontend/frontend/src/features/person/services/api/impl/localstorage/PersonClientLocalStorage.ts index 41133f00..ae542b5f 100644 --- a/frontend/frontend/src/features/person/services/api/impl/localstorage/PersonClientLocalStorage.ts +++ b/frontend/frontend/src/features/person/services/api/impl/localstorage/PersonClientLocalStorage.ts @@ -1,5 +1,6 @@ import type Person from "@/features/person/services/api/impl/localstorage/Person"; import type PersonCreateDTO from "@/features/person/services/api/model/PersonCreateDTO"; +import type PersonUpdateDTO from "@/features/person/services/api/model/PersonUpdateDTO"; import type { PersonClientInterface } from "@/features/person/services/api/PersonClientInterface"; import PersonMapper from "@/features/person/services/api/impl/localstorage/PersonMapper"; @@ -29,8 +30,9 @@ export default class PersonClientLocalStorage implements PersonClientInterface { deletePerson(id: string): Promise { const personsOfLocalStorage = this.getOrCreatePersonsOfLocalStorage(); - const indexOfPersonToDelete = personsOfLocalStorage.findIndex( - (person) => person.id === id + const indexOfPersonToDelete = this.getIndexOfPersonById( + id, + personsOfLocalStorage ); if (indexOfPersonToDelete !== -1) { personsOfLocalStorage.splice(indexOfPersonToDelete); @@ -40,6 +42,27 @@ export default class PersonClientLocalStorage implements PersonClientInterface { return Promise.resolve(); } + updatePerson(id: string, person: PersonUpdateDTO): Promise { + const personsOfLocalStorage = this.getOrCreatePersonsOfLocalStorage(); + const indexOfPersonToUpdate = this.getIndexOfPersonById( + id, + personsOfLocalStorage + ); + if (indexOfPersonToUpdate !== -1) { + this.personMapper.updatePerson( + personsOfLocalStorage[indexOfPersonToUpdate], + person + ); + this.saveAllPersons(personsOfLocalStorage); + } + + return Promise.resolve(); + } + + private getIndexOfPersonById(id: string, persons: Person[]): number { + return persons.findIndex((person) => person.id === id); + } + private getOrCreatePersonsOfLocalStorage(): Array { let localStoragePersonsAsString = localStorage.getItem( this.KEY_PERSON_ARRAY diff --git a/frontend/frontend/src/features/person/services/api/impl/localstorage/PersonMapper.ts b/frontend/frontend/src/features/person/services/api/impl/localstorage/PersonMapper.ts index 9b37ead7..a17143d7 100644 --- a/frontend/frontend/src/features/person/services/api/impl/localstorage/PersonMapper.ts +++ b/frontend/frontend/src/features/person/services/api/impl/localstorage/PersonMapper.ts @@ -1,4 +1,5 @@ import type PersonCreateDTO from "@/features/person/services/api/model/PersonCreateDTO"; +import type PersonUpdateDTO from "@/features/person/services/api/model/PersonUpdateDTO"; import { v4 as uuidv4 } from "uuid"; @@ -23,4 +24,10 @@ export default class PersonMapper { person.lastname ); } + + updatePerson(personToUpdate: Person, updateData: PersonUpdateDTO): void { + personToUpdate.email = updateData.email; + personToUpdate.firstname = updateData.firstname; + personToUpdate.lastname = updateData.lastname; + } } diff --git a/frontend/frontend/src/features/person/services/api/impl/rest/PersonRestClient.ts b/frontend/frontend/src/features/person/services/api/impl/rest/PersonRestClient.ts index 75a6bb0c..29e5d6e0 100644 --- a/frontend/frontend/src/features/person/services/api/impl/rest/PersonRestClient.ts +++ b/frontend/frontend/src/features/person/services/api/impl/rest/PersonRestClient.ts @@ -1,4 +1,5 @@ import type PersonCreateDTO from "@/features/person/services/api/model/PersonCreateDTO"; +import type PersonUpdateDTO from "@/features/person/services/api/model/PersonUpdateDTO"; import type { PersonClientInterface } from "@/features/person/services/api/PersonClientInterface"; import FetchUtils from "@/api/FetchUtils"; @@ -30,4 +31,11 @@ export default class PersonRestClient implements PersonClientInterface { FetchUtils.getDeletConfig() ); } + + updatePerson(id: string, person: PersonUpdateDTO): Promise { + return this.fetchUtils.doFetch( + `${API_BACKEND_BASE}${this.PATH_PERSON}/${id}`, + FetchUtils.getPUTConfig(person) + ); + } } diff --git a/frontend/frontend/src/features/person/services/api/model/PersonMapper.ts b/frontend/frontend/src/features/person/services/api/model/PersonMapper.ts index 4b6be2b2..00023564 100644 --- a/frontend/frontend/src/features/person/services/api/model/PersonMapper.ts +++ b/frontend/frontend/src/features/person/services/api/model/PersonMapper.ts @@ -2,6 +2,7 @@ import type PersonDTO from "@/features/person/services/api/model/PersonDTO"; import type Person from "@/features/person/types/Person"; import PersonCreateDTO from "@/features/person/services/api/model/PersonCreateDTO"; +import PersonUpdateDTO from "@/features/person/services/api/model/PersonUpdateDTO"; import PersonPersisted from "@/features/person/types/PersonPersisted"; export default class PersonMapper { @@ -21,4 +22,12 @@ export default class PersonMapper { person.lastname ); } + + persistedPersonToPersonUpdateDTO(person: PersonPersisted): PersonUpdateDTO { + return new PersonUpdateDTO( + person.email, + person.firstname, + person.lastname + ); + } } diff --git a/frontend/frontend/src/features/person/services/api/model/PersonUpdateDTO.ts b/frontend/frontend/src/features/person/services/api/model/PersonUpdateDTO.ts new file mode 100644 index 00000000..6bdd9924 --- /dev/null +++ b/frontend/frontend/src/features/person/services/api/model/PersonUpdateDTO.ts @@ -0,0 +1,7 @@ +export default class PersonUpdateDTO { + constructor( + public readonly email: string, + public readonly firstname?: string, + public readonly lastname?: string + ) {} +} diff --git a/frontend/frontend/src/features/person/types/PersonPersisted.ts b/frontend/frontend/src/features/person/types/PersonPersisted.ts index 55c6e92b..89324052 100644 --- a/frontend/frontend/src/features/person/types/PersonPersisted.ts +++ b/frontend/frontend/src/features/person/types/PersonPersisted.ts @@ -5,4 +5,17 @@ export default class PersonPersisted { public firstname?: string, //TODO possible null from backend public lastname?: string //TODO possible null from backend ) {} + + clone(): PersonPersisted { + return new PersonPersisted( + this.id, + this.email, + this.firstname, + this.lastname + ); + } + + static createDefault(): PersonPersisted { + return new PersonPersisted("", "", undefined, undefined); + } } diff --git a/frontend/frontend/src/views/PersonView.vue b/frontend/frontend/src/views/PersonView.vue index fb7fc9d8..36acae30 100644 --- a/frontend/frontend/src/views/PersonView.vue +++ b/frontend/frontend/src/views/PersonView.vue @@ -21,6 +21,7 @@ @@ -30,6 +31,12 @@ v-model="createDialogVisible" @added="handlePersonAdded" /> + + @@ -39,12 +46,15 @@ import { onMounted, ref } from "vue"; import BasePersonAddButton from "@/features/person/components/BasePersonAddButton.vue"; import BasePersonList from "@/features/person/components/BasePersonList.vue"; import ThePersonCreateDialog from "@/features/person/components/ThePersonCreateDialog.vue"; +import ThePersonUpdateDialog from "@/features/person/components/ThePersonUpdateDialog.vue"; import PersonService from "@/features/person/services/PersonService"; import PersonPersisted from "@/features/person/types/PersonPersisted"; const createDialogVisible = ref(false); const persons = ref>([]); const personService = new PersonService(); +const updateDialogVisible = ref(false); +const personToUpdate = ref(PersonPersisted.createDefault()); onMounted(() => { loadPersons(); @@ -62,6 +72,18 @@ function handlePersonAddClicked() { showPersonCreateDialog(); } +function handlePersonEditRequest(personToEdit: PersonPersisted) { + personToUpdate.value = personToEdit.clone(); + showPersonEditDialog(); +} + +function handlePersonUpdateAccepted(personUpdateData: PersonPersisted) { + personService + .updatePerson(personUpdateData) + .then(() => (updateDialogVisible.value = false)) + .then(() => loadPersons()); +} + function handleReloadClicked() { loadPersons(); } @@ -75,6 +97,10 @@ function loadPersons() { function showPersonCreateDialog() { createDialogVisible.value = true; } + +function showPersonEditDialog() { + updateDialogVisible.value = true; +}