added userId in the faq table

This commit is contained in:
harish
2024-08-22 12:32:27 +05:30
parent ce27dcd4a9
commit f8f58689c4
9 changed files with 136 additions and 19 deletions

View File

@@ -129,6 +129,14 @@
<artifactId>hibernate-validator</artifactId> <artifactId>hibernate-validator</artifactId>
</dependency> </dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.10.1</version> <!-- or the latest version -->
</dependency>
</dependencies> </dependencies>

View File

@@ -5,8 +5,10 @@ import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm; import io.jsonwebtoken.SignatureAlgorithm;
import io.jsonwebtoken.security.Keys; import io.jsonwebtoken.security.Keys;
import jakarta.annotation.PostConstruct; import jakarta.annotation.PostConstruct;
import jakarta.servlet.http.HttpServletRequest;
import net.gepafin.tendermanagement.entities.UserEntity; import net.gepafin.tendermanagement.entities.UserEntity;
import net.gepafin.tendermanagement.util.Utils;
import org.apache.commons.lang3.ArrayUtils;
import org.apache.commons.lang3.time.DateUtils; import org.apache.commons.lang3.time.DateUtils;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
@@ -18,11 +20,17 @@ import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.User; import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import javax.crypto.SecretKey; import javax.crypto.SecretKey;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import java.util.*; import java.util.*;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import com.google.gson.Gson;
import static io.micrometer.common.util.StringUtils.isEmpty;
@Component @Component
public class TokenProvider { public class TokenProvider {
private final Logger log = LoggerFactory.getLogger(TokenProvider.class); private final Logger log = LoggerFactory.getLogger(TokenProvider.class);
@@ -35,6 +43,12 @@ public class TokenProvider {
private SecretKey key; private SecretKey key;
private static final String AUTHORITIES_KEY = "auth";
private static final String MERCHANTID="merchantId";
public static final String INVALID_USER = "invalid_user";
static final String AUTH_SECRET = "X-Api-Secret";
@PostConstruct @PostConstruct
public void init() { public void init() {
this.key = Keys.hmacShaKeyFor(secretKey.getBytes(StandardCharsets.UTF_8)); this.key = Keys.hmacShaKeyFor(secretKey.getBytes(StandardCharsets.UTF_8));
@@ -110,4 +124,76 @@ public class TokenProvider {
return false; return false;
} }
} }
public Map<String, Object> getUserInfoAndUserIdFromToken(HttpServletRequest request) {
Map<String, Object> userInfo = new HashMap<>();
String authSecretHeader=request.getHeader(AUTH_SECRET);
// userInfo.put(MERCHANTID, null);
String bearerToken = request.getHeader("Authorization");
String token = "";
if (StringUtils.hasText(bearerToken) && bearerToken.startsWith("Bearer ")) {
token = bearerToken.substring(7, bearerToken.length());
}
extractDetailsFromTheToken(userInfo, authSecretHeader, token);
return userInfo;
}
public Map<String, Object> extractDetailsFromTheToken(Map<String, Object> userInfo, String authSecretHeader,
String token) {
String payload = null;
Boolean isSuperAdmin = false;
// if (StringUtils.hasText(token) && token.endsWith("_superKey" + getSuperUserToken())) {
// Map<String, Object> payloadMap = getUserDetailsForSuperUser(token);
// payload = payloadMap.get("sub").toString();
// isSuperAdmin = true;
//
// } else
if (!isEmpty(authSecretHeader)) {
String secret = Utils.decodeBase64String(authSecretHeader);
String[] tokenArr = secret.split("\\.", 2);
String[] merchant = tokenArr[0].split("-");
if (ArrayUtils.isNotEmpty(merchant) && 2 <= merchant.length) {
userInfo.put(MERCHANTID, merchant[1]);
return userInfo;
}
} else {
payload = getUserDetails(token);
}
if (payload != null && !isSuperAdmin) {
String[] payloadString = payload.split(":");{
if (payloadString.length > 1) {
// userInfo.put(MERCHANTID, payloadString[1]);
// userInfo.put("associatedTags", payloadString[2]);
userInfo.put("userId", payloadString[1]);
}
}
if (payloadString.length > 1) {
// userInfo.put(MERCHANTID, payloadString[1]);
// userInfo.put("associatedTags", payloadString[2]);
userInfo.put("userId", payloadString[1]);
}
} else {
String[] payloadString = payload.split(":");
if (payloadString.length > 1) {
userInfo.put("userId", payloadString[1]);
}
}
return userInfo;
}
public Map<String, Object> getUserDetailsForSuperUser(String token) {
Base64.Decoder decoder = Base64.getUrlDecoder();
String[] parts = token.split("\\."); // Splitting header, payload and signature
Gson g = new Gson();
return g.fromJson(new String(decoder.decode(parts[1])), Map.class);
}
// public String getSuperUserToken() {
// return superUserToken;
// }
public String getUserDetails(String token) {
Claims claims = Jwts.parser().setSigningKey(key).parseClaimsJws(token).getBody();
return claims.getSubject();
}
} }

View File

@@ -14,7 +14,6 @@ import net.gepafin.tendermanagement.enums.CallTypeEnum;
import net.gepafin.tendermanagement.model.request.*; import net.gepafin.tendermanagement.model.request.*;
import net.gepafin.tendermanagement.model.response.*; import net.gepafin.tendermanagement.model.response.*;
import net.gepafin.tendermanagement.repositories.*; import net.gepafin.tendermanagement.repositories.*;
import net.gepafin.tendermanagement.service.AmazonS3Service;
import net.gepafin.tendermanagement.util.DateTimeUtil; import net.gepafin.tendermanagement.util.DateTimeUtil;
import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException; import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException;
import net.gepafin.tendermanagement.web.rest.api.errors.ResourceNotFoundException; import net.gepafin.tendermanagement.web.rest.api.errors.ResourceNotFoundException;
@@ -48,14 +47,17 @@ public class CallDao {
@Autowired @Autowired
private CallTargetAudienceChecklistRepository callTargetAudienceChecklistRepository; private CallTargetAudienceChecklistRepository callTargetAudienceChecklistRepository;
public CreateCallResponseBean createCall(CreateCallRequest createCallRequest) { @Autowired
private UserRepository userRepository;
public CreateCallResponseBean createCall(CreateCallRequest createCallRequest, Long userId) {
try { try {
CreateCallResponseBean createCallResponseBean=null; CreateCallResponseBean createCallResponseBean=null;
CallEntity callEntity = convertToCallEntity(createCallRequest); CallEntity callEntity = convertToCallEntity(createCallRequest);
List<EvaluationCriteriaEntity> evaluationCriteriaEntities = convertToEvaluationCriteriaEntities(createCallRequest.getCriteria(), callEntity); List<EvaluationCriteriaEntity> evaluationCriteriaEntities = convertToEvaluationCriteriaEntities(createCallRequest.getCriteria(), callEntity);
List<DocumentEntity> documentEntities = convertToDocumentEntities(createCallRequest.getDocs(), callEntity); List<DocumentEntity> documentEntities = convertToDocumentEntities(createCallRequest.getDocs(), callEntity);
List<DocumentEntity> imageEntities=convertToDocumentEntities(createCallRequest.getImages(),callEntity); List<DocumentEntity> imageEntities=convertToDocumentEntities(createCallRequest.getImages(),callEntity);
List<FaqEntity> faqEntities = convertToFaqEntities(createCallRequest.getFaq(), callEntity); List<FaqEntity> faqEntities = convertToFaqEntities(createCallRequest.getFaq(), callEntity, userId);
List<LookUpDataResponse> amiedTo=convertLookUpDataEntities(createCallRequest.getAimedTo(),callEntity,LookUpDataTypeEnum.AIMED_TO); List<LookUpDataResponse> amiedTo=convertLookUpDataEntities(createCallRequest.getAimedTo(),callEntity,LookUpDataTypeEnum.AIMED_TO);
List<LookUpDataResponse> checkList=convertLookUpDataEntities(createCallRequest.getAimedTo(),callEntity,LookUpDataTypeEnum.CHECKLIST); List<LookUpDataResponse> checkList=convertLookUpDataEntities(createCallRequest.getAimedTo(),callEntity,LookUpDataTypeEnum.CHECKLIST);
createCallResponseBean= assembleCreateCallResponseBean(callEntity, evaluationCriteriaEntities, documentEntities, faqEntities,imageEntities); createCallResponseBean= assembleCreateCallResponseBean(callEntity, evaluationCriteriaEntities, documentEntities, faqEntities,imageEntities);
@@ -125,18 +127,18 @@ public class CallDao {
} }
public List<FaqEntity> convertToFaqEntities(List<FaqReq> faqReqList, CallEntity callEntity) { public List<FaqEntity> convertToFaqEntities(List<FaqReq> faqReqList, CallEntity callEntity, Long userId) {
List<FaqEntity> faqEntities = faqReqList.stream().map(req -> convertToFaqEntity(req, callEntity)).collect(Collectors.toList()); List<FaqEntity> faqEntities = faqReqList.stream().map(req -> convertToFaqEntity(req, callEntity, userId)).collect(Collectors.toList());
faqRepository.saveAll(faqEntities); faqRepository.saveAll(faqEntities);
return faqEntities; return faqEntities;
} }
private FaqEntity convertToFaqEntity(FaqReq faqReq, CallEntity callEntity) { private FaqEntity convertToFaqEntity(FaqReq faqReq, CallEntity callEntity, Long userId) {
FaqEntity faqEntity = new FaqEntity(); FaqEntity faqEntity = new FaqEntity();
validateFaqEntity(faqReq.getQuestion()); validateFaqEntity(faqReq.getQuestion());
// UserEntity userEntity= userRepository.findById(1l) UserEntity userEntity= userRepository.findById(userId)
// .orElseThrow(() -> new ResourceNotFoundException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.LOOK_UP_DATA_NOT_VALID_MSG))); .orElseThrow(() -> new ResourceNotFoundException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.LOOK_UP_DATA_NOT_VALID_MSG)));
// faqEntity.setUser(userEntity); faqEntity.setUser(userEntity);
faqEntity.setIsVisible(true); faqEntity.setIsVisible(true);
if(faqReq.getIsVisible()!=null){ if(faqReq.getIsVisible()!=null){
faqEntity.setIsVisible(faqReq.getIsVisible()); faqEntity.setIsVisible(faqReq.getIsVisible());

View File

@@ -1,10 +1,11 @@
package net.gepafin.tendermanagement.service; package net.gepafin.tendermanagement.service;
import jakarta.servlet.http.HttpServletRequest;
import net.gepafin.tendermanagement.model.request.CreateCallRequest; import net.gepafin.tendermanagement.model.request.CreateCallRequest;
import net.gepafin.tendermanagement.model.response.CreateCallResponseBean; import net.gepafin.tendermanagement.model.response.CreateCallResponseBean;
public interface CallService { public interface CallService {
CreateCallResponseBean createCall(CreateCallRequest createCallRequest); CreateCallResponseBean createCall(HttpServletRequest request, CreateCallRequest createCallRequest);
} }

View File

@@ -1,5 +1,7 @@
package net.gepafin.tendermanagement.service.impl; package net.gepafin.tendermanagement.service.impl;
import jakarta.servlet.http.HttpServletRequest;
import net.gepafin.tendermanagement.config.jwt.TokenProvider;
import net.gepafin.tendermanagement.dao.CallDao; import net.gepafin.tendermanagement.dao.CallDao;
import net.gepafin.tendermanagement.model.request.CreateCallRequest; import net.gepafin.tendermanagement.model.request.CreateCallRequest;
import net.gepafin.tendermanagement.model.response.CreateCallResponseBean; import net.gepafin.tendermanagement.model.response.CreateCallResponseBean;
@@ -7,6 +9,8 @@ import net.gepafin.tendermanagement.service.CallService;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.Map;
@Service @Service
public class CallServiceImpl implements CallService { public class CallServiceImpl implements CallService {
@@ -14,8 +18,12 @@ public class CallServiceImpl implements CallService {
@Autowired @Autowired
private CallDao callDao; private CallDao callDao;
@Autowired
private TokenProvider tokenProvider;
@Override @Override
public CreateCallResponseBean createCall(CreateCallRequest createCallRequest) { public CreateCallResponseBean createCall(HttpServletRequest request, CreateCallRequest createCallRequest) {
return callDao.createCall(createCallRequest); Map<String, Object> userInfo= tokenProvider.getUserInfoAndUserIdFromToken(request);
return callDao.createCall(createCallRequest, Long.parseLong(userInfo.get("userId").toString()));
} }
} }

View File

@@ -3,9 +3,12 @@ package net.gepafin.tendermanagement.util;
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import io.micrometer.common.util.StringUtils;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import java.nio.charset.StandardCharsets;
import java.util.Base64;
import java.util.List; import java.util.List;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@@ -58,5 +61,12 @@ public class Utils {
return filePath; return filePath;
} }
} }
public static String decodeBase64String(String decodedString) {
if (StringUtils.isBlank(decodedString)) {
return decodedString;
}
byte[] decode = Base64.getDecoder().decode(decodedString.getBytes(StandardCharsets.UTF_8));
return new String(decode, StandardCharsets.UTF_8);
}
} }

View File

@@ -5,6 +5,7 @@ import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.media.Content; import io.swagger.v3.oas.annotations.media.Content;
import io.swagger.v3.oas.annotations.media.ExampleObject; import io.swagger.v3.oas.annotations.media.ExampleObject;
import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.responses.ApiResponse;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.validation.Valid; import jakarta.validation.Valid;
import net.gepafin.tendermanagement.model.request.CreateCallRequest; import net.gepafin.tendermanagement.model.request.CreateCallRequest;
import net.gepafin.tendermanagement.model.response.CreateCallResponseBean; import net.gepafin.tendermanagement.model.response.CreateCallResponseBean;
@@ -29,7 +30,7 @@ public interface CallApi {
@ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) @ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) }))
}) })
@PostMapping(value = "", produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE) @PostMapping(value = "", produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<Response<CreateCallResponseBean>> createCall( public ResponseEntity<Response<CreateCallResponseBean>> createCall(HttpServletRequest request,
@Parameter(description = "Call request object", required = true) @Parameter(description = "Call request object", required = true)
@Valid @RequestBody CreateCallRequest createCallRequest); @Valid @RequestBody CreateCallRequest createCallRequest);

View File

@@ -1,5 +1,6 @@
package net.gepafin.tendermanagement.web.rest.api.impl; package net.gepafin.tendermanagement.web.rest.api.impl;
import jakarta.servlet.http.HttpServletRequest;
import net.gepafin.tendermanagement.config.Translator; import net.gepafin.tendermanagement.config.Translator;
import net.gepafin.tendermanagement.constants.GepafinConstant; import net.gepafin.tendermanagement.constants.GepafinConstant;
import net.gepafin.tendermanagement.model.request.CreateCallRequest; import net.gepafin.tendermanagement.model.request.CreateCallRequest;
@@ -26,8 +27,8 @@ public class CallApiController implements CallApi {
@Override @Override
@Transactional(rollbackFor=Exception.class) @Transactional(rollbackFor=Exception.class)
public ResponseEntity<Response<CreateCallResponseBean>> createCall(CreateCallRequest createCallRequest) { public ResponseEntity<Response<CreateCallResponseBean>> createCall(HttpServletRequest request, CreateCallRequest createCallRequest) {
CreateCallResponseBean createCallResponseBean = callService.createCall(createCallRequest); CreateCallResponseBean createCallResponseBean = callService.createCall(request, createCallRequest);
return ResponseEntity.status(HttpStatus.CREATED) return ResponseEntity.status(HttpStatus.CREATED)
.body(new Response<>(createCallResponseBean, Status.SUCCESS, Translator.toLocale(GepafinConstant.CALL_CREATED_SUCCESSFULLY_MSG))); .body(new Response<>(createCallResponseBean, Status.SUCCESS, Translator.toLocale(GepafinConstant.CALL_CREATED_SUCCESSFULLY_MSG)));
} }

View File

@@ -212,7 +212,7 @@
<constraints nullable="false" foreignKeyName="fk_call_faq" references="call(id)"/> <constraints nullable="false" foreignKeyName="fk_call_faq" references="call(id)"/>
</column> </column>
<column name="user_id" type="INTEGER"> <column name="user_id" type="INTEGER">
<constraints nullable="false" foreignKeyName="fk_user_faq" references="user(id)"/> <constraints nullable="false" foreignKeyName="fk_gepafin_user_faq" references="gepafin_user(id)"/>
</column> </column>
<column name="is_visible" type="BOOLEAN"> <column name="is_visible" type="BOOLEAN">
<constraints nullable="false"/> <constraints nullable="false"/>