From 34a938595861b89288eb336ce9ea99c18f4b5239 Mon Sep 17 00:00:00 2001 From: Maslyna Date: Sat, 22 Apr 2023 21:17:16 +0200 Subject: [PATCH 1/4] US2 COMPLETED! Created new PATCH edpoint (.../sponsors/id) --- .../sponsor/controller/SponsorController.java | 8 +++++ .../sponsor/model/dto/SponsorDTO.java | 4 +++ .../sponsor/service/SponsorService.java | 32 +++++++++++++++++-- 3 files changed, 42 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/provedcode/sponsor/controller/SponsorController.java b/src/main/java/com/provedcode/sponsor/controller/SponsorController.java index d6a59a0..ca6f58c 100644 --- a/src/main/java/com/provedcode/sponsor/controller/SponsorController.java +++ b/src/main/java/com/provedcode/sponsor/controller/SponsorController.java @@ -32,4 +32,12 @@ Page getSponsors(@RequestParam(value = "page") Optional pag SponsorDTO getSponsor(@PathVariable("id") long id, Authentication authentication) { return sponsorMapper.toDto(sponsorService.getSponsorById(id, authentication)); } + + @PreAuthorize("hasRole('SPONSOR')") + @PatchMapping("/sponsors/{id}") + SponsorDTO editSponsor(@PathVariable("id") long id, + @RequestBody SponsorDTO sponsorDTO, + Authentication authentication) { + return sponsorMapper.toDto(sponsorService.editSponsorById(id, sponsorDTO, authentication)); + } } \ No newline at end of file diff --git a/src/main/java/com/provedcode/sponsor/model/dto/SponsorDTO.java b/src/main/java/com/provedcode/sponsor/model/dto/SponsorDTO.java index e01235b..adffbbd 100644 --- a/src/main/java/com/provedcode/sponsor/model/dto/SponsorDTO.java +++ b/src/main/java/com/provedcode/sponsor/model/dto/SponsorDTO.java @@ -1,8 +1,12 @@ package com.provedcode.sponsor.model.dto; +import com.fasterxml.jackson.annotation.JsonProperty; + public record SponsorDTO( Long id, + @JsonProperty("first_name") String firstName, + @JsonProperty("last_name") String lastName, String image ) { diff --git a/src/main/java/com/provedcode/sponsor/service/SponsorService.java b/src/main/java/com/provedcode/sponsor/service/SponsorService.java index 4ec1dd1..b90df23 100644 --- a/src/main/java/com/provedcode/sponsor/service/SponsorService.java +++ b/src/main/java/com/provedcode/sponsor/service/SponsorService.java @@ -1,6 +1,7 @@ package com.provedcode.sponsor.service; import com.provedcode.config.PageProperties; +import com.provedcode.sponsor.model.dto.SponsorDTO; import com.provedcode.sponsor.model.entity.Sponsor; import com.provedcode.sponsor.repository.SponsorRepository; import com.provedcode.user.model.entity.UserInfo; @@ -10,6 +11,7 @@ import org.springframework.data.domain.PageRequest; import org.springframework.security.core.Authentication; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import org.springframework.web.server.ResponseStatusException; import java.util.Optional; @@ -18,11 +20,13 @@ @Service @AllArgsConstructor +@Transactional public class SponsorService { PageProperties pageProperties; SponsorRepository sponsorRepository; UserInfoRepository userInfoRepository; + @Transactional(readOnly = true) public Page getAllSponsors(Optional page, Optional size) { if (page.orElse(pageProperties.defaultPageNum()) < 0) { throw new ResponseStatusException(BAD_REQUEST, "'page' query parameter must be greater than or equal to 0"); @@ -31,16 +35,40 @@ public Page getAllSponsors(Optional page, Optional si throw new ResponseStatusException(BAD_REQUEST, "'size' query parameter must be greater than or equal to 1"); } return sponsorRepository.findAll(PageRequest.of(page.orElse(pageProperties.defaultPageNum()), - size.orElse(pageProperties.defaultPageSize()))); + size.orElse(pageProperties.defaultPageSize()))); } + @Transactional(readOnly = true) public Sponsor getSponsorById(long id, Authentication authentication) { Sponsor sponsor = sponsorRepository.findById(id).orElseThrow( () -> new ResponseStatusException(NOT_FOUND, String.format("sponsor with id = %d not found", id))); - UserInfo user = userInfoRepository.findByLogin(authentication.getName()).orElseThrow(); + UserInfo user = userInfoRepository.findByLogin(authentication.getName()) + .orElseThrow(() -> new ResponseStatusException(NOT_IMPLEMENTED, "login is not valid")); if (!sponsor.getId().equals(user.getSponsor().getId())) throw new ResponseStatusException(FORBIDDEN, "The user cannot view someone else's profile"); return sponsor; } + + public Sponsor editSponsorById(long id, SponsorDTO sponsorDTO, Authentication authentication) { + Sponsor sponsor = sponsorRepository.findById(id) + .orElseThrow(() -> new ResponseStatusException(NOT_FOUND, "sponsor with id = %s not found".formatted(id))); + UserInfo user = userInfoRepository.findByLogin(authentication.getName()) + .orElseThrow(() -> new ResponseStatusException(NOT_IMPLEMENTED, "login is not valid")); + + if (!sponsor.getId().equals(user.getSponsor().getId())) { + throw new ResponseStatusException(FORBIDDEN, "The user cannot view someone else's profile"); + } + + if (sponsorDTO.firstName() != null) { + sponsor.setFirstName(sponsorDTO.firstName()); + } + if (sponsorDTO.lastName() != null) { + sponsor.setLastName(sponsorDTO.lastName()); + } + if (sponsorDTO.image() != null) { + sponsor.setImage(sponsorDTO.image()); + } + return sponsorRepository.save(sponsor); + } } \ No newline at end of file From 1574bbdb0329ca4dc873a7c6dbbad366aaaf4e3f Mon Sep 17 00:00:00 2001 From: Maslyna Date: Sat, 22 Apr 2023 21:47:17 +0200 Subject: [PATCH 2/4] US2 COMPLETED 2nd TIME, YAY! --- .../sponsor/controller/SponsorController.java | 6 ++-- .../sponsor/model/dto/SponsorEditDTO.java | 17 ++++++++++ .../sponsor/service/SponsorService.java | 34 +++++++++++++++---- 3 files changed, 48 insertions(+), 9 deletions(-) create mode 100644 src/main/java/com/provedcode/sponsor/model/dto/SponsorEditDTO.java diff --git a/src/main/java/com/provedcode/sponsor/controller/SponsorController.java b/src/main/java/com/provedcode/sponsor/controller/SponsorController.java index ca6f58c..3935761 100644 --- a/src/main/java/com/provedcode/sponsor/controller/SponsorController.java +++ b/src/main/java/com/provedcode/sponsor/controller/SponsorController.java @@ -2,6 +2,7 @@ import com.provedcode.sponsor.mapper.SponsorMapper; import com.provedcode.sponsor.model.dto.SponsorDTO; +import com.provedcode.sponsor.model.dto.SponsorEditDTO; import com.provedcode.sponsor.service.SponsorService; import com.provedcode.talent.model.dto.FullTalentDTO; import lombok.AllArgsConstructor; @@ -36,8 +37,9 @@ SponsorDTO getSponsor(@PathVariable("id") long id, Authentication authentication @PreAuthorize("hasRole('SPONSOR')") @PatchMapping("/sponsors/{id}") SponsorDTO editSponsor(@PathVariable("id") long id, - @RequestBody SponsorDTO sponsorDTO, + @RequestBody SponsorEditDTO sponsorEditDTO, Authentication authentication) { - return sponsorMapper.toDto(sponsorService.editSponsorById(id, sponsorDTO, authentication)); + return sponsorMapper.toDto(sponsorService.editSponsorById(id, sponsorEditDTO, authentication)); } + } \ No newline at end of file diff --git a/src/main/java/com/provedcode/sponsor/model/dto/SponsorEditDTO.java b/src/main/java/com/provedcode/sponsor/model/dto/SponsorEditDTO.java new file mode 100644 index 0000000..82867a5 --- /dev/null +++ b/src/main/java/com/provedcode/sponsor/model/dto/SponsorEditDTO.java @@ -0,0 +1,17 @@ +package com.provedcode.sponsor.model.dto; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Builder; + +@Builder +public record SponsorEditDTO( + Long id, + @JsonProperty("first_name") + String firstName, + @JsonProperty("last_name") + String lastName, + String image, + @JsonProperty("count_of_kudos") + Long countOfKudos +) { +} diff --git a/src/main/java/com/provedcode/sponsor/service/SponsorService.java b/src/main/java/com/provedcode/sponsor/service/SponsorService.java index b90df23..912adf1 100644 --- a/src/main/java/com/provedcode/sponsor/service/SponsorService.java +++ b/src/main/java/com/provedcode/sponsor/service/SponsorService.java @@ -1,7 +1,10 @@ package com.provedcode.sponsor.service; import com.provedcode.config.PageProperties; +import com.provedcode.kudos.model.entity.Kudos; +import com.provedcode.kudos.repository.KudosRepository; import com.provedcode.sponsor.model.dto.SponsorDTO; +import com.provedcode.sponsor.model.dto.SponsorEditDTO; import com.provedcode.sponsor.model.entity.Sponsor; import com.provedcode.sponsor.repository.SponsorRepository; import com.provedcode.user.model.entity.UserInfo; @@ -14,7 +17,10 @@ import org.springframework.transaction.annotation.Transactional; import org.springframework.web.server.ResponseStatusException; +import java.util.List; import java.util.Optional; +import java.util.stream.Collectors; +import java.util.stream.IntStream; import static org.springframework.http.HttpStatus.*; @@ -25,6 +31,7 @@ public class SponsorService { PageProperties pageProperties; SponsorRepository sponsorRepository; UserInfoRepository userInfoRepository; + private final KudosRepository kudosRepository; @Transactional(readOnly = true) public Page getAllSponsors(Optional page, Optional size) { @@ -50,7 +57,7 @@ public Sponsor getSponsorById(long id, Authentication authentication) { return sponsor; } - public Sponsor editSponsorById(long id, SponsorDTO sponsorDTO, Authentication authentication) { + public Sponsor editSponsorById(long id, SponsorEditDTO sponsorEditDTO, Authentication authentication) { Sponsor sponsor = sponsorRepository.findById(id) .orElseThrow(() -> new ResponseStatusException(NOT_FOUND, "sponsor with id = %s not found".formatted(id))); UserInfo user = userInfoRepository.findByLogin(authentication.getName()) @@ -60,14 +67,27 @@ public Sponsor editSponsorById(long id, SponsorDTO sponsorDTO, Authentication au throw new ResponseStatusException(FORBIDDEN, "The user cannot view someone else's profile"); } - if (sponsorDTO.firstName() != null) { - sponsor.setFirstName(sponsorDTO.firstName()); + if (sponsorEditDTO.firstName() != null) { + sponsor.setFirstName(sponsorEditDTO.firstName()); } - if (sponsorDTO.lastName() != null) { - sponsor.setLastName(sponsorDTO.lastName()); + if (sponsorEditDTO.lastName() != null) { + sponsor.setLastName(sponsorEditDTO.lastName()); } - if (sponsorDTO.image() != null) { - sponsor.setImage(sponsorDTO.image()); + if (sponsorEditDTO.image() != null) { + sponsor.setImage(sponsorEditDTO.image()); + } + if (sponsorEditDTO.countOfKudos() != null) { + if (sponsorEditDTO.countOfKudos() > 0) { + List kudosList = IntStream.iterate(0, i -> i < sponsorEditDTO.countOfKudos(), i -> i + 1).boxed() + .map(i -> Kudos.builder() + .sponsor(sponsor) + .build()) + .toList(); + kudosRepository.saveAll(kudosList); + sponsor.getKudoses().addAll(kudosList); + } else { + throw new ResponseStatusException(BAD_REQUEST, "count of kudos must be greater than 0"); + } } return sponsorRepository.save(sponsor); } From 31b04475e66ce48a6adecbdb31916e62e3f1ac35 Mon Sep 17 00:00:00 2001 From: Maslyna Date: Sat, 22 Apr 2023 23:12:36 +0200 Subject: [PATCH 3/4] created unworking delete method --- .../sponsor/controller/SponsorController.java | 6 +++ .../sponsor/service/SponsorService.java | 14 ++++++- .../db/changelog/changeset/create-tables.sql | 39 ++++++++++--------- 3 files changed, 39 insertions(+), 20 deletions(-) diff --git a/src/main/java/com/provedcode/sponsor/controller/SponsorController.java b/src/main/java/com/provedcode/sponsor/controller/SponsorController.java index 3935761..4e94b9d 100644 --- a/src/main/java/com/provedcode/sponsor/controller/SponsorController.java +++ b/src/main/java/com/provedcode/sponsor/controller/SponsorController.java @@ -42,4 +42,10 @@ SponsorDTO editSponsor(@PathVariable("id") long id, return sponsorMapper.toDto(sponsorService.editSponsorById(id, sponsorEditDTO, authentication)); } + @PreAuthorize("hasRole('SPONSOR')") + @DeleteMapping("/sponsors/{id}") + void deleteSponsor(@PathVariable("id") long id, Authentication authentication) { + sponsorService.deleteSponsor(id, authentication); + } + } \ No newline at end of file diff --git a/src/main/java/com/provedcode/sponsor/service/SponsorService.java b/src/main/java/com/provedcode/sponsor/service/SponsorService.java index 912adf1..32bf6bb 100644 --- a/src/main/java/com/provedcode/sponsor/service/SponsorService.java +++ b/src/main/java/com/provedcode/sponsor/service/SponsorService.java @@ -62,9 +62,8 @@ public Sponsor editSponsorById(long id, SponsorEditDTO sponsorEditDTO, Authentic .orElseThrow(() -> new ResponseStatusException(NOT_FOUND, "sponsor with id = %s not found".formatted(id))); UserInfo user = userInfoRepository.findByLogin(authentication.getName()) .orElseThrow(() -> new ResponseStatusException(NOT_IMPLEMENTED, "login is not valid")); - if (!sponsor.getId().equals(user.getSponsor().getId())) { - throw new ResponseStatusException(FORBIDDEN, "The user cannot view someone else's profile"); + throw new ResponseStatusException(FORBIDDEN, "The user cannot edit someone else's profile"); } if (sponsorEditDTO.firstName() != null) { @@ -91,4 +90,15 @@ public Sponsor editSponsorById(long id, SponsorEditDTO sponsorEditDTO, Authentic } return sponsorRepository.save(sponsor); } + + public void deleteSponsor(long id, Authentication authentication) { + Sponsor sponsor = sponsorRepository.findById(id) + .orElseThrow(() -> new ResponseStatusException(NOT_FOUND, "sponsor with id = %s not found".formatted(id))); + UserInfo user = userInfoRepository.findByLogin(authentication.getName()) + .orElseThrow(() -> new ResponseStatusException(NOT_IMPLEMENTED, "login is not valid")); + if (!sponsor.getId().equals(user.getSponsor().getId())) { + throw new ResponseStatusException(FORBIDDEN, "The user cannot edit someone else's profile"); + } + userInfoRepository.delete(user); + } } \ No newline at end of file diff --git a/src/main/resources/db/changelog/changeset/create-tables.sql b/src/main/resources/db/changelog/changeset/create-tables.sql index 40927c3..9324bd4 100644 --- a/src/main/resources/db/changelog/changeset/create-tables.sql +++ b/src/main/resources/db/changelog/changeset/create-tables.sql @@ -88,30 +88,33 @@ CREATE TABLE user_authorities ); drop table if exists user_info cascade; -CREATE TABLE user_info ( - id BIGINT GENERATED BY DEFAULT AS IDENTITY NOT NULL, - talent_id BIGINT, - sponsor_id BIGINT, - login VARCHAR(100) NOT NULL, - password VARCHAR(255) NOT NULL, - CONSTRAINT pk_user_info PRIMARY KEY (id) +CREATE TABLE user_info +( + id BIGINT GENERATED BY DEFAULT AS IDENTITY NOT NULL, + talent_id BIGINT, + sponsor_id BIGINT, + login VARCHAR(100) NOT NULL, + password VARCHAR(255) NOT NULL, + CONSTRAINT pk_user_info PRIMARY KEY (id) ); drop table if exists kudos cascade; -CREATE TABLE kudos ( - id BIGINT GENERATED BY DEFAULT AS IDENTITY NOT NULL, - sponsor_id BIGINT, - proof_id BIGINT, - CONSTRAINT pk_kudos PRIMARY KEY (id) +CREATE TABLE kudos +( + id BIGINT GENERATED BY DEFAULT AS IDENTITY NOT NULL, + sponsor_id BIGINT, + proof_id BIGINT, + CONSTRAINT pk_kudos PRIMARY KEY (id) ); drop table if exists sponsor cascade; -CREATE TABLE sponsor ( - id BIGINT GENERATED BY DEFAULT AS IDENTITY NOT NULL, - first_name VARCHAR(20), - last_name VARCHAR(20), - image VARCHAR(300), - CONSTRAINT pk_sponsor PRIMARY KEY (id) +CREATE TABLE sponsor +( + id BIGINT GENERATED BY DEFAULT AS IDENTITY NOT NULL, + first_name VARCHAR(20), + last_name VARCHAR(20), + image VARCHAR(300), + CONSTRAINT pk_sponsor PRIMARY KEY (id) ); ALTER TABLE talent_attached_file From 24bc7338882e131c3342141aa211880730bc9c0d Mon Sep 17 00:00:00 2001 From: Maslyna Date: Sat, 22 Apr 2023 23:41:03 +0200 Subject: [PATCH 4/4] DELETE IS WORKING!!!!! *sounds of cry* --- src/main/java/com/provedcode/kudos/model/entity/Kudos.java | 2 +- src/main/java/com/provedcode/sponsor/model/entity/Sponsor.java | 2 +- .../java/com/provedcode/sponsor/service/SponsorService.java | 3 +++ 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/provedcode/kudos/model/entity/Kudos.java b/src/main/java/com/provedcode/kudos/model/entity/Kudos.java index 198e433..4af769b 100644 --- a/src/main/java/com/provedcode/kudos/model/entity/Kudos.java +++ b/src/main/java/com/provedcode/kudos/model/entity/Kudos.java @@ -17,7 +17,7 @@ public class Kudos { @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "id", nullable = false) private Long id; - @ManyToOne(cascade = CascadeType.ALL) + @ManyToOne @JoinColumn(name = "sponsor_id") private Sponsor sponsor; @ManyToOne(cascade = CascadeType.ALL) diff --git a/src/main/java/com/provedcode/sponsor/model/entity/Sponsor.java b/src/main/java/com/provedcode/sponsor/model/entity/Sponsor.java index c471d88..35ea8a0 100644 --- a/src/main/java/com/provedcode/sponsor/model/entity/Sponsor.java +++ b/src/main/java/com/provedcode/sponsor/model/entity/Sponsor.java @@ -30,6 +30,6 @@ public class Sponsor { @URL @Column(name = "image", length = 300) private String image; - @OneToMany(mappedBy = "sponsor", cascade = CascadeType.ALL, orphanRemoval = true) + @OneToMany(mappedBy = "sponsor") private List kudoses = new ArrayList<>(); } \ No newline at end of file diff --git a/src/main/java/com/provedcode/sponsor/service/SponsorService.java b/src/main/java/com/provedcode/sponsor/service/SponsorService.java index 32bf6bb..c1cc416 100644 --- a/src/main/java/com/provedcode/sponsor/service/SponsorService.java +++ b/src/main/java/com/provedcode/sponsor/service/SponsorService.java @@ -99,6 +99,9 @@ public void deleteSponsor(long id, Authentication authentication) { if (!sponsor.getId().equals(user.getSponsor().getId())) { throw new ResponseStatusException(FORBIDDEN, "The user cannot edit someone else's profile"); } + + List kudosList = sponsor.getKudoses().stream().map(i -> {i.setSponsor(null); return i;}).toList(); + sponsor.setKudoses(kudosList); userInfoRepository.delete(user); } } \ No newline at end of file