added userId in the faq table
This commit is contained in:
@@ -5,8 +5,10 @@ import io.jsonwebtoken.Jwts;
|
||||
import io.jsonwebtoken.SignatureAlgorithm;
|
||||
import io.jsonwebtoken.security.Keys;
|
||||
import jakarta.annotation.PostConstruct;
|
||||
import jakarta.servlet.http.HttpServletRequest;
|
||||
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.slf4j.Logger;
|
||||
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.UserDetails;
|
||||
import org.springframework.stereotype.Component;
|
||||
import org.springframework.util.StringUtils;
|
||||
|
||||
import javax.crypto.SecretKey;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
import com.google.gson.Gson;
|
||||
|
||||
import static io.micrometer.common.util.StringUtils.isEmpty;
|
||||
|
||||
|
||||
@Component
|
||||
public class TokenProvider {
|
||||
private final Logger log = LoggerFactory.getLogger(TokenProvider.class);
|
||||
@@ -35,13 +43,19 @@ public class TokenProvider {
|
||||
|
||||
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
|
||||
public void init() {
|
||||
this.key = Keys.hmacShaKeyFor(secretKey.getBytes(StandardCharsets.UTF_8));
|
||||
log.info("JWT Secret Key initialized.");
|
||||
}
|
||||
|
||||
public String createToken(Authentication authentication, Boolean rememberMe, UserEntity user) {
|
||||
public String createToken(Authentication authentication, Boolean rememberMe, UserEntity user) {
|
||||
String authorities = authentication.getAuthorities().stream()
|
||||
.map(GrantedAuthority::getAuthority)
|
||||
.collect(Collectors.joining(","));
|
||||
@@ -60,7 +74,7 @@ public class TokenProvider {
|
||||
|
||||
String payload = authentication.getName();
|
||||
if(user != null) {
|
||||
payload += ":"+user.getId();
|
||||
payload += ":"+user.getId();
|
||||
}
|
||||
|
||||
String token = Jwts.builder()
|
||||
@@ -110,4 +124,76 @@ public class TokenProvider {
|
||||
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();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -14,7 +14,6 @@ import net.gepafin.tendermanagement.enums.CallTypeEnum;
|
||||
import net.gepafin.tendermanagement.model.request.*;
|
||||
import net.gepafin.tendermanagement.model.response.*;
|
||||
import net.gepafin.tendermanagement.repositories.*;
|
||||
import net.gepafin.tendermanagement.service.AmazonS3Service;
|
||||
import net.gepafin.tendermanagement.util.DateTimeUtil;
|
||||
import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException;
|
||||
import net.gepafin.tendermanagement.web.rest.api.errors.ResourceNotFoundException;
|
||||
@@ -48,14 +47,17 @@ public class CallDao {
|
||||
@Autowired
|
||||
private CallTargetAudienceChecklistRepository callTargetAudienceChecklistRepository;
|
||||
|
||||
public CreateCallResponseBean createCall(CreateCallRequest createCallRequest) {
|
||||
@Autowired
|
||||
private UserRepository userRepository;
|
||||
|
||||
public CreateCallResponseBean createCall(CreateCallRequest createCallRequest, Long userId) {
|
||||
try {
|
||||
CreateCallResponseBean createCallResponseBean=null;
|
||||
CallEntity callEntity = convertToCallEntity(createCallRequest);
|
||||
List<EvaluationCriteriaEntity> evaluationCriteriaEntities = convertToEvaluationCriteriaEntities(createCallRequest.getCriteria(), callEntity);
|
||||
List<DocumentEntity> documentEntities = convertToDocumentEntities(createCallRequest.getDocs(), 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> checkList=convertLookUpDataEntities(createCallRequest.getAimedTo(),callEntity,LookUpDataTypeEnum.CHECKLIST);
|
||||
createCallResponseBean= assembleCreateCallResponseBean(callEntity, evaluationCriteriaEntities, documentEntities, faqEntities,imageEntities);
|
||||
@@ -125,18 +127,18 @@ public class CallDao {
|
||||
}
|
||||
|
||||
|
||||
public List<FaqEntity> convertToFaqEntities(List<FaqReq> faqReqList, CallEntity callEntity) {
|
||||
List<FaqEntity> faqEntities = faqReqList.stream().map(req -> convertToFaqEntity(req, callEntity)).collect(Collectors.toList());
|
||||
public List<FaqEntity> convertToFaqEntities(List<FaqReq> faqReqList, CallEntity callEntity, Long userId) {
|
||||
List<FaqEntity> faqEntities = faqReqList.stream().map(req -> convertToFaqEntity(req, callEntity, userId)).collect(Collectors.toList());
|
||||
faqRepository.saveAll(faqEntities);
|
||||
return faqEntities;
|
||||
}
|
||||
|
||||
private FaqEntity convertToFaqEntity(FaqReq faqReq, CallEntity callEntity) {
|
||||
private FaqEntity convertToFaqEntity(FaqReq faqReq, CallEntity callEntity, Long userId) {
|
||||
FaqEntity faqEntity = new FaqEntity();
|
||||
validateFaqEntity(faqReq.getQuestion());
|
||||
// UserEntity userEntity= userRepository.findById(1l)
|
||||
// .orElseThrow(() -> new ResourceNotFoundException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.LOOK_UP_DATA_NOT_VALID_MSG)));
|
||||
// faqEntity.setUser(userEntity);
|
||||
UserEntity userEntity= userRepository.findById(userId)
|
||||
.orElseThrow(() -> new ResourceNotFoundException(Status.VALIDATION_ERROR, Translator.toLocale(GepafinConstant.LOOK_UP_DATA_NOT_VALID_MSG)));
|
||||
faqEntity.setUser(userEntity);
|
||||
faqEntity.setIsVisible(true);
|
||||
if(faqReq.getIsVisible()!=null){
|
||||
faqEntity.setIsVisible(faqReq.getIsVisible());
|
||||
|
||||
@@ -1,10 +1,11 @@
|
||||
package net.gepafin.tendermanagement.service;
|
||||
|
||||
import jakarta.servlet.http.HttpServletRequest;
|
||||
import net.gepafin.tendermanagement.model.request.CreateCallRequest;
|
||||
import net.gepafin.tendermanagement.model.response.CreateCallResponseBean;
|
||||
|
||||
public interface CallService {
|
||||
|
||||
CreateCallResponseBean createCall(CreateCallRequest createCallRequest);
|
||||
CreateCallResponseBean createCall(HttpServletRequest request, CreateCallRequest createCallRequest);
|
||||
|
||||
}
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
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.model.request.CreateCallRequest;
|
||||
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.stereotype.Service;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
|
||||
@Service
|
||||
public class CallServiceImpl implements CallService {
|
||||
@@ -14,8 +18,12 @@ public class CallServiceImpl implements CallService {
|
||||
@Autowired
|
||||
private CallDao callDao;
|
||||
|
||||
@Autowired
|
||||
private TokenProvider tokenProvider;
|
||||
|
||||
@Override
|
||||
public CreateCallResponseBean createCall(CreateCallRequest createCallRequest) {
|
||||
return callDao.createCall(createCallRequest);
|
||||
public CreateCallResponseBean createCall(HttpServletRequest request, CreateCallRequest createCallRequest) {
|
||||
Map<String, Object> userInfo= tokenProvider.getUserInfoAndUserIdFromToken(request);
|
||||
return callDao.createCall(createCallRequest, Long.parseLong(userInfo.get("userId").toString()));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,9 +3,12 @@ package net.gepafin.tendermanagement.util;
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
import com.fasterxml.jackson.databind.DeserializationFeature;
|
||||
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
|
||||
import io.micrometer.common.util.StringUtils;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.util.Base64;
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
@@ -58,5 +61,12 @@ public class Utils {
|
||||
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);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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.ExampleObject;
|
||||
import io.swagger.v3.oas.annotations.responses.ApiResponse;
|
||||
import jakarta.servlet.http.HttpServletRequest;
|
||||
import jakarta.validation.Valid;
|
||||
import net.gepafin.tendermanagement.model.request.CreateCallRequest;
|
||||
import net.gepafin.tendermanagement.model.response.CreateCallResponseBean;
|
||||
@@ -29,7 +30,7 @@ public interface CallApi {
|
||||
@ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) }))
|
||||
})
|
||||
@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)
|
||||
@Valid @RequestBody CreateCallRequest createCallRequest);
|
||||
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
package net.gepafin.tendermanagement.web.rest.api.impl;
|
||||
|
||||
import jakarta.servlet.http.HttpServletRequest;
|
||||
import net.gepafin.tendermanagement.config.Translator;
|
||||
import net.gepafin.tendermanagement.constants.GepafinConstant;
|
||||
import net.gepafin.tendermanagement.model.request.CreateCallRequest;
|
||||
@@ -26,8 +27,8 @@ public class CallApiController implements CallApi {
|
||||
|
||||
@Override
|
||||
@Transactional(rollbackFor=Exception.class)
|
||||
public ResponseEntity<Response<CreateCallResponseBean>> createCall(CreateCallRequest createCallRequest) {
|
||||
CreateCallResponseBean createCallResponseBean = callService.createCall(createCallRequest);
|
||||
public ResponseEntity<Response<CreateCallResponseBean>> createCall(HttpServletRequest request, CreateCallRequest createCallRequest) {
|
||||
CreateCallResponseBean createCallResponseBean = callService.createCall(request, createCallRequest);
|
||||
return ResponseEntity.status(HttpStatus.CREATED)
|
||||
.body(new Response<>(createCallResponseBean, Status.SUCCESS, Translator.toLocale(GepafinConstant.CALL_CREATED_SUCCESSFULLY_MSG)));
|
||||
}
|
||||
|
||||
@@ -212,7 +212,7 @@
|
||||
<constraints nullable="false" foreignKeyName="fk_call_faq" references="call(id)"/>
|
||||
</column>
|
||||
<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 name="is_visible" type="BOOLEAN">
|
||||
<constraints nullable="false"/>
|
||||
|
||||
Reference in New Issue
Block a user