Skip to content

Commit

Permalink
Merge pull request #88 from MrSebastian/update-person
Browse files Browse the repository at this point in the history
Update person
  • Loading branch information
MrSebastian authored Mar 18, 2024
2 parents 2c31ba0 + 9d33f5b commit 756ea2b
Show file tree
Hide file tree
Showing 22 changed files with 259 additions and 2 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -12,4 +12,6 @@ public interface PersonDataAccessService {
void deletePerson(UUID id);

boolean personExists(UUID id);

void updatePerson(UUID id, PersonUpdateDao personUpdateDao);
}
Original file line number Diff line number Diff line change
@@ -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) {
}
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand All @@ -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);
}
Original file line number Diff line number Diff line change
@@ -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;
Expand Down Expand Up @@ -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));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand All @@ -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);
}
Original file line number Diff line number Diff line change
@@ -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;
Expand Down Expand Up @@ -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));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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);
}
}
Original file line number Diff line number Diff line change
@@ -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) {
}
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -12,4 +14,6 @@ public interface PersonMapper {
PersonDTO toDto(PersonDao entity);

PersonCreateDao toCreateDao(PersonCreateDTO createDTO);

PersonUpdateDao toUpdateDao(PersonUpdateDTO updateDTO);
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
:key="index"
:person="person"
@delete="handleDeleteRequest"
@edit="handleEditRequest"
/>
</v-list>
</template>
Expand All @@ -21,11 +22,16 @@ interface IProps {
const props = defineProps<IProps>();
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);
}
</script>

<style scoped></style>
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
<template #append>
<div>
<base-delete-icon-button @click="handleDeleteClicked" />
<base-edit-icon-button @click="handleEditClicked" />
</div>
</template>
</v-list-item>
Expand All @@ -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;
Expand All @@ -27,6 +29,7 @@ interface IProps {
const props = defineProps<IProps>();
const emit = defineEmits<{
(e: "delete", value: string): void;
(e: "edit", value: PersonPersisted): void;
}>();
const fullname = computed(
Expand All @@ -36,6 +39,10 @@ const fullname = computed(
function handleDeleteClicked() {
emit("delete", props.person.id);
}
function handleEditClicked() {
emit("edit", props.person);
}
</script>

<style scoped></style>
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
<template>
<v-dialog
v-model="dialogVisible"
:persistent="true"
width="400px"
>
<v-card>
<v-card-title>Person erstellen</v-card-title>
<v-card-text>
<v-form ref="refForm">
<base-person-fields :person="person" />
</v-form>
</v-card-text>
<v-card-actions>
<v-btn @click="handleCancelClicked">Abbrechen</v-btn>
<v-btn @click="handleSaveClicked">Erstellen</v-btn>
</v-card-actions>
</v-card>
</v-dialog>
</template>

<script setup lang="ts">
import type { SubmitEventPromise } from "vuetify";
import { computed, ref } from "vue";
import { useValidationUtils } from "@/composables/useValidationUtils";
import BasePersonFields from "@/features/person/components/BasePersonFields.vue";
import PersonPersisted from "@/features/person/types/PersonPersisted";
interface IProps {
modelValue: boolean;
person: PersonPersisted;
}
const props = withDefaults(defineProps<IProps>(), {
modelValue: false,
person: () => PersonPersisted.createDefault(),
});
const emit = defineEmits<{
(e: "update:modelValue", value: boolean): void;
(e: "edit", editedPerson: PersonPersisted): void;
}>();
const validationUtils = useValidationUtils();
const refForm = ref<HTMLFormElement>();
const dialogVisible = computed({
get: () => props.modelValue,
set: (value: boolean) => emit("update:modelValue", value),
});
function closeDialog(): void {
emit("update:modelValue", false);
resetForm();
}
function handleCancelClicked(): void {
closeDialog();
}
function handleSaveClicked(): void {
validationUtils
.proceedOnValid(refForm.value?.validate() as SubmitEventPromise)
.then(() => emit("edit", props.person));
}
function resetForm() {
refForm.value?.resetValidation();
}
</script>
Original file line number Diff line number Diff line change
Expand Up @@ -31,4 +31,10 @@ export default class PersonService {
deletePerson(personId: string): Promise<void> {
return this.personClient.deletePerson(personId);
}

updatePerson(updatedPerson: PersonPersisted): Promise<void> {
const body =
this.personMapper.persistedPersonToPersonUpdateDTO(updatedPerson);
return this.personClient.updatePerson(updatedPerson.id, body);
}
}
Original file line number Diff line number Diff line change
@@ -1,10 +1,13 @@
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<PersonDTO[]>;

createPerson(person: PersonCreateDTO): Promise<PersonDTO>;

deletePerson(id: string): Promise<void>;

updatePerson(id: string, person: PersonUpdateDTO): Promise<void>;
}
Original file line number Diff line number Diff line change
@@ -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";
Expand Down Expand Up @@ -29,8 +30,9 @@ export default class PersonClientLocalStorage implements PersonClientInterface {

deletePerson(id: string): Promise<void> {
const personsOfLocalStorage = this.getOrCreatePersonsOfLocalStorage();
const indexOfPersonToDelete = personsOfLocalStorage.findIndex(
(person) => person.id === id
const indexOfPersonToDelete = this.getIndexOfPersonById(
id,
personsOfLocalStorage
);
if (indexOfPersonToDelete !== -1) {
personsOfLocalStorage.splice(indexOfPersonToDelete);
Expand All @@ -40,6 +42,27 @@ export default class PersonClientLocalStorage implements PersonClientInterface {
return Promise.resolve();
}

updatePerson(id: string, person: PersonUpdateDTO): Promise<void> {
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<Person> {
let localStoragePersonsAsString = localStorage.getItem(
this.KEY_PERSON_ARRAY
Expand Down
Original file line number Diff line number Diff line change
@@ -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";

Expand All @@ -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;
}
}
Loading

0 comments on commit 756ea2b

Please sign in to comment.