Skip to content

Commit

Permalink
TRIB-236: adds ConnectAPI endpoints to get all cosigners for user and…
Browse files Browse the repository at this point in the history
… all cosigners for a given attribute (#162)

* TRIB-236: adds UserNameDTO

* TRIB-236: removes unused imports from UserNameDTO

* TRIB-236: adds cosign repo query for cosigners
- adds findCosignersByUserIdReceivingAndPhraseId

* TRIB-236: adds cosign svc get cosigners()
- adds List<UserNameDTO> getCosignersForUserAttribute(Long userReceivingId, Long phraseId)

* TRIB-236: adds connectAPI endpoint to get cosignrs
- adds getCosignersForUserAttribute

* TRIB-236: updates cnnct endpoint get cosigners rtn
- updates getCosignersForUserAttribute return type to ResponseEntity<List<UserNameDTO>>

* TRIB-236: creates Cosigns for users dto

* TRIB-236: adds Schema notations to CosignDTO
- reasoning: Noticed error in cosign DTO. Added schema notations for fields. Possibly unrelated to this ticket, but may become relevant if cosignDTO ends up being incorporated.

* TRIB-236: updates CosignsForUserDTO list property
- updates list of cosigners to match ticket output requirement: listOfCosigners

* TRIB-236:adds cosign repo findAllByUserIdReceiving

* TRIB-236: adds connectapi & cosign svc getAllCosgn
- adds cosign service getAllCosignsForUser
- adds connectapi endpoing getAllCosignsForUser

* TRIB-236: refactors cosign svc to use user svc
- adds getUserNameDTO to user services
- refactors cosign service getCosignersForUserAttribute and getAllCosignsForUser to call user service for getUserNameDTO
- reasoning: relocating user-related methods to the user service instead of "hiding" them in the cosign service

* TRIB-236: adds test for user svc getUserNameDTO

* TRIB-236: adds test for cosign svc getCosigners

* TRIB-236: adds connectSvc testGetAllCosignsForUser

* TRIB-236: refactors cosign test for clarity

* TRIB-236: adds CnctAPI test get cosigns user/attr

* TRIB-236: adds CnctAPI testGetAllCosignsForUser

* TRIB-236: adds CnctAPI swagger annotation

* TRIB-236: adds ConnectAPI swagger annotation

* TRIB-236: changes userName to username in multiple

* TRIB-236: updates cosignforuserDTO schema

* TRIB-236: adds connect svc test for Get Cosigners
- adds test testGetCosignersForUserWithThreeCosigners

* TRIB-236: cnc

* TRIB-236: adds connect svc test get all cosigns
- added a second test testGetAllCosignsForUserWithThreeCosignsForThreePhrases to test multiple list entries
- added class helper method listBuilderCosignForUser to build cosigns for a user
- reasoning for helper method: It was already a long test, and creating 9 cosigns required 54 lines of code. Using the helper method reduced the code to 15 lines.

* TRIB-236: updates connectAPI get all cosigns test
- updates testGetAllCosignsForUser() to test for three phrases, each with three cosigners
- removed phraseId from parameter list (mistake)

* TRIB-236: removes sout print lines used for dev
  • Loading branch information
mrsbluerose authored Mar 19, 2024
1 parent f5d977a commit 1288903
Show file tree
Hide file tree
Showing 14 changed files with 583 additions and 10 deletions.
Original file line number Diff line number Diff line change
@@ -1,12 +1,9 @@
package com.savvato.tribeapp.controllers;

import com.savvato.tribeapp.config.principal.UserPrincipal;
import com.savvato.tribeapp.controllers.annotations.controllers.ConnectAPIController.*;
import com.savvato.tribeapp.controllers.dto.ConnectRequest;
import com.savvato.tribeapp.controllers.dto.CosignRequest;
import com.savvato.tribeapp.dto.ConnectIncomingMessageDTO;
import com.savvato.tribeapp.dto.ConnectOutgoingMessageDTO;
import com.savvato.tribeapp.dto.CosignDTO;
import com.savvato.tribeapp.dto.*;
import com.savvato.tribeapp.services.ConnectService;
import com.savvato.tribeapp.services.CosignService;
import io.swagger.v3.oas.annotations.Parameter;
Expand Down Expand Up @@ -106,4 +103,23 @@ public ResponseEntity deleteCosign(@RequestBody @Valid CosignRequest cosignReque
return ResponseEntity.status(HttpStatus.OK).build();

}

@GetCosignersForUserAttribute
@GetMapping("cosign/{userIdReceiving}/{phraseId}")
public ResponseEntity<List<UsernameDTO>> getCosignersForUserAttribute(@PathVariable Long userIdReceiving, @PathVariable Long phraseId) {

List<UsernameDTO> list = cosignService.getCosignersForUserAttribute(userIdReceiving,phraseId);

return ResponseEntity.status(HttpStatus.OK).body(list);
}

@GetAllCosignsForUser
@GetMapping("cosign/{userIdReceiving}/all")
public ResponseEntity<List<CosignsForUserDTO>> getAllCosignsForUser(@PathVariable Long userIdReceiving) {

List<CosignsForUserDTO> list = cosignService.getAllCosignsForUser(userIdReceiving);

return ResponseEntity.status(HttpStatus.OK).body(list);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package com.savvato.tribeapp.controllers.annotations.controllers.ConnectAPIController;

import com.savvato.tribeapp.controllers.annotations.responses.BadRequest;
import com.savvato.tribeapp.controllers.annotations.responses.Success;
import io.swagger.v3.oas.annotations.Operation;

import java.lang.annotation.*;

/** Documentation for getting all cosigns for a user */
@Target({ElementType.METHOD, ElementType.TYPE, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Operation(
summary = "Get all cosigners of attributes for a given attribute for a user",
description = "Provided a user ID, get cosigns and attribute ids for that user. ")
@Success(description = "", example = "")
@BadRequest(description = "", noContent = true)
public @interface GetAllCosignsForUser {}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package com.savvato.tribeapp.controllers.annotations.controllers.ConnectAPIController;

import com.savvato.tribeapp.controllers.annotations.responses.BadRequest;
import com.savvato.tribeapp.controllers.annotations.responses.Success;
import io.swagger.v3.oas.annotations.Operation;
import java.lang.annotation.*;

/** Documentation for getting cosigns for a user attribute */
@Target({ElementType.METHOD, ElementType.TYPE, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Operation(
summary = "Get all cosigners for a given attribute for a user",
description = "Provided a user ID and attribute ID, get cosigns for that user and attribute. ")
@Success(description = "", example = "")
@BadRequest(description = "", noContent = true)
public @interface GetCosignersForUserAttribute {}
6 changes: 6 additions & 0 deletions src/main/java/com/savvato/tribeapp/dto/CosignDTO.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,13 @@
@Schema(description = "A Cosign DTO")
@Builder
public class CosignDTO {

@Schema(example = "1")
public Long userIdIssuing;

@Schema(example = "2")
public Long userIdReceiving;

@Schema(example = "1")
public Long phraseId;
}
17 changes: 17 additions & 0 deletions src/main/java/com/savvato/tribeapp/dto/CosignsForUserDTO.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package com.savvato.tribeapp.dto;

import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Builder;

import java.util.List;

@Schema(description = "All Cosigns for user DTO")
@Builder
public class CosignsForUserDTO {

@Schema(example = "1")
public long phraseId;

@Schema(example = "[{\"userId\": 1, \"username\": \"testuser\"}]")
public List<UsernameDTO> listOfCosigners;
}
14 changes: 14 additions & 0 deletions src/main/java/com/savvato/tribeapp/dto/UsernameDTO.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package com.savvato.tribeapp.dto;

import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Builder;

@Builder
public class UsernameDTO {
@Schema(example = "1")
public Long userId;

@Schema(example = "John Doe")
public String username;

}
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,17 @@

import com.savvato.tribeapp.entities.Cosign;
import com.savvato.tribeapp.entities.CosignId;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;

import java.util.List;

@Repository
public interface CosignRepository extends CrudRepository<Cosign, CosignId> {
@Query(nativeQuery = true, value = "select user_id_issuing from cosign where user_id_receiving = ?1 and phrase_id = ?2")
List<Long> findCosignersByUserIdReceivingAndPhraseId(Long userIdReceiving, Long phraseId);

@Query(nativeQuery = true, value = "select * from cosign where user_id_receiving = ?")
List<Cosign> findAllByUserIdReceiving(Long userIdReceiving);
}
Original file line number Diff line number Diff line change
@@ -1,11 +1,17 @@
package com.savvato.tribeapp.services;

import com.savvato.tribeapp.dto.CosignDTO;
import com.savvato.tribeapp.dto.CosignsForUserDTO;
import com.savvato.tribeapp.dto.UsernameDTO;

import java.util.Optional;
import java.util.List;

public interface CosignService {

CosignDTO saveCosign(Long userIdIssuing, Long userIdReceiving, Long phraseId);
boolean deleteCosign(Long userIdIssuing, Long userIdReceiving, Long phraseId);

List<UsernameDTO> getCosignersForUserAttribute(Long userReceivingId, Long phraseId);

List<CosignsForUserDTO> getAllCosignsForUser(Long userIdReceiving);
}
58 changes: 56 additions & 2 deletions src/main/java/com/savvato/tribeapp/services/CosignServiceImpl.java
Original file line number Diff line number Diff line change
@@ -1,14 +1,15 @@
package com.savvato.tribeapp.services;

import com.savvato.tribeapp.controllers.dto.CosignRequest;
import com.savvato.tribeapp.dto.CosignDTO;
import com.savvato.tribeapp.dto.CosignsForUserDTO;
import com.savvato.tribeapp.dto.UsernameDTO;
import com.savvato.tribeapp.entities.Cosign;
import com.savvato.tribeapp.repositories.CosignRepository;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Optional;
import java.util.*;

@Service
@Slf4j
Expand All @@ -17,6 +18,9 @@ public class CosignServiceImpl implements CosignService {
@Autowired
CosignRepository cosignRepository;

@Autowired
UserService userService;

@Override
public CosignDTO saveCosign(Long userIdIssuing, Long userIdReceiving, Long phraseId) {

Expand All @@ -42,4 +46,54 @@ public CosignDTO saveCosign(Long userIdIssuing, Long userIdReceiving, Long phras
public boolean deleteCosign(Long userIdIssuing, Long userIdReceiving, Long phraseId) {
return false;
}

@Override
public List<UsernameDTO> getCosignersForUserAttribute(Long userIdReceiving, Long phraseId) {

List<UsernameDTO> list = new ArrayList<>();
List<Long> cosignerIds = cosignRepository.findCosignersByUserIdReceivingAndPhraseId(userIdReceiving, phraseId);

for(Long id : cosignerIds) {
list.add(userService.getUsernameDTO(id));
}

return list;
}

@Override
public List<CosignsForUserDTO> getAllCosignsForUser(Long userIdReceiving) {

List<CosignsForUserDTO> cosignsForUserDTOs = new ArrayList<>();

List<Cosign> allCosignsByUserIdReceiving = cosignRepository.findAllByUserIdReceiving(userIdReceiving);
Map<Long, List<UsernameDTO>> mapOfPhrasesAndUserIdsIssuing = new HashMap<>();
Map<Long, UsernameDTO> mapOfUsernameDTOs = new HashMap<>();

for(Cosign cosign : allCosignsByUserIdReceiving) {
Long userIdIssuing = cosign.getUserIdIssuing();
Long phraseId = cosign.getPhraseId();

if(!mapOfUsernameDTOs.containsKey(userIdIssuing)) {
mapOfUsernameDTOs.put(userIdIssuing,userService.getUsernameDTO(userIdIssuing));
}

if(mapOfPhrasesAndUserIdsIssuing.containsKey(phraseId)){
mapOfPhrasesAndUserIdsIssuing.get(phraseId).add(mapOfUsernameDTOs.get(userIdIssuing));
} else {
List<UsernameDTO> list = new ArrayList<>();
list.add(mapOfUsernameDTOs.get(userIdIssuing));
mapOfPhrasesAndUserIdsIssuing.put(phraseId,list);
}
}

mapOfPhrasesAndUserIdsIssuing.forEach((k,v) -> {
CosignsForUserDTO cosignsForUserDTO = CosignsForUserDTO.builder()
.phraseId(k)
.listOfCosigners(v)
.build();
cosignsForUserDTOs.add(cosignsForUserDTO);
});

return cosignsForUserDTOs;
}
}
3 changes: 3 additions & 0 deletions src/main/java/com/savvato/tribeapp/services/UserService.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import com.savvato.tribeapp.controllers.dto.UserRequest;
import com.savvato.tribeapp.dto.UserDTO;
import com.savvato.tribeapp.dto.UsernameDTO;
import com.savvato.tribeapp.entities.User;

import java.util.List;
Expand All @@ -17,4 +18,6 @@ public interface UserService {
UserDTO changePassword(String pw, String phoneNumber, String challengeCode);

List<UserDTO> getAllUsers();

UsernameDTO getUsernameDTO(Long userId);
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

import com.savvato.tribeapp.controllers.dto.UserRequest;
import com.savvato.tribeapp.dto.UserDTO;
import com.savvato.tribeapp.dto.UsernameDTO;
import com.savvato.tribeapp.entities.User;
import com.savvato.tribeapp.entities.UserRole;
import com.savvato.tribeapp.repositories.UserRepository;
Expand Down Expand Up @@ -168,4 +169,12 @@ private UserDTO getUserDTO(User user) {
return userDTO;
}

@Override
public UsernameDTO getUsernameDTO(Long userId) {
UsernameDTO usernameDTO = UsernameDTO.builder()
.userId(userId)
.username(userRepo.findById(userId).get().getName())
.build();
return usernameDTO;
}
}
Loading

0 comments on commit 1288903

Please sign in to comment.