From 3775f2d0764dc55fea891d0bf15b4640b4584d19 Mon Sep 17 00:00:00 2001 From: hlaingmyoaungdeveloper Date: Fri, 20 Mar 2026 17:58:44 +0630 Subject: [PATCH] add feature --- .../com/opom/bdms/config/SecurityConfig.java | 4 +- .../controller/AnnouncementController.java | 92 +++++++++++++++++++ .../dto/request/AnnouncementFilter.java | 11 +++ .../dto/request/AnnouncementRequest.java | 17 ++++ .../dto/response/AnnouncementResponse.java | 16 ++++ .../mapper/AnnouncementMapper.java | 44 +++++++++ .../service/AnnouncementService.java | 9 ++ .../service/impl/AnnouncementServiceImpl.java | 39 ++++++++ .../controller/HospitalController.java | 91 ++++++++++++++++++ .../hospital/dto/request/HospitalFilter.java | 11 +++ .../hospital/dto/request/HospitalRequest.java | 23 +++++ .../dto/response/HospitalResponse.java | 15 +++ .../hospital/mapper/HospitalMapper.java | 45 +++++++++ .../hospital/service/HospitalService.java | 9 ++ .../service/impl/HospitalServiceImpl.java | 40 ++++++++ 15 files changed, 465 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/opom/bdms/features/announcement/controller/AnnouncementController.java create mode 100644 src/main/java/com/opom/bdms/features/announcement/dto/request/AnnouncementFilter.java create mode 100644 src/main/java/com/opom/bdms/features/announcement/dto/request/AnnouncementRequest.java create mode 100644 src/main/java/com/opom/bdms/features/announcement/dto/response/AnnouncementResponse.java create mode 100644 src/main/java/com/opom/bdms/features/announcement/mapper/AnnouncementMapper.java create mode 100644 src/main/java/com/opom/bdms/features/announcement/service/AnnouncementService.java create mode 100644 src/main/java/com/opom/bdms/features/announcement/service/impl/AnnouncementServiceImpl.java create mode 100644 src/main/java/com/opom/bdms/features/hospital/controller/HospitalController.java create mode 100644 src/main/java/com/opom/bdms/features/hospital/dto/request/HospitalFilter.java create mode 100644 src/main/java/com/opom/bdms/features/hospital/dto/request/HospitalRequest.java create mode 100644 src/main/java/com/opom/bdms/features/hospital/dto/response/HospitalResponse.java create mode 100644 src/main/java/com/opom/bdms/features/hospital/mapper/HospitalMapper.java create mode 100644 src/main/java/com/opom/bdms/features/hospital/service/HospitalService.java create mode 100644 src/main/java/com/opom/bdms/features/hospital/service/impl/HospitalServiceImpl.java diff --git a/src/main/java/com/opom/bdms/config/SecurityConfig.java b/src/main/java/com/opom/bdms/config/SecurityConfig.java index 32406e1..5e3711d 100644 --- a/src/main/java/com/opom/bdms/config/SecurityConfig.java +++ b/src/main/java/com/opom/bdms/config/SecurityConfig.java @@ -15,7 +15,9 @@ public class SecurityConfig { "/swagger-ui/**", "/swagger-ui.html", "/v3/api-docs/**", - "/api/v1/bdms/permissions/**" + "/api/v1/bdms/permissions/**", + "/api/v1/bdms/announcements/**", + "/api/v1/bdms/hospitals/**" }; @Bean diff --git a/src/main/java/com/opom/bdms/features/announcement/controller/AnnouncementController.java b/src/main/java/com/opom/bdms/features/announcement/controller/AnnouncementController.java new file mode 100644 index 0000000..3ec30bd --- /dev/null +++ b/src/main/java/com/opom/bdms/features/announcement/controller/AnnouncementController.java @@ -0,0 +1,92 @@ +package com.opom.bdms.features.announcement.controller; + +import com.opom.bdms.dto.request.PageAndFilterDTO; +import com.opom.bdms.dto.response.ApiResponse; +import com.opom.bdms.features.announcement.dto.request.AnnouncementFilter; +import com.opom.bdms.features.announcement.dto.request.AnnouncementRequest; +import com.opom.bdms.features.announcement.dto.response.AnnouncementResponse; +import com.opom.bdms.features.announcement.service.AnnouncementService; +import com.opom.bdms.util.ApiResponseUtil; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.validation.Valid; +import lombok.RequiredArgsConstructor; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@RestController +@RequiredArgsConstructor +@RequestMapping("/api/v1/bdms/announcements") +public class AnnouncementController { + + private final AnnouncementService announcementService; + + @PostMapping + public ResponseEntity create(@Valid @RequestBody AnnouncementRequest request, HttpServletRequest httpServletRequest){ + AnnouncementResponse response = announcementService.create(request); + ApiResponse apiResponse = ApiResponseUtil.created( + response, + "Announcement created successfully", + httpServletRequest + ); + return ResponseEntity.status(HttpStatus.CREATED).body(apiResponse); + } + + @PostMapping("/pageable") + public ResponseEntity getAll(@RequestBody(required = false) PageAndFilterDTO pageAndFilterDTO, HttpServletRequest httpServletRequest) { + if (pageAndFilterDTO == null) { + pageAndFilterDTO = new PageAndFilterDTO<>(); + } + var pagination = announcementService.getAll(pageAndFilterDTO); + ApiResponse apiResponse = ApiResponseUtil.paginated( + pagination, + "Announcement retrieved successfully", + httpServletRequest + ); + return ResponseEntity.ok(apiResponse); + } + + @GetMapping("/{id}") + public ResponseEntity findById(@PathVariable Long id, HttpServletRequest httpServletRequest) { + AnnouncementResponse response = announcementService.findById(id); + ApiResponse apiResponse = ApiResponseUtil.success( + response, + "Announcement retrieved successfully", + httpServletRequest + ); + return ResponseEntity.ok(apiResponse); + } + + @PutMapping("/{id}") + public ResponseEntity update(@PathVariable Long id, @Valid @RequestBody AnnouncementRequest request, HttpServletRequest httpServletRequest) { + AnnouncementResponse response = announcementService.update(id, request); + ApiResponse apiResponse = ApiResponseUtil.success( + response, + "Announcement updated successfully", + httpServletRequest + ); + return ResponseEntity.ok(apiResponse); + } + + @DeleteMapping("/{id}") + public ResponseEntity delete(@PathVariable Long id, HttpServletRequest httpServletRequest) { + announcementService.delete(id); + ApiResponse apiResponse = ApiResponseUtil.noContent( + "Announcement deleted successfully", + httpServletRequest + ); + return ResponseEntity.status(HttpStatus.NO_CONTENT).body(apiResponse); + } + + @DeleteMapping("/batch") + public ResponseEntity deleteMany(@RequestBody List ids, HttpServletRequest httpServletRequest) { + announcementService.deleteMany(ids); + ApiResponse apiResponse = ApiResponseUtil.noContent( + "Announcements deleted successfully", + httpServletRequest + ); + return ResponseEntity.status(HttpStatus.NO_CONTENT).body(apiResponse); + } +} diff --git a/src/main/java/com/opom/bdms/features/announcement/dto/request/AnnouncementFilter.java b/src/main/java/com/opom/bdms/features/announcement/dto/request/AnnouncementFilter.java new file mode 100644 index 0000000..13fb201 --- /dev/null +++ b/src/main/java/com/opom/bdms/features/announcement/dto/request/AnnouncementFilter.java @@ -0,0 +1,11 @@ +package com.opom.bdms.features.announcement.dto.request; + +import com.opom.bdms.dto.request.BaseFilter; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@Data +@EqualsAndHashCode(callSuper = true) +public class AnnouncementFilter extends BaseFilter { + private String title; +} diff --git a/src/main/java/com/opom/bdms/features/announcement/dto/request/AnnouncementRequest.java b/src/main/java/com/opom/bdms/features/announcement/dto/request/AnnouncementRequest.java new file mode 100644 index 0000000..f6eac25 --- /dev/null +++ b/src/main/java/com/opom/bdms/features/announcement/dto/request/AnnouncementRequest.java @@ -0,0 +1,17 @@ +package com.opom.bdms.features.announcement.dto.request; + +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; + +import java.time.LocalDate; + +public record AnnouncementRequest( + @NotBlank(message = "Title is required") + String title, + + @NotBlank(message = "Content is required") + String content, + + @NotNull(message = "Expired Date is required") + LocalDate expiredAt +) {} diff --git a/src/main/java/com/opom/bdms/features/announcement/dto/response/AnnouncementResponse.java b/src/main/java/com/opom/bdms/features/announcement/dto/response/AnnouncementResponse.java new file mode 100644 index 0000000..4518305 --- /dev/null +++ b/src/main/java/com/opom/bdms/features/announcement/dto/response/AnnouncementResponse.java @@ -0,0 +1,16 @@ +package com.opom.bdms.features.announcement.dto.response; + + +import com.opom.bdms.dto.response.MasterData; +import lombok.Builder; + +import java.time.LocalDate; + +@Builder +public record AnnouncementResponse( + Long id, + String title, + String content, + LocalDate expiredAt, + MasterData masterData +) {} diff --git a/src/main/java/com/opom/bdms/features/announcement/mapper/AnnouncementMapper.java b/src/main/java/com/opom/bdms/features/announcement/mapper/AnnouncementMapper.java new file mode 100644 index 0000000..8fa3880 --- /dev/null +++ b/src/main/java/com/opom/bdms/features/announcement/mapper/AnnouncementMapper.java @@ -0,0 +1,44 @@ +package com.opom.bdms.features.announcement.mapper; + +import com.opom.bdms.entity.Announcement; +import com.opom.bdms.entity.Permission; +import com.opom.bdms.features.announcement.dto.request.AnnouncementRequest; +import com.opom.bdms.features.announcement.dto.response.AnnouncementResponse; +import com.opom.bdms.features.permission.dto.request.PermissionRequest; +import com.opom.bdms.mapper.MasterDataMapper; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; + +@Component +@RequiredArgsConstructor +public class AnnouncementMapper { + + private final MasterDataMapper masterDataMapper; + + public Announcement toEntity(AnnouncementRequest request){ + Announcement entity = new Announcement(); + entity.setTitle(request.title()); + entity.setContent(request.content()); + entity.setExpiredAt(request.expiredAt()); + + return entity; + } + + public AnnouncementResponse toResponse(Announcement entity){ + if(entity == null){ + return null; + } + + return AnnouncementResponse.builder() + .id(entity.getId()) + .title(entity.getTitle()) + .content(entity.getContent()) + .masterData(masterDataMapper.toMasterData(entity)) + .build(); + } + + public void updateEntity(Announcement entity, AnnouncementRequest request) { + entity.setTitle(request.title()); + } + +} diff --git a/src/main/java/com/opom/bdms/features/announcement/service/AnnouncementService.java b/src/main/java/com/opom/bdms/features/announcement/service/AnnouncementService.java new file mode 100644 index 0000000..1ab41e7 --- /dev/null +++ b/src/main/java/com/opom/bdms/features/announcement/service/AnnouncementService.java @@ -0,0 +1,9 @@ +package com.opom.bdms.features.announcement.service; + +import com.opom.bdms.features.announcement.dto.request.AnnouncementFilter; +import com.opom.bdms.features.announcement.dto.request.AnnouncementRequest; +import com.opom.bdms.features.announcement.dto.response.AnnouncementResponse; +import com.opom.bdms.service.BaseService; + +public interface AnnouncementService extends BaseService { +} diff --git a/src/main/java/com/opom/bdms/features/announcement/service/impl/AnnouncementServiceImpl.java b/src/main/java/com/opom/bdms/features/announcement/service/impl/AnnouncementServiceImpl.java new file mode 100644 index 0000000..0ecfc5f --- /dev/null +++ b/src/main/java/com/opom/bdms/features/announcement/service/impl/AnnouncementServiceImpl.java @@ -0,0 +1,39 @@ +package com.opom.bdms.features.announcement.service.impl; + +import com.opom.bdms.entity.Announcement; +import com.opom.bdms.features.announcement.dto.request.AnnouncementFilter; +import com.opom.bdms.features.announcement.dto.request.AnnouncementRequest; +import com.opom.bdms.features.announcement.dto.response.AnnouncementResponse; +import com.opom.bdms.features.announcement.mapper.AnnouncementMapper; +import com.opom.bdms.features.announcement.service.AnnouncementService; +import com.opom.bdms.repository.AnnouncementRepository; +import com.opom.bdms.service.impl.BaseServiceImpl; +import org.springframework.stereotype.Service; + +@Service +public class AnnouncementServiceImpl extends BaseServiceImpl implements AnnouncementService { + + private final AnnouncementMapper announcementMapper; + private final AnnouncementRepository announcementRepository; + + public AnnouncementServiceImpl(AnnouncementRepository announcementRepository,AnnouncementMapper announcementMapper){ + super(announcementRepository); + this.announcementMapper = announcementMapper; + this.announcementRepository = announcementRepository; + } + @Override + protected Announcement mapRequestToEntity(AnnouncementRequest request) { + return announcementMapper.toEntity(request); + } + + @Override + protected AnnouncementResponse mapEntityToResponse(Announcement entity) { + return announcementMapper.toResponse(entity); + } + + @Override + protected void updateEntityFromRequest(Announcement entity, AnnouncementRequest request) { + announcementMapper.updateEntity(entity,request); + } + +} diff --git a/src/main/java/com/opom/bdms/features/hospital/controller/HospitalController.java b/src/main/java/com/opom/bdms/features/hospital/controller/HospitalController.java new file mode 100644 index 0000000..8ff309b --- /dev/null +++ b/src/main/java/com/opom/bdms/features/hospital/controller/HospitalController.java @@ -0,0 +1,91 @@ +package com.opom.bdms.features.hospital.controller; + +import com.opom.bdms.dto.request.PageAndFilterDTO; +import com.opom.bdms.dto.response.ApiResponse; +import com.opom.bdms.features.hospital.dto.request.HospitalFilter; +import com.opom.bdms.features.hospital.dto.request.HospitalRequest; +import com.opom.bdms.features.hospital.dto.response.HospitalResponse; +import com.opom.bdms.features.hospital.service.HospitalService; +import com.opom.bdms.util.ApiResponseUtil; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.validation.Valid; +import lombok.RequiredArgsConstructor; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@RestController +@RequiredArgsConstructor +@RequestMapping("/api/v1/bdms/hospitals") +public class HospitalController { + private final HospitalService hospitalService; + + @PostMapping + public ResponseEntity create(@Valid @RequestBody HospitalRequest request, HttpServletRequest httpServletRequest){ + HospitalResponse response = hospitalService.create(request); + ApiResponse apiResponse = ApiResponseUtil.created( + response, + "hospital created successfully", + httpServletRequest + ); + return ResponseEntity.status(HttpStatus.CREATED).body(apiResponse); + } + + @PostMapping("/pageable") + public ResponseEntity getAll(@RequestBody(required = false) PageAndFilterDTO pageAndFilterDTO, HttpServletRequest httpServletRequest) { + if (pageAndFilterDTO == null) { + pageAndFilterDTO = new PageAndFilterDTO<>(); + } + var pagination = hospitalService.getAll(pageAndFilterDTO); + ApiResponse apiResponse = ApiResponseUtil.paginated( + pagination, + "Hospital retrieved successfully", + httpServletRequest + ); + return ResponseEntity.ok(apiResponse); + } + + @GetMapping("/{id}") + public ResponseEntity findById(@PathVariable Long id, HttpServletRequest httpServletRequest) { + HospitalResponse response = hospitalService.findById(id); + ApiResponse apiResponse = ApiResponseUtil.success( + response, + "Hospital retrieved successfully", + httpServletRequest + ); + return ResponseEntity.ok(apiResponse); + } + + @PutMapping("/{id}") + public ResponseEntity update(@PathVariable Long id, @Valid @RequestBody HospitalRequest request, HttpServletRequest httpServletRequest) { + HospitalResponse response = hospitalService.update(id, request); + ApiResponse apiResponse = ApiResponseUtil.success( + response, + "Hospital updated successfully", + httpServletRequest + ); + return ResponseEntity.ok(apiResponse); + } + + @DeleteMapping("/{id}") + public ResponseEntity delete(@PathVariable Long id, HttpServletRequest httpServletRequest) { + hospitalService.delete(id); + ApiResponse apiResponse = ApiResponseUtil.noContent( + "Hospital deleted successfully", + httpServletRequest + ); + return ResponseEntity.status(HttpStatus.NO_CONTENT).body(apiResponse); + } + + @DeleteMapping("/batch") + public ResponseEntity deleteMany(@RequestBody List ids, HttpServletRequest httpServletRequest) { + hospitalService.deleteMany(ids); + ApiResponse apiResponse = ApiResponseUtil.noContent( + "Hospitals deleted successfully", + httpServletRequest + ); + return ResponseEntity.status(HttpStatus.NO_CONTENT).body(apiResponse); + } +} diff --git a/src/main/java/com/opom/bdms/features/hospital/dto/request/HospitalFilter.java b/src/main/java/com/opom/bdms/features/hospital/dto/request/HospitalFilter.java new file mode 100644 index 0000000..187c2b3 --- /dev/null +++ b/src/main/java/com/opom/bdms/features/hospital/dto/request/HospitalFilter.java @@ -0,0 +1,11 @@ +package com.opom.bdms.features.hospital.dto.request; + +import com.opom.bdms.dto.request.BaseFilter; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@Data +@EqualsAndHashCode(callSuper = true) +public class HospitalFilter extends BaseFilter { + private String name; +} diff --git a/src/main/java/com/opom/bdms/features/hospital/dto/request/HospitalRequest.java b/src/main/java/com/opom/bdms/features/hospital/dto/request/HospitalRequest.java new file mode 100644 index 0000000..0000d98 --- /dev/null +++ b/src/main/java/com/opom/bdms/features/hospital/dto/request/HospitalRequest.java @@ -0,0 +1,23 @@ +package com.opom.bdms.features.hospital.dto.request; + + +import jakarta.validation.constraints.Email; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; + +public record HospitalRequest( + @NotBlank(message = "Name is required") + String name, + + @NotBlank(message = "Address is required") + String address, + + @NotNull(message = "Phone Number is required") + String phone, + + @Email + @NotNull(message = "Email is required") + String email, + + Boolean isVerified +) {} diff --git a/src/main/java/com/opom/bdms/features/hospital/dto/response/HospitalResponse.java b/src/main/java/com/opom/bdms/features/hospital/dto/response/HospitalResponse.java new file mode 100644 index 0000000..c0673aa --- /dev/null +++ b/src/main/java/com/opom/bdms/features/hospital/dto/response/HospitalResponse.java @@ -0,0 +1,15 @@ +package com.opom.bdms.features.hospital.dto.response; + +import com.opom.bdms.dto.response.MasterData; +import lombok.Builder; + +@Builder +public record HospitalResponse( + Long id, + String name, + String address, + String phone, + String email, + Boolean isVerified, + MasterData masterData +) {} diff --git a/src/main/java/com/opom/bdms/features/hospital/mapper/HospitalMapper.java b/src/main/java/com/opom/bdms/features/hospital/mapper/HospitalMapper.java new file mode 100644 index 0000000..2c11120 --- /dev/null +++ b/src/main/java/com/opom/bdms/features/hospital/mapper/HospitalMapper.java @@ -0,0 +1,45 @@ +package com.opom.bdms.features.hospital.mapper; + +import com.opom.bdms.entity.Hospital; +import com.opom.bdms.features.hospital.dto.request.HospitalRequest; +import com.opom.bdms.features.hospital.dto.response.HospitalResponse; +import com.opom.bdms.mapper.MasterDataMapper; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; + +@Component +@RequiredArgsConstructor +public class HospitalMapper { + + private final MasterDataMapper masterDataMapper; + + public Hospital toEntity(HospitalRequest request){ + Hospital entity = new Hospital(); + entity.setName(request.name()); + entity.setAddress(request.address()); + entity.setPhone(request.phone()); + entity.setEmail(request.email()); + entity.setIsVerified(request.isVerified()); + return entity; + } + + public HospitalResponse toResponse(Hospital entity){ + if(entity == null){ + return null; + } + + return HospitalResponse.builder() + .id(entity.getId()) + .name(entity.getName()) + .address(entity.getAddress()) + .phone(entity.getPhone()) + .email(entity.getEmail()) + .isVerified(entity.getIsVerified()) + .build(); + } + + public void updateEntity(Hospital entity, HospitalRequest request) { + entity.setName(request.name()); + } + +} diff --git a/src/main/java/com/opom/bdms/features/hospital/service/HospitalService.java b/src/main/java/com/opom/bdms/features/hospital/service/HospitalService.java new file mode 100644 index 0000000..be7cf27 --- /dev/null +++ b/src/main/java/com/opom/bdms/features/hospital/service/HospitalService.java @@ -0,0 +1,9 @@ +package com.opom.bdms.features.hospital.service; + +import com.opom.bdms.features.hospital.dto.request.HospitalFilter; +import com.opom.bdms.features.hospital.dto.request.HospitalRequest; +import com.opom.bdms.features.hospital.dto.response.HospitalResponse; +import com.opom.bdms.service.BaseService; + +public interface HospitalService extends BaseService { +} diff --git a/src/main/java/com/opom/bdms/features/hospital/service/impl/HospitalServiceImpl.java b/src/main/java/com/opom/bdms/features/hospital/service/impl/HospitalServiceImpl.java new file mode 100644 index 0000000..f393c96 --- /dev/null +++ b/src/main/java/com/opom/bdms/features/hospital/service/impl/HospitalServiceImpl.java @@ -0,0 +1,40 @@ +package com.opom.bdms.features.hospital.service.impl; + + +import com.opom.bdms.entity.Hospital; +import com.opom.bdms.features.hospital.dto.request.HospitalFilter; +import com.opom.bdms.features.hospital.dto.request.HospitalRequest; +import com.opom.bdms.features.hospital.dto.response.HospitalResponse; +import com.opom.bdms.features.hospital.mapper.HospitalMapper; +import com.opom.bdms.features.hospital.service.HospitalService; +import com.opom.bdms.repository.HospitalRepository; +import com.opom.bdms.service.impl.BaseServiceImpl; +import org.springframework.stereotype.Service; + +@Service +public class HospitalServiceImpl extends BaseServiceImpl implements HospitalService { + + private final HospitalMapper hospitalMapper; + private final HospitalRepository hospitalRepository; + + public HospitalServiceImpl(HospitalMapper hospitalMapper, HospitalRepository hospitalRepository) { + super(hospitalRepository); + this.hospitalMapper = hospitalMapper; + this.hospitalRepository = hospitalRepository; + } + + @Override + protected Hospital mapRequestToEntity(HospitalRequest request) { + return hospitalMapper.toEntity(request); + } + + @Override + protected HospitalResponse mapEntityToResponse(Hospital entity) { + return hospitalMapper.toResponse(entity); + } + + @Override + protected void updateEntityFromRequest(Hospital entity, HospitalRequest request) { + hospitalMapper.updateEntity(entity,request); + } +}