-
Notifications
You must be signed in to change notification settings - Fork 0
Members backend CRUD functions #43
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Changes from all commits
371f31c
05d4e64
548c654
dfcda10
5abe3c3
6dcf71b
3f518c9
1dddd3a
164cbcd
aa8023f
b3a9786
db591a2
8763c21
68e821f
1444c48
677a83c
f5d3ae4
9ac716f
e100bb0
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,7 @@ | ||
| ALTER TABLE members RENAME COLUMN linked_url TO linked_in_url; | ||
| ALTER TABLE members RENAME COLUMN bio TO introduction; | ||
| ALTER TABLE members RENAME COLUMN industry TO industry_pref; | ||
| ALTER TABLE members RENAME COLUMN role TO role_pref; | ||
|
|
||
| ALTER TABLE members ALTER COLUMN introduction SET NOT NULL; | ||
| ALTER TABLE members ALTER COLUMN active SET NOT NULL DEFAULT TRUE; |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,9 @@ | ||
| import { Stack, Title } from "@mantine/core"; | ||
|
|
||
| export function UserProfilePage() { | ||
| return ( | ||
| <Stack gap="xl"> | ||
| <Title order={2}>User Profile</Title> | ||
| </Stack> | ||
| ); | ||
| } |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,48 @@ | ||
| package org.patinanetwork.patchats.api.member; | ||
|
|
||
| import io.swagger.v3.oas.annotations.tags.Tag; | ||
| import jakarta.validation.Valid; | ||
| import lombok.RequiredArgsConstructor; | ||
| import org.patinanetwork.patchats.api.member.dto.CreateMemberRequest; | ||
| import org.patinanetwork.patchats.api.member.dto.MemberDto; | ||
| import org.patinanetwork.patchats.common.dto.ApiResponder; | ||
| import org.springframework.http.ResponseEntity; | ||
| import org.springframework.web.bind.annotation.PostMapping; | ||
| import org.springframework.web.bind.annotation.RequestBody; | ||
| import org.springframework.web.bind.annotation.RequestMapping; | ||
| import org.springframework.web.bind.annotation.RestController; | ||
|
|
||
| @RestController | ||
| @RequestMapping("/api/members") | ||
| @Tag(name = "Member") | ||
| @RequiredArgsConstructor | ||
| public class MemberController { | ||
|
|
||
| private final MemberService memberService; | ||
|
|
||
| @PostMapping | ||
| public ResponseEntity<ApiResponder<MemberDto>> createMember(@Valid @RequestBody final CreateMemberRequest request) { | ||
| final MemberDto response = memberService.createMember(request); | ||
| return ResponseEntity.ok(ApiResponder.success("Member created successfully", response)); | ||
| } | ||
|
|
||
| // TODO: Implement these endpoints after createMember is fully functional and tested | ||
|
Check warning on line 29 in src/main/java/org/patinanetwork/patchats/api/member/MemberController.java
|
||
| // @PatchMapping("/{id}") | ||
| // public ResponseEntity<ApiResponder<MemberDto>> updateMember( | ||
| // @Valid @RequestBody final UpdateMemberRequest request, @PathVariable final UUID id) { | ||
|
Check warning on line 32 in src/main/java/org/patinanetwork/patchats/api/member/MemberController.java
|
||
| // final MemberDto response = memberService.updateMember(request, id); | ||
| // return ResponseEntity.ok(ApiResponder.success("Member updated successfully", response)); | ||
| // } | ||
|
|
||
| // @GetMapping("/{id}") | ||
| // public ResponseEntity<ApiResponder<MemberDto>> getMember(@PathVariable final UUID id) { | ||
|
Check warning on line 38 in src/main/java/org/patinanetwork/patchats/api/member/MemberController.java
|
||
| // final MemberDto response = memberService.getMemberById(id); | ||
| // return ResponseEntity.ok(ApiResponder.success("Member retrieved successfully", response)); | ||
| // } | ||
|
|
||
| // @DeleteMapping("/{id}") | ||
| // public ResponseEntity<ApiResponder<MemberDto>> deactivateMember(@PathVariable final UUID id) { | ||
|
Check warning on line 44 in src/main/java/org/patinanetwork/patchats/api/member/MemberController.java
|
||
| // final MemberDto response = memberService.deactivateMemberById(id); | ||
| // return ResponseEntity.ok(ApiResponder.success("Member deactivated successfully", response)); | ||
| // } | ||
| } | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,81 @@ | ||
| package org.patinanetwork.patchats.api.member; | ||
|
|
||
| import java.util.UUID; | ||
| import lombok.RequiredArgsConstructor; | ||
| import org.patinanetwork.patchats.api.member.db.models.Member; | ||
| import org.patinanetwork.patchats.api.member.db.repos.MemberRepo; | ||
| import org.patinanetwork.patchats.api.member.dto.CreateMemberRequest; | ||
| import org.patinanetwork.patchats.api.member.dto.MemberDto; | ||
| import org.patinanetwork.patchats.api.member.dto.UpdateMemberRequest; | ||
| import org.patinanetwork.patchats.common.web.exception.MemberDuplicateException; | ||
| import org.patinanetwork.patchats.common.web.exception.MemberNotFoundException; | ||
| import org.springframework.http.HttpStatus; | ||
| import org.springframework.stereotype.Service; | ||
| import org.springframework.web.server.ResponseStatusException; | ||
|
|
||
| @Service | ||
| @RequiredArgsConstructor | ||
| public class MemberService { | ||
|
|
||
| private final MemberRepo memberRepo; | ||
|
|
||
| public MemberDto createMember(CreateMemberRequest request) { | ||
| if (memberRepo.getMemberByEmail(request.email()).isPresent()) { | ||
| throw new MemberDuplicateException(request.email()); | ||
| } | ||
| Member member = Member.builder() | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Wouldn't it be better to just use the existing member object from the repo? We already check if it exists above. If we're creating a whole new member object, we might be losing information from the old object. (We can't assume that the update request has all the same data as the member object, there may be some stuff we don't want to update :))
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Did you mean to highlight the member builder in updateMember? If so, i'll work on making the updateMember support partial updates rather than full updates, and not have to build a member for every update. |
||
| .id(UUID.randomUUID()) | ||
| .fullName(request.fullName()) | ||
| .email(request.email()) | ||
| .linkedInUrl(request.linkedInUrl()) | ||
| .introduction(request.introduction()) | ||
| .referralSource(request.referralSource()) | ||
| .active(true) | ||
| .matchPref(request.matchPref()) | ||
| .industryPref(request.industryPref()) | ||
| .rolePref(request.rolePref()) | ||
| .topics(request.topics()) | ||
| .extraNotes(request.extraNotes()) | ||
| .build(); | ||
| Member createdMember = memberRepo.createMember(member); | ||
| return MemberDto.from(createdMember); | ||
| } | ||
|
|
||
| public MemberDto updateMember(UpdateMemberRequest request, UUID id) { | ||
| if (memberRepo.getMemberById(id).isEmpty()) { | ||
| throw new MemberNotFoundException(id); | ||
| } | ||
| // TODO: Implement partial update instead of full update | ||
|
Check warning on line 48 in src/main/java/org/patinanetwork/patchats/api/member/MemberService.java
|
||
| Member member = Member.builder() | ||
| .id(id) | ||
| .fullName(request.fullName()) | ||
| .email(request.email()) | ||
| .linkedInUrl(request.linkedInUrl()) | ||
| .introduction(request.introduction()) | ||
| .matchPref(request.matchPref()) | ||
| .industryPref(request.industryPref()) | ||
| .rolePref(request.rolePref()) | ||
| .topics(request.topics()) | ||
| .extraNotes(request.extraNotes()) | ||
| .build(); | ||
| Member updatedMember = memberRepo | ||
| .updateMember(member) | ||
| .orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND, "Member not found")); | ||
| return MemberDto.from(updatedMember); | ||
| } | ||
|
|
||
| // TODO: Implement these methods after createMember and updateMember is fully functional and tested | ||
|
Check warning on line 67 in src/main/java/org/patinanetwork/patchats/api/member/MemberService.java
|
||
| // public MemberDto getMemberById(UUID id) { | ||
|
Check warning on line 68 in src/main/java/org/patinanetwork/patchats/api/member/MemberService.java
|
||
| // return memberRepo | ||
| // .getMemberById(id) | ||
| // .map(MemberDto::from) | ||
| // .orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND, "Member not found")); | ||
| // } | ||
|
|
||
| // public MemberDto deactivateMemberById(UUID id) { | ||
|
Check warning on line 75 in src/main/java/org/patinanetwork/patchats/api/member/MemberService.java
|
||
| // return memberRepo | ||
| // .deactivateMemberById(id) | ||
| // .map(MemberDto::from) | ||
| // .orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND, "Member not found")); | ||
| // } | ||
| } | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,55 @@ | ||
| package org.patinanetwork.patchats.api.member.db.models; | ||
|
|
||
| import java.time.Instant; | ||
| import java.util.UUID; | ||
| import lombok.Builder; | ||
| import lombok.EqualsAndHashCode; | ||
| import lombok.Getter; | ||
| import lombok.Setter; | ||
| import lombok.ToString; | ||
|
|
||
| @Getter | ||
| @Builder | ||
| @ToString | ||
| @EqualsAndHashCode | ||
| public class Member { | ||
|
|
||
| private UUID id; | ||
|
|
||
| @Setter | ||
| private String fullName; | ||
|
|
||
| @Setter | ||
| private String email; | ||
|
|
||
| @Setter | ||
| private String linkedInUrl; | ||
|
|
||
| @Setter | ||
| private String introduction; | ||
|
|
||
| @Setter | ||
| private String referralSource; | ||
|
|
||
| @Setter | ||
| private boolean active; | ||
|
|
||
| @Setter | ||
| private String matchPref; | ||
|
|
||
| @Setter | ||
| private String industryPref; | ||
|
|
||
| @Setter | ||
| private String rolePref; | ||
|
|
||
| @Setter | ||
| private String topics; | ||
|
|
||
| @Setter | ||
| private String extraNotes; | ||
|
|
||
| private Instant createdAt; | ||
|
|
||
| private Instant updatedAt; | ||
| } |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,47 @@ | ||
| package org.patinanetwork.patchats.api.member.db.repos; | ||
|
|
||
| import java.util.Optional; | ||
| import java.util.UUID; | ||
| import org.patinanetwork.patchats.api.member.db.models.Member; | ||
|
|
||
| public interface MemberRepo { | ||
| /** | ||
| * @note - The provided object's methods will be overridden with any returned data from the database. | ||
| * @param member - required fields: | ||
| * <ul> | ||
| * <li>id | ||
| * <li>fullName | ||
| * <li>email | ||
| * <li>introduction | ||
| * <li>active | ||
| * <li>createdAt | ||
| * <li>updatedAt | ||
| * </ul> | ||
| */ | ||
| Member createMember(Member member); | ||
|
|
||
| /** | ||
| * @note - The provided object's methods will be overridden with any returned data from the database. | ||
| * @param member - overridden fields: | ||
| * <ul> | ||
| * <li>fullName | ||
| * <li>email | ||
| * <li>linkedInUrl | ||
| * <li>introduction | ||
| * <li>referralSource | ||
| * <li>active | ||
| * <li>matchPref | ||
| * <li>industryPref | ||
| * <li>rolePref | ||
| * <li>topics | ||
| * <li>extraNotes | ||
| * </ul> | ||
| */ | ||
| Optional<Member> updateMember(Member member); | ||
|
|
||
| Optional<Member> getMemberById(UUID id); | ||
|
|
||
| Optional<Member> getMemberByEmail(String email); | ||
|
|
||
| Optional<Member> deactivateMemberById(UUID id); | ||
| } |
Uh oh!
There was an error while loading. Please reload this page.