Updated Apis, Code, Configurations for Notification.

This commit is contained in:
piyushkag
2024-12-24 16:07:42 +05:30
parent db48cf9502
commit 96b57519fb
23 changed files with 278 additions and 201 deletions

View File

@@ -23,10 +23,7 @@ public class TendermanagementApplication {
@Override
public void addCorsMappings(CorsRegistry registry) {
//remove after testing
//add url for a demo html and js project created on Vs code and ran it from go live on right bottim corner user gepafin_dev_local backup DB for gettng notification on FE.
registry.addMapping("/**").allowedOrigins("http://127.0.0.1:5500", "http://localhost:3000", "http://localhost:5500")
.allowedMethods("GET", "POST", "PUT", "DELETE", "HEAD").allowCredentials(true);
registry.addMapping("/**").allowedOrigins("http://localhost:3000").allowedMethods("GET", "POST", "PUT", "DELETE", "HEAD").allowCredentials(true);
}
}

View File

@@ -1,5 +1,6 @@
package net.gepafin.tendermanagement.config;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.messaging.simp.config.MessageBrokerRegistry;
import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker;
@@ -10,23 +11,28 @@ import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerCo
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {
@Value("${spring.rabbitmq.host}")
private String relayHost;
@Value("${spring.rabbitmq.port}")
private int relayPort;
@Value("${spring.rabbitmq.username}")
private String clientUserName;
@Value("${spring.rabbitmq.password}")
private String clientPassword;
@Override
public void configureMessageBroker(MessageBrokerRegistry config) {
// Enable a simple broker for both /topic (broadcast messages) and /queue (user-specific messages)
config.enableStompBrokerRelay("/topic")
.setRelayHost("localhost")
.setRelayPort(61613) // RabbitMQ is running on port 61613
.setClientLogin("guest")
.setClientPasscode("guest");
// Prefix for application messages (user sends messages to /app endpoints)
config.enableStompBrokerRelay("/topic").setRelayHost(relayHost).setRelayPort(relayPort).setClientLogin(clientUserName).setClientPasscode(clientPassword);
config.setApplicationDestinationPrefixes("/app");
}
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/gs-guide-websocket").setAllowedOrigins("http://127.0.0.1:5501/", "http://localhost:5500", "http://localhost:5501", "http://127.0.0.1:5500/")
.withSockJS();
registry.addEndpoint("/wss").setAllowedOrigins("http://localhost:3000").withSockJS();
}
}

View File

@@ -1,7 +1,5 @@
package net.gepafin.tendermanagement.constants;
import com.amazonaws.services.dynamodbv2.xspec.S;
public class GepafinConstant {
public static final String USER_CREATED_SUCCESS_MSG = "user.created.success";
@@ -353,8 +351,7 @@ public class GepafinConstant {
public static final String NOTIFICATION_ALREADY_IN_THAT_STATE="notification.already.in.state";
public static final String NOTIFICATION_DELETED_SUCCESSFULLY="notification.deleted.successfully";
public static final String NOTIFICATION_UPDATED_SUCCESSFULLY="notification.updated.successfully";
public static final String USER_WITH_COMPANY_NOT_FOUND = "user.with.company.not.found";
}

View File

@@ -51,6 +51,7 @@ import net.gepafin.tendermanagement.web.rest.api.errors.Status;
import static net.gepafin.tendermanagement.enums.RoleStatusEnum.ROLE_SUPER_ADMIN;
import static net.gepafin.tendermanagement.util.Utils.setIfUpdated;
import static org.hibernate.internal.util.collections.CollectionHelper.listOf;
@Component
public class CallDao {
@@ -845,7 +846,8 @@ public class CallDao {
Map<String, String> placeholders = new HashMap<>();
placeholders.put("{{call_name}}", callEntity.getName());
userIds.forEach(userId -> {
NotificationReq notificationReq = notificationDao.createNotificationReq(NotificationTypeEnum.CALL_CREATED.getValue(), placeholders, userId);
List<Long> companyIds = notificationDao.getAllCompanyIdsForUser(userId);
NotificationReq notificationReq = notificationDao.createNotificationReq(NotificationTypeEnum.CALL_CREATED.getValue(), placeholders, userId, null, companyIds);
notificationDao.sendNotification(notificationReq);
});

View File

@@ -1,6 +1,5 @@
package net.gepafin.tendermanagement.dao;
import jakarta.servlet.http.HttpServletRequest;
import lombok.extern.slf4j.Slf4j;
import net.gepafin.tendermanagement.config.Translator;
import net.gepafin.tendermanagement.constants.GepafinConstant;
@@ -19,6 +18,7 @@ import net.gepafin.tendermanagement.repositories.NotificationRepository;
import net.gepafin.tendermanagement.repositories.NotificationTypeRepository;
import net.gepafin.tendermanagement.repositories.UserRepository;
import net.gepafin.tendermanagement.repositories.UserWithCompanyRepository;
import net.gepafin.tendermanagement.service.ApplicationService;
import net.gepafin.tendermanagement.util.DateTimeUtil;
import net.gepafin.tendermanagement.util.Utils;
import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException;
@@ -34,6 +34,8 @@ import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import static org.hibernate.internal.util.collections.CollectionHelper.listOf;
@Component
@Slf4j
public class NotificationDao {
@@ -56,6 +58,9 @@ public class NotificationDao {
@Autowired
private CompanyDao companyDao;
@Autowired
private ApplicationService applicationService;
public NotificationResponse sendNotification(NotificationReq notificationReq) {
// Ensure userId is properly set in notificationReq if not already
@@ -79,40 +84,50 @@ public class NotificationDao {
private NotificationEntity saveNotification(NotificationReq notificationReq) {
NotificationEntity notificationEntity = convertToNotificationEntity(notificationReq);
return notificationRepository.save(notificationEntity);
return notificationRepository.save(convertNotificationRequestToNotificationEntity(notificationReq));
}
private void sendToUser(Long userId, NotificationEntity notificationEntity) {
String userChannel = GepafinConstant.COMMON_SINGLE_CHANNEL_PREFIX + userId;
log.info("Channel for User {}", userChannel);
messagingTemplate.convertAndSend(userChannel, notificationEntity);
NotificationResponse notificationResponse = convertNotificationEntityToNotificationResponse(notificationEntity);
messagingTemplate.convertAndSend(userChannel, notificationResponse);
}
private void sendToCompanies(Long userId, List<Long> companyIds, NotificationEntity notificationEntity) {
// Send notification to each company provided in the companyIds list
companyIds.forEach(companyId -> {
UserWithCompanyEntity userWithCompany = userWithCompanyRepository.findByUserIdAndCompanyIdAndIsDeletedFalseForNotification(userId, companyId);
String companyChannel = Utils.createChannelForUserAndCompany(userId, companyId);
log.info("Channel for User and Company {}, {}", userId, companyChannel);
messagingTemplate.convertAndSend(companyChannel, notificationEntity);
if (userWithCompany == null) {
throw new CustomValidationException(Status.BAD_REQUEST, GepafinConstant.USER_WITH_COMPANY_NOT_FOUND);
}
notificationEntity.setUserWithCompany(userWithCompany);
notificationRepository.save(notificationEntity);
NotificationResponse notificationResponse = convertNotificationEntityToNotificationResponse(notificationEntity);
messagingTemplate.convertAndSend(companyChannel, notificationResponse);
});
}
private NotificationReq convertToNotificationReq(NotificationEntity notificationEntity) {
NotificationReq notificationReq = new NotificationReq();
notificationReq.setId(notificationEntity.getId());
notificationReq.setUserId(notificationEntity.getUserId());
notificationReq.setStatus(NotificationEnum.UNREAD.getValue());
notificationReq.setMessage(notificationEntity.getMessage());
notificationReq.setCreatedDate(notificationEntity.getCreatedDate());
notificationReq.setUpdatedDate(notificationEntity.getUpdatedDate());
return notificationReq;
private NotificationResponse convertNotificationEntityToNotificationResponse(NotificationEntity notificationEntity) {
NotificationResponse notificationResponse = new NotificationResponse();
notificationResponse.setId(notificationEntity.getId());
notificationResponse.setUserId(notificationEntity.getUserId());
notificationResponse.setStatus(notificationEntity.getStatus());
notificationResponse.setMessage(notificationEntity.getMessage());
notificationResponse.setCreatedDate(notificationEntity.getCreatedDate());
notificationResponse.setUpdatedDate(notificationEntity.getUpdatedDate());
notificationResponse.setRedirectUrl(notificationEntity.getNotificationType());
notificationResponse.setCompanyId(notificationEntity.getUserWithCompany() != null ? notificationEntity.getUserWithCompany().getCompanyId() : null);
notificationResponse.setNotificationType(notificationEntity.getNotificationType());
notificationResponse.setTitle(notificationEntity.getTitle());
return notificationResponse;
}
private NotificationEntity convertToNotificationEntity(NotificationReq notificationReq) {
private NotificationEntity convertNotificationRequestToNotificationEntity(NotificationReq notificationReq) {
NotificationEntity notificationEntity = new NotificationEntity();
String message = notificationReq.getMessage();
@@ -120,53 +135,73 @@ public class NotificationDao {
notificationEntity.setUserId(notificationReq.getUserId());
notificationEntity.setStatus(NotificationEnum.UNREAD.getValue());
notificationEntity.setIsDeleted(Boolean.FALSE);
notificationEntity.setUserWithCompany(notificationReq.getUserWithCompanyEntity() != null ? notificationReq.getUserWithCompanyEntity() : null);
notificationEntity.setMessage(message);
notificationEntity.setTitle(notificationReq.getTitle());
return notificationEntity;
}
public NotificationReq createNotificationReq(String notificationType, Map<String, String> placeholders, Long userId) {
public NotificationReq createNotificationReq(String notificationType, Map<String, String> placeholders, Long userId, UserWithCompanyEntity userWithCompanyEntity,
List<Long> companyIds) {
// Create NotificationReq object
NotificationReq notificationReq = new NotificationReq();
List<Long> companyIds = userWithCompanyRepository.findActiveCompanyIdsByUserId(notificationReq.getUserId());
notificationReq.setCompanyIds(companyIds);
NotificationTypeEntity notificationTypeEntity = notificationTypeRepository.findByNotificationNameAndIsDeletedFalse(notificationType);
notificationReq.setNotificationType(notificationType);
String message = Utils.replacePlaceholders(notificationTypeEntity.getJsonTemplate(), placeholders);
notificationReq.setMessage(message);
notificationReq.setUserId(userId);
notificationReq.setCompanyIds(companyIds);
String title = Utils.replacePlaceholders(notificationTypeEntity.getTitle(), placeholders);
notificationReq.setTitle(title);
notificationReq.setUserWithCompanyEntity(userWithCompanyEntity);
return notificationReq;
}
public Map<String, String> sendNotificationToBeneficiary(ApplicationEntity application, NotificationTypeEnum notificationTypeEnum) {
Map<String, String> placeHolders = new HashMap<>();
placeHolders.put("{{call_name}}", application.getCall().getName());
placeHolders.put("{{protocol_number}}", String.valueOf(application.getProtocol().getProtocolNumber()));
NotificationReq notificationReq = createNotificationReq(notificationTypeEnum.getValue(), placeHolders, application.getUserId());
NotificationReq notificationReq = createNotificationReq(notificationTypeEnum.getValue(), placeHolders, application.getUserId(), application.getUserWithCompany(),
listOf(application.getCompanyId()));
sendNotification(notificationReq);
return placeHolders;
}
public void sendNotificationToInstructor(Map<String, String> placeHolders, ApplicationEvaluationEntity applicationEvaluationEntity, NotificationTypeEnum notificationTypeEnum) {
Long instructorId = applicationEvaluationEntity.getUserId();
ApplicationEntity application = applicationService.validateApplication(applicationEvaluationEntity.getApplicationId());
if (instructorId != null) {
NotificationReq notificationreq = createNotificationReq(notificationTypeEnum.getValue(), placeHolders,instructorId);
NotificationReq notificationreq = createNotificationReq(notificationTypeEnum.getValue(), placeHolders, instructorId, application.getUserWithCompany(),
listOf(application.getCompanyId()));
sendNotification(notificationreq);
}
}
public void sendNotificationToSuperUser(ApplicationEntity application, Map<String, String> placeHolders, NotificationTypeEnum notificationTypeEnum) {
List<UserEntity> user = userRepository.findByRoleEntity_RoleTypeAndHubId(RoleStatusEnum.ROLE_SUPER_ADMIN.getValue(), application.getHubId());
UserEntity userEntity1 = user.get(0);
if (userEntity1 != null) {
NotificationReq notificationreq = createNotificationReq(notificationTypeEnum.getValue(), placeHolders,userEntity1.getId());
NotificationReq notificationreq = createNotificationReq(notificationTypeEnum.getValue(), placeHolders, userEntity1.getId(), application.getUserWithCompany(),
listOf(application.getCompanyId()));
sendNotification(notificationreq);
}
}
public List<Long> getAllCompanyIdsForUser(Long userId) {
return userWithCompanyRepository.findActiveCompanyIdsByUserId(userId);
}
public NotificationResponse getNotificationById(Long id) {
NotificationEntity notificationEntity = validateNotificationEntity(id);
NotificationResponse notificationReq=convertNotificationEntityToNotificationResponse(notificationEntity);
return notificationReq;
return convertNotificationEntityToNotificationResponse(notificationEntity);
}
private NotificationEntity validateNotificationEntity(Long id) {
NotificationEntity notificationEntity = notificationRepository.findByIdAndIsDeletedFalse(id);
if (notificationEntity == null) {
throw new CustomValidationException(Status.NOT_FOUND, Translator.toLocale(GepafinConstant.NOTIFICATION_NOT_FOUND));
@@ -175,6 +210,7 @@ public class NotificationDao {
}
public List<NotificationResponse> getNotificationByUserId(Long userId, Long companyId, List<NotificationEnum> statuses) {
List<NotificationEntity> notificationEntities = notificationRepository.findByUserIdAndIsDeletedFalse(userId);
UserWithCompanyEntity userWithCompany = null;
List<String> statusStrings = new ArrayList<>();
@@ -183,8 +219,7 @@ public class NotificationDao {
}
if (statuses != null) {
statusStrings = statuses.stream()
.map(NotificationEnum::name) // Convert enum to its name as String
statusStrings = statuses.stream().map(NotificationEnum::name) // Convert enum to its name as String
.toList();
notificationEntities = notificationRepository.findByUserIdAndIsDeletedFalseAndStatusIn(userId, statusStrings);
@@ -193,32 +228,11 @@ public class NotificationDao {
}
}
List<NotificationResponse> notificationReq= notificationEntities.stream()
.map(this::convertNotificationEntityToNotificationResponse)
.collect(Collectors.toList());
return notificationReq;
return notificationEntities.stream().map(this::convertNotificationEntityToNotificationResponse).collect(Collectors.toList());
}
public NotificationResponse convertNotificationEntityToNotificationResponse(NotificationEntity entity) {
if (entity == null) {
return null; // Handle null entity gracefully
}
NotificationResponse response = new NotificationResponse();
response.setId(entity.getId());
response.setUserId(entity.getUserId());
response.setMessage(entity.getMessage());
response.setNotificationType(entity.getNotificationType());
response.setStatus(entity.getStatus());
response.setCreatedDate(entity.getCreatedDate());
response.setUpdatedDate(entity.getUpdatedDate());
response.setRedirectUrl(entity.getRedirectLink());
response.setCompanyId(entity.getUserWithCompanyId());
return response;
}
public NotificationResponse updateNotificationStatus(Long id, NotificationEnum status) {
NotificationEntity notificationEntity = validateNotificationEntity(id);
if (notificationEntity.getStatus().equals(status.getValue())) {
throw new CustomValidationException(Status.BAD_REQUEST, Translator.toLocale(GepafinConstant.NOTIFICATION_ALREADY_IN_THAT_STATE));
@@ -230,6 +244,7 @@ public class NotificationDao {
}
public void deleteNotification(Long id) {
NotificationEntity notificationEntity = validateNotificationEntity(id);
notificationEntity.setIsDeleted(true);
notificationRepository.save(notificationEntity);

View File

@@ -2,6 +2,8 @@ package net.gepafin.tendermanagement.entities;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.ManyToOne;
import jakarta.persistence.Table;
import lombok.Data;
@@ -11,23 +13,27 @@ import lombok.Data;
public class NotificationEntity extends BaseEntity {
@Column(name = "USER_ID")
Long userId;
private Long userId;
@Column(name = "MESSAGE")
String message;
private String message;
@Column(name = "TITLE")
private String title;
@Column(name = "STATUS")
String status;
private String status;
@Column(name = "IS_DELETED")
Boolean isDeleted;
private Boolean isDeleted;
@Column(name = "NOTIFICATION_TYPE")
String notificationType;
private String notificationType;
@Column(name = "REDIRECT_LINK")
String redirectLink;
private String redirectLink;
@Column(name = "USER_WITH_COMPANY_ID")
Long userWithCompanyId;
@ManyToOne
@JoinColumn(name = "USER_WITH_COMPANY_ID")
private UserWithCompanyEntity userWithCompany;
}

View File

@@ -11,10 +11,13 @@ import lombok.Data;
public class NotificationTypeEntity extends BaseEntity {
@Column(name = "NOTIFICATION_NAME")
String notificationName;
private String notificationName;
@Column(name = "JSON_TEMPLATE")
String jsonTemplate;
private String jsonTemplate;
@Column(name = "TITLE")
private String title;
@Column(name="IS_DELETED")
private Boolean isDeleted;

View File

@@ -1,7 +1,9 @@
package net.gepafin.tendermanagement.model.request;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import net.gepafin.tendermanagement.entities.UserWithCompanyEntity;
import java.time.LocalDateTime;
import java.util.List;
@@ -30,8 +32,14 @@ public class NotificationReq {
private LocalDateTime updatedDate;
@JsonProperty(access = JsonProperty.Access.READ_ONLY)
String redirectUrl;
private String redirectUrl;
@JsonProperty(access = JsonProperty.Access.READ_ONLY)
List<Long> companyIds;
private String title;
@JsonProperty(access = JsonProperty.Access.READ_ONLY)
private List<Long> companyIds;
@JsonIgnore
private UserWithCompanyEntity userWithCompanyEntity;
}

View File

@@ -1,18 +1,21 @@
package net.gepafin.tendermanagement.model.response;
import lombok.Data;
import java.time.LocalDateTime;
import net.gepafin.tendermanagement.model.BaseBean;
@Data
public class NotificationResponse {
private Long id;
public class NotificationResponse extends BaseBean {
private Long userId;
private String title;
private String message;
private String notificationType;
private String status;
private LocalDateTime createdDate;
private LocalDateTime updatedDate;
private String redirectUrl;
private Long companyId;
private String redirectUrl;
private String notificationType;
}

View File

@@ -1,7 +1,6 @@
package net.gepafin.tendermanagement.repositories;
import net.gepafin.tendermanagement.entities.NotificationEntity;
import net.gepafin.tendermanagement.enums.NotificationTypeEnum;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.List;
@@ -12,8 +11,7 @@ public interface NotificationRepository extends JpaRepository<NotificationEntity
List<NotificationEntity> findByUserIdAndIsDeletedFalse(Long userId);
List<NotificationEntity> findByUserIdAndUserWithCompanyIdAndIsDeletedFalseAndStatusIn(Long userId,Long
userWithCompanyId,List<String> statuses);
List<NotificationEntity> findByUserIdAndUserWithCompanyIdAndIsDeletedFalseAndStatusIn(Long userId, Long userWithCompanyId, List<String> statuses);
List<NotificationEntity> findByUserIdAndIsDeletedFalseAndStatusIn(Long userId, List<String> statuses);
}

View File

@@ -1,14 +1,12 @@
package net.gepafin.tendermanagement.repositories;
import java.util.List;
import java.util.Optional;
import net.gepafin.tendermanagement.entities.UserWithCompanyEntity;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import net.gepafin.tendermanagement.entities.UserWithCompanyEntity;
import java.util.List;
import java.util.Optional;
public interface UserWithCompanyRepository extends JpaRepository<UserWithCompanyEntity, Long> {
@@ -19,4 +17,7 @@ public interface UserWithCompanyRepository extends JpaRepository<UserWithCompany
Optional<UserWithCompanyEntity> findByUserIdAndCompanyIdAndIsDeletedFalse(Long userId, Long companyId);
@Query("SELECT u FROM UserWithCompanyEntity u WHERE u.userId = :userId AND u.companyId = :companyId AND u.isDeleted = false")
UserWithCompanyEntity findByUserIdAndCompanyIdAndIsDeletedFalseForNotification(Long userId, Long companyId);
}

View File

@@ -8,7 +8,7 @@ import net.gepafin.tendermanagement.model.response.NotificationResponse;
import java.util.List;
public interface NotificationService {
NotificationResponse sendNotification(Long userId, NotificationReq notificationReq);
NotificationResponse sendNotification(Long userId, NotificationReq notificationReq, Long companyId);
public NotificationResponse getNotificationById(HttpServletRequest servletRequest, Long id);

View File

@@ -12,6 +12,8 @@ import org.springframework.stereotype.Service;
import java.util.List;
import static org.hibernate.internal.util.collections.CollectionHelper.listOf;
@Service
@Slf4j
public class NotificationServiceImpl implements NotificationService {
@@ -20,31 +22,35 @@ public class NotificationServiceImpl implements NotificationService {
private NotificationDao notificationDao;
@Override
public NotificationResponse sendNotification(Long userId, NotificationReq notificationReq) {
public NotificationResponse sendNotification(Long userId, NotificationReq notificationReq, Long companyId) {
log.info("Sending notification to user {} with content: {}", userId, notificationReq.getMessage());
notificationReq.setUserId(userId);
NotificationResponse notificationResponse = notificationDao.sendNotification(notificationReq);
return notificationResponse;
notificationReq.setCompanyIds(listOf(companyId));
return notificationDao.sendNotification(notificationReq);
}
@Override
public NotificationResponse getNotificationById(HttpServletRequest servletRequest, Long id) {
return notificationDao.getNotificationById(id);
}
@Override
public List<NotificationResponse> getNotificationByUserId(HttpServletRequest servletRequest, Long userId, Long companyId, List<NotificationEnum> statuses) {
return notificationDao.getNotificationByUserId(userId, companyId, statuses);
}
@Override
public NotificationResponse updateNotificationStatus(HttpServletRequest request, Long id, NotificationEnum status) {
return notificationDao.updateNotificationStatus(id, status);
}
@Override
public void deleteNotification(HttpServletRequest request, Long id) {
notificationDao.deleteNotification(id);
return;
}

View File

@@ -19,19 +19,15 @@ import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.databind.node.ObjectNode;
import io.jsonwebtoken.Claims;
import jakarta.persistence.ManyToMany;
import jakarta.persistence.ManyToOne;
import jakarta.persistence.OneToMany;
import jakarta.persistence.OneToOne;
import jakarta.servlet.http.HttpServletRequest;
import net.gepafin.tendermanagement.config.Translator;
import net.gepafin.tendermanagement.constants.GepafinConstant;
import net.gepafin.tendermanagement.web.rest.api.errors.CustomValidationException;
import org.apache.commons.collections4.MapUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import com.fasterxml.jackson.core.JsonProcessingException;
@@ -48,7 +44,6 @@ import net.gepafin.tendermanagement.web.rest.api.errors.FeignClientForbiddenExce
import net.gepafin.tendermanagement.web.rest.api.errors.FeignClientNotFoundException;
import net.gepafin.tendermanagement.web.rest.api.errors.FeignClientUnauthorizedException;
import net.gepafin.tendermanagement.web.rest.api.errors.FeignClientValidationException;
import org.springframework.http.MediaType;
import org.springframework.mock.web.MockHttpServletRequest;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

View File

@@ -7,10 +7,7 @@ import io.swagger.v3.oas.annotations.media.ExampleObject;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import jakarta.servlet.http.HttpServletRequest;
import net.gepafin.tendermanagement.enums.NotificationEnum;
import net.gepafin.tendermanagement.enums.NotificationTypeEnum;
import net.gepafin.tendermanagement.model.request.NotificationReq;
import net.gepafin.tendermanagement.model.response.ApplicationGetResponseBean;
import net.gepafin.tendermanagement.model.response.LookUpDataResponseBean;
import net.gepafin.tendermanagement.model.response.NotificationResponse;
import net.gepafin.tendermanagement.model.util.Response;
import net.gepafin.tendermanagement.web.rest.api.errors.ErrorConstants;
@@ -36,11 +33,10 @@ public interface NotificationApi {
ErrorConstants.BADREQUEST_ERROR_EXAMPLE))) })
@PostMapping(value = "/user/{userId}/sent", consumes = "application/json", produces = "application/json")
ResponseEntity<Response<NotificationResponse>> sendNotification(HttpServletRequest request, @RequestBody NotificationReq notificationReq,
@Parameter(description = "The company id", required = false) @RequestParam(value = "companyId", required = false) Long companyId,
@Parameter(description = "The user id", required = true) @PathVariable("userId") Long userId);
@Operation(summary = "Api to get notification by id",
responses = {
@ApiResponse(responseCode = "200", description = "OK"),
@Operation(summary = "Api to get notification by id", responses = { @ApiResponse(responseCode = "200", description = "OK"),
@ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = {
@ExampleObject(value = ErrorConstants.NOTFOUND_ERROR_EXAMPLE) })),
@ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = {
@@ -48,11 +44,10 @@ public interface NotificationApi {
@ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = {
@ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) })
@GetMapping(value = "/{id}", produces = "application/json")
ResponseEntity<Response<NotificationResponse>> getNotificationById(HttpServletRequest request, @Parameter(description = "The notification id", required = true) @PathVariable(value = "id", required = true) Long id);
ResponseEntity<Response<NotificationResponse>> getNotificationById(HttpServletRequest request,
@Parameter(description = "The notification id", required = true) @PathVariable(value = "id", required = true) Long id);
@Operation(summary = "Api to get notification by user id",
responses = {
@ApiResponse(responseCode = "200", description = "OK"),
@Operation(summary = "Api to get notification by user id", responses = { @ApiResponse(responseCode = "200", description = "OK"),
@ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = {
@ExampleObject(value = ErrorConstants.NOTFOUND_ERROR_EXAMPLE) })),
@ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = {
@@ -60,11 +55,12 @@ public interface NotificationApi {
@ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = {
@ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) })
@GetMapping(value = "/user/{userId}", produces = "application/json")
ResponseEntity<Response<List<NotificationResponse>>> getNotificationByUserId(HttpServletRequest request, @Parameter(description = "The user id", required = true) @PathVariable(value = "userId", required = true) Long userId,@Parameter(description = "The company id", required = false) @RequestParam(value = "companyId",required = false) Long companyId,@Parameter(description = "The notification status", required = false) @RequestParam(value = "status",required = false) List<NotificationEnum> statuses);
ResponseEntity<Response<List<NotificationResponse>>> getNotificationByUserId(HttpServletRequest request,
@Parameter(description = "The user id", required = true) @PathVariable(value = "userId", required = true) Long userId,
@Parameter(description = "The company id", required = false) @RequestParam(value = "companyId", required = false) Long companyId,
@Parameter(description = "The notification status", required = false) @RequestParam(value = "status", required = false) List<NotificationEnum> statuses);
@Operation(summary = "Api to update notification status",
responses = {
@ApiResponse(responseCode = "200", description = "OK"),
@Operation(summary = "Api to update notification status", responses = { @ApiResponse(responseCode = "200", description = "OK"),
@ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = {
@ExampleObject(value = ErrorConstants.NOTFOUND_ERROR_EXAMPLE) })),
@ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = {
@@ -72,12 +68,11 @@ public interface NotificationApi {
@ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = {
@ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) })
@PutMapping(value = "/{id}", produces = "application/json")
ResponseEntity<Response<NotificationResponse>> updateNotificationStatus(HttpServletRequest request, @Parameter(description = "The notification id", required = true) @PathVariable(value = "id", required = true) Long id,@Parameter(description = "The notification status", required = true) @RequestParam(value = "status",required = true) NotificationEnum status);
ResponseEntity<Response<NotificationResponse>> updateNotificationStatus(HttpServletRequest request,
@Parameter(description = "The notification id", required = true) @PathVariable(value = "id", required = true) Long id,
@Parameter(description = "The notification status", required = true) @RequestParam(value = "status", required = true) NotificationEnum status);
@Operation(summary = "Api to delete notification",
responses = {
@ApiResponse(responseCode = "200", description = "OK"),
@Operation(summary = "Api to delete notification", responses = { @ApiResponse(responseCode = "200", description = "OK"),
@ApiResponse(responseCode = "404", description = "Not Found", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = {
@ExampleObject(value = ErrorConstants.NOTFOUND_ERROR_EXAMPLE) })),
@ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = {
@@ -85,7 +80,8 @@ public interface NotificationApi {
@ApiResponse(responseCode = "400", description = "Bad Request", content = @Content(mediaType = MediaType.APPLICATION_JSON_VALUE, examples = {
@ExampleObject(value = ErrorConstants.BADREQUEST_ERROR_EXAMPLE) })) })
@DeleteMapping(value = "/{id}", produces = "application/json")
ResponseEntity<Response<Void>> deleteNotification(HttpServletRequest request, @Parameter(description = "The notification id", required = true) @PathVariable(value = "id", required = true) Long id);
ResponseEntity<Response<Void>> deleteNotification(HttpServletRequest request,
@Parameter(description = "The notification id", required = true) @PathVariable(value = "id", required = true) Long id);
}

View File

@@ -19,6 +19,8 @@ import org.springframework.web.bind.annotation.RestController;
import java.util.List;
import static org.hibernate.internal.util.collections.CollectionHelper.listOf;
@RestController
@RequestMapping("${openapi.gepafin.base-path:/v1/notification}")
public class NotificationApiController implements NotificationApi {
@@ -26,16 +28,16 @@ public class NotificationApiController implements NotificationApi {
@Autowired
private NotificationService notificationService;
public ResponseEntity<Response<NotificationResponse>> sendNotification(HttpServletRequest request, NotificationReq notificationReq, Long userId) {
public ResponseEntity<Response<NotificationResponse>> sendNotification(HttpServletRequest request, NotificationReq notificationReq, Long userId, Long companyId) {
NotificationResponse notificationData = notificationService.sendNotification(userId, notificationReq);
NotificationResponse notificationData = notificationService.sendNotification(userId, notificationReq, companyId);
return ResponseEntity.status(HttpStatus.OK)
.body(new Response<>(notificationData, Status.SUCCESS, Translator.toLocale(GepafinConstant.NOTIFICATION_SENT_SUCCESSFULLY)));
return ResponseEntity.status(HttpStatus.OK).body(new Response<>(notificationData, Status.SUCCESS, Translator.toLocale(GepafinConstant.NOTIFICATION_SENT_SUCCESSFULLY)));
}
@Override
public ResponseEntity<Response<NotificationResponse>> getNotificationById(HttpServletRequest request, Long id) {
NotificationResponse notificationResponse = notificationService.getNotificationById(request, id);
return ResponseEntity.status(HttpStatus.OK)
.body(new Response<>(notificationResponse, Status.SUCCESS, Translator.toLocale(GepafinConstant.NOTIFICATION_FETCHED_SUCCESSFULLY)));
@@ -43,6 +45,7 @@ public class NotificationApiController implements NotificationApi {
@Override
public ResponseEntity<Response<List<NotificationResponse>>> getNotificationByUserId(HttpServletRequest request, Long userId, Long companyId, List<NotificationEnum> statuses) {
List<NotificationResponse> notificationResponses = notificationService.getNotificationByUserId(request, userId, companyId, statuses);
return ResponseEntity.status(HttpStatus.OK)
.body(new Response<List<NotificationResponse>>(notificationResponses, Status.SUCCESS, Translator.toLocale(GepafinConstant.NOTIFICATION_FETCHED_SUCCESSFULLY)));
@@ -51,6 +54,7 @@ public class NotificationApiController implements NotificationApi {
@Override
public ResponseEntity<Response<NotificationResponse>> updateNotificationStatus(HttpServletRequest request, Long id, NotificationEnum notificationEnums) {
NotificationResponse notificationResponse = notificationService.updateNotificationStatus(request, id, notificationEnums);
return ResponseEntity.status(HttpStatus.OK)
.body(new Response<>(notificationResponse, Status.SUCCESS, Translator.toLocale(GepafinConstant.NOTIFICATION_UPDATED_SUCCESSFULLY)));
@@ -58,9 +62,9 @@ public class NotificationApiController implements NotificationApi {
@Override
public ResponseEntity<Response<Void>> deleteNotification(HttpServletRequest request, Long id) {
notificationService.deleteNotification(request, id);
return ResponseEntity.status(HttpStatus.OK)
.body(new Response<>(null, Status.SUCCESS, Translator.toLocale(GepafinConstant.NOTIFICATION_DELETED_SUCCESSFULLY)));
return ResponseEntity.status(HttpStatus.OK).body(new Response<>(null, Status.SUCCESS, Translator.toLocale(GepafinConstant.NOTIFICATION_DELETED_SUCCESSFULLY)));
}
}

View File

@@ -23,3 +23,10 @@ appointment.portal.password=u13nzaAP1P0rtal
appointment.portal.source=GEPAFINPORTAL
appointment.portal.context=GEPAFINPORTAL
flagDaFirmare=false
# RabbitMQ properties for STOMP broker relay for Notification
spring.rabbitmq.host=localhost
spring.rabbitmq.port=61613
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
spring.rabbitmq.virtual-host=/

View File

@@ -1,6 +1,6 @@
# DataSource Configuration
spring.datasource.url=jdbc:postgresql://localhost:5432/gepafin_dev_local
spring.datasource.username=root
spring.datasource.username=postgres
spring.datasource.password=root
spring.datasource.driver-class-name=org.postgresql.Driver
@@ -22,9 +22,9 @@ appointment.portal.source=GEPAFINPORTAL
appointment.portal.context=GEPAFINPORTAL
flagDaFirmare=false
# RabbitMQ properties for STOMP broker relay
# RabbitMQ properties for STOMP broker relay for Notification
spring.rabbitmq.host=localhost
spring.rabbitmq.port=5672
spring.rabbitmq.port=61613
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
spring.rabbitmq.virtual-host=/

View File

@@ -30,3 +30,10 @@ appointment.portal.password=u13nzaAP1P0rtal
appointment.portal.source=GEPAFINPORTAL
appointment.portal.context=GEPAFINPORTAL
flagDaFirmare=true
# RabbitMQ properties for STOMP broker relay for Notification
spring.rabbitmq.host=localhost
spring.rabbitmq.port=61613
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
spring.rabbitmq.virtual-host=/

View File

@@ -12,3 +12,17 @@ gepafin_email=test@test.test
rinaldo_email=test@test.test
carlo_email=test@test.test
default.hub.uuid=p4lk3bcx1RStqTaIVVbXs
appointment.base.url=https://demo.galileonetwork.it/gateway/rest
appointment.portal.user=UtenzaAPIPortal@621
appointment.portal.password=u13nzaAP1P0rtal
appointment.portal.source=GEPAFINPORTAL
appointment.portal.context=GEPAFINPORTAL
flagDaFirmare=false
# RabbitMQ properties for STOMP broker relay for Notification
spring.rabbitmq.host=localhost
spring.rabbitmq.port=61613
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
spring.rabbitmq.virtual-host=/

View File

@@ -2030,9 +2030,19 @@
<sqlFile dbms="postgresql"
path="db/dump/insert_json_template_for_notification_13_12_2024.sql"/>
</changeSet>
<changeSet id="23-12-2024" author="Piyush Kag">
<changeSet id="23-12-2024_1" author="Piyush Kag">
<addColumn tableName="notification">
<column name="user_with_company_id" type="INTEGER"></column>
<column name="USER_WITH_COMPANY_ID" type="INTEGER">
<constraints nullable="true" foreignKeyName="fk_USER_WITH_COMPANY_NOTIFICATION" references="user_with_company(id)"/>
</column>
</addColumn>
</changeSet>
<changeSet id="23-12-2024_2" author="Piyush Kag">
<addColumn tableName="notification">
<column name="title" type="TEXT"/>
</addColumn>
</changeSet>
</databaseChangeLog>

View File

@@ -343,3 +343,4 @@ notification.not.found=Notification not found.
notification.sent.successfully=Notification sent successfully.
notification.deleted.successfully=Notification deleted successfully.
notification.updated.successfully=Notification updated successfully.
user.with.company.not.found = User with company not found for user or company.

View File

@@ -333,3 +333,4 @@ notification.not.found=Notifica non trovata.
notification.sent.successfully=Notifica inviata con successo.
notification.deleted.successfully=Notifica eliminata con successo.
notification.updated.successfully=Notifica aggiornata con successo.
user.with.company.not.found = Utente con azienda non trovato per utente o azienda.