Skip to content

Commit

Permalink
Merge branch 'feature/connect-page' into TRIB-244
Browse files Browse the repository at this point in the history
  • Loading branch information
haxwell authored Mar 19, 2024
2 parents 5b52ded + 9c4e45b commit 11acd44
Show file tree
Hide file tree
Showing 18 changed files with 704 additions and 74 deletions.
Original file line number Diff line number Diff line change
@@ -1,13 +1,10 @@
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.annotations.responses.BadRequest;
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 @@ -110,4 +107,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 {}
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,6 @@

import lombok.Builder;

import java.util.List;

@Builder
public class ConnectOutgoingMessageDTO {
public Boolean connectionError;
Expand All @@ -12,5 +10,5 @@ public class ConnectOutgoingMessageDTO {

public String message;

public List<Long> to;
public Long to;
}
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);
}
11 changes: 7 additions & 4 deletions src/main/java/com/savvato/tribeapp/services/ConnectService.java
Original file line number Diff line number Diff line change
@@ -1,10 +1,9 @@
package com.savvato.tribeapp.services;

import com.savvato.tribeapp.config.principal.UserPrincipal;
import com.savvato.tribeapp.controllers.dto.ConnectionRemovalRequest;
import com.savvato.tribeapp.dto.ConnectIncomingMessageDTO;
import com.savvato.tribeapp.dto.ConnectOutgoingMessageDTO;
import org.springframework.messaging.handler.annotation.Header;
import org.springframework.messaging.handler.annotation.MessageMapping;

import java.util.List;
import java.util.Optional;
Expand All @@ -18,10 +17,14 @@ public interface ConnectService {
Optional<String> storeQRCodeString(long userId);

Boolean validateQRCode(String qrcodePhrase, Long toBeConnectedWithUserId);
void connect(ConnectIncomingMessageDTO incoming);
// void connect(ConnectIncomingMessageDTO incoming);

boolean saveConnectionDetails(Long requestingUserId, Long toBeConnectedWithUserId);
ConnectOutgoingMessageDTO handleConnectionIntent(String connectionIntent, Long requestingUserId, Long toBeRequestedWithUserId);

@MessageMapping("/connect/room")
void connect(ConnectIncomingMessageDTO incoming);

List<ConnectOutgoingMessageDTO> handleConnectionIntent(String connectionIntent, Long requestingUserId, Long toBeConnectedWithUserId);

boolean removeConnection(ConnectionRemovalRequest connectionDeleteRequest);
}
65 changes: 40 additions & 25 deletions src/main/java/com/savvato/tribeapp/services/ConnectServiceImpl.java
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,7 @@ public Boolean validateQRCode(String qrcodePhrase, Long toBeConnectedWithUserId)
return qrcodePhrase.equals(getQRCodeString(toBeConnectedWithUserId).orElse("")) && StringUtils.isNotBlank(qrcodePhrase);
}

@Override
@MessageMapping("/connect/room")
public void connect(ConnectIncomingMessageDTO incoming) {
if (!validateQRCode(incoming.qrcodePhrase, incoming.toBeConnectedWithUserId)) {
Expand All @@ -93,52 +94,66 @@ public void connect(ConnectIncomingMessageDTO incoming) {
"/connect/user/queue/specific-user",
msg);
} else {
ConnectOutgoingMessageDTO outgoingMsg = handleConnectionIntent(incoming.connectionIntent, incoming.requestingUserId, incoming.toBeConnectedWithUserId);
for (Long userId : outgoingMsg.to) {
List<ConnectOutgoingMessageDTO> outgoingMsg = handleConnectionIntent(incoming.connectionIntent, incoming.requestingUserId, incoming.toBeConnectedWithUserId);
for (ConnectOutgoingMessageDTO dto : outgoingMsg) {
simpMessagingTemplate.convertAndSendToUser(
String.valueOf(userId),
String.valueOf(dto.to),
"/connect/user/queue/specific-user",
outgoingMsg);
}
}
}

public ConnectOutgoingMessageDTO handleConnectionIntent(String connectionIntent, Long requestingUserId, Long toBeConnectedWithUserId) {
@Override
public List<ConnectOutgoingMessageDTO> handleConnectionIntent(String connectionIntent, Long requestingUserId, Long toBeConnectedWithUserId) {
List<ConnectOutgoingMessageDTO> rtn = new ArrayList<>();
List<Long> allRecipients = new ArrayList<>(Arrays.asList(requestingUserId, toBeConnectedWithUserId));

if (connectionIntent == "") {
List<Long> recipients = new ArrayList<>(Collections.singletonList(toBeConnectedWithUserId));
return ConnectOutgoingMessageDTO.builder().message("Please confirm that you wish to connect.").to(recipients).build();
rtn.add(ConnectOutgoingMessageDTO.builder()
.message("Please confirm that you wish to connect.")
.to(toBeConnectedWithUserId)
.build());
} else if (connectionIntent == "confirmed") {
Boolean connectionStatus = saveConnectionDetails(requestingUserId, toBeConnectedWithUserId);
List<Long> recipients = new ArrayList<>(Arrays.asList(requestingUserId, toBeConnectedWithUserId));
if (connectionStatus) {
return ConnectOutgoingMessageDTO.builder()
.connectionSuccess(true)
.to(recipients)
.message("Successfully saved connection!").build();
} else {
return ConnectOutgoingMessageDTO.builder()
.connectionError(true)
.to(recipients)
.message("Failed to save connection to database.").build();
for(Long id : allRecipients) {
if (connectionStatus) {
rtn.add(ConnectOutgoingMessageDTO.builder()
.connectionSuccess(true)
.to(id)
.message("Successfully saved connection!")
.build());
} else {
rtn.add(ConnectOutgoingMessageDTO.builder()
.connectionError(true)
.to(id)
.message("Failed to save connection to database.")
.build());
}
}
} else if (connectionIntent == "denied") {
List<Long> recipients = new ArrayList<>(Arrays.asList(requestingUserId, toBeConnectedWithUserId));
return ConnectOutgoingMessageDTO.builder()
.connectionError(true)
.to(recipients)
.message("Connection request denied.").build();

for(Long id : allRecipients) {
rtn.add(ConnectOutgoingMessageDTO.builder()
.connectionError(true)
.to(id)
.message("Connection request denied.")
.build());
}
} else {
rtn = null;
}
return null;

return rtn;
}

@Override
public List<ConnectOutgoingMessageDTO> getAllConnectionsForAUser(Long userId) {
List<Connection> connections = connectionsRepository.findAllByToBeConnectedWithUserId(userId);
List<ConnectOutgoingMessageDTO> outgoingMessages = new ArrayList<>();
for (Connection connection : connections) {
ConnectOutgoingMessageDTO outgoingMessage = ConnectOutgoingMessageDTO.builder()
.connectionSuccess(true)
.to(new ArrayList<>(Collections.singletonList(connection.getRequestingUserId())))
.to(connection.getRequestingUserId())
.message("")
.build();
outgoingMessages.add(outgoingMessage);
Expand Down
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 {

Optional<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);
}
Original file line number Diff line number Diff line change
@@ -1,13 +1,15 @@
package com.savvato.tribeapp.services;

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 @@ -16,6 +18,9 @@ public class CosignServiceImpl implements CosignService {
@Autowired
CosignRepository cosignRepository;

@Autowired
UserService userService;

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

Expand Down Expand Up @@ -45,4 +50,54 @@ public Optional<CosignDTO> saveCosign(Long userIdIssuing, Long userIdReceiving,
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;
}
}
Loading

0 comments on commit 11acd44

Please sign in to comment.