Skip to content
Merged

Test #30

Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
8c731de
Include `contractId` field in `InspectionJob`, `JobEvent`, and relate…
hoangtuzami Apr 10, 2026
d25b9ef
Include `contractId` field in `InspectionJob`, `JobEvent`, and relate…
hoangtuzami Apr 10, 2026
f534cb3
pagination for maintenance job + inspection job
RockyDuy Apr 10, 2026
26bfb02
fix conflict
RockyDuy Apr 10, 2026
425fe29
add pagination again when lose code
RockyDuy Apr 10, 2026
8dabdae
Merge pull request #25 from Management-System-for-Rental-SEP490/featu…
RockyDuy Apr 10, 2026
7f65f43
addd search by type
RockyDuy Apr 11, 2026
75b6776
Merge pull request #26 from Management-System-for-Rental-SEP490/featu…
RockyDuy Apr 11, 2026
0d32009
add status Approved
RockyDuy Apr 12, 2026
1d7ec80
Merge pull request #27 from Management-System-for-Rental-SEP490/featu…
RockyDuy Apr 12, 2026
ad1e7cc
add cacheEvict
RockyDuy Apr 12, 2026
3904415
Merge pull request #28 from Management-System-for-Rental-SEP490/featu…
RockyDuy Apr 12, 2026
b554bad
Add global exception handling and custom exception classes with corre…
hoangtuzami Apr 13, 2026
027104f
add kafka for auto schedule inspection
RockyDuy Apr 13, 2026
d55ace5
Merge branch 'dev' of https://github.com/Management-System-for-Rental…
RockyDuy Apr 13, 2026
71c0e7d
Merge pull request #29 from Management-System-for-Rental-SEP490/featu…
RockyDuy Apr 13, 2026
ccbadda
Updated security paths, disabled protobuf configuration, and fixed AP…
hoangtuzami Apr 14, 2026
a3b96ac
chore(test): auto-save completed work
hoangtuzami Apr 19, 2026
1d74802
chore(config): add internationalization (i18n) support and implement …
hoangtuzami May 7, 2026
dfffc43
feat(event): add RelocationEventListener and implement inspection job…
hoangtuzami May 7, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
70 changes: 49 additions & 21 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,18 @@ configurations {
extendsFrom annotationProcessor
}
}
configurations.configureEach {
resolutionStrategy {
force 'com.google.protobuf:protobuf-java:4.34.0'
force 'com.google.protobuf:protobuf-java-util:4.34.0'
eachDependency { details ->
if (details.requested.group == 'com.google.protobuf' && (details.requested.name == 'protobuf-java' || details.requested.name == 'protobuf-java-util')) {
details.useVersion '4.34.0'
details.because 'Keep protobuf runtime aligned with generated proto-common classes'
}
}
}
}

repositories {
mavenCentral()
Expand All @@ -35,6 +47,14 @@ repositories {
password = System.getenv("GITHUB_TOKEN") ?: ""
}
}
maven {
name = "GitHubPackagesObservability"
url = uri("https://maven.pkg.github.com/Management-System-for-Rental-SEP490/ISUMS_Observability-Common")
credentials {
username = System.getenv("GITHUB_ACTOR") ?: ""
password = System.getenv("GITHUB_TOKEN") ?: ""
}
}
}

ext {
Expand All @@ -43,6 +63,12 @@ ext {
}

dependencies {
implementation 'net.logstash.logback:logstash-logback-encoder:8.1'
implementation 'io.opentelemetry:opentelemetry-exporter-otlp'
implementation 'io.micrometer:micrometer-tracing-bridge-otel'
implementation 'io.micrometer:micrometer-registry-prometheus'
implementation 'org.springframework.boot:spring-boot-starter-actuator'
implementation 'com.isums:isums-observability-common:1.0-SNAPSHOT'
implementation "org.mapstruct:mapstruct:1.6.3"
implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:3.0.2'
annotationProcessor "org.mapstruct:mapstruct-processor:1.6.3"
Expand All @@ -59,12 +85,12 @@ dependencies {
implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client'
implementation "org.springframework.grpc:spring-grpc-client-spring-boot-starter"
implementation "org.springframework.grpc:spring-grpc-spring-boot-starter"
implementation 'com.google.protobuf:protobuf-java-util:4.33.5'
implementation platform("com.google.protobuf:protobuf-bom:4.33.4")
implementation "com.google.protobuf:protobuf-java"
implementation 'com.google.protobuf:protobuf-java-util:4.34.0'
implementation 'com.google.protobuf:protobuf-java:4.34.0'
implementation "com.isums:proto-common:1.0-SNAPSHOT"
implementation 'software.amazon.awssdk:s3:2.42.14'
implementation 'com.google.protobuf:protobuf-java:4.34.0-RC2'
implementation 'software.amazon.awssdk:translate:2.42.14'
implementation 'com.google.protobuf:protobuf-java:4.34.0'
implementation 'org.springframework.boot:spring-boot-starter-validation'
implementation 'org.springframework.boot:spring-boot-starter-oauth2-resource-server'
implementation 'software.amazon.awssdk:dynamodb:2.41.30'
Expand Down Expand Up @@ -93,24 +119,26 @@ tasks.named('bootBuildImage') {
runImage = 'paketobuildpacks/ubuntu-noble-run:latest'
}

protobuf {
protoc {
artifact = 'com.google.protobuf:protoc'
}
plugins {
grpc {
artifact = 'io.grpc:protoc-gen-grpc-java'
}
}
generateProtoTasks {
all()*.plugins {
grpc {
option '@generated=omit'
}
}
}
}
//protobuf {
// protoc {
// artifact = 'com.google.protobuf:protoc'
// }
// plugins {
// grpc {
// artifact = 'io.grpc:protoc-gen-grpc-java'
// }
// }
// generateProtoTasks {
// all()*.plugins {
// grpc {
// option '@generated=omit'
// }
// }
// }
//}

tasks.named('test') {
useJUnitPlatform()
}

tasks.withType(JavaCompile).configureEach { options.encoding = 'UTF-8' }
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
package com.isums.maintainservice.configurations;

import org.springframework.context.MessageSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.support.ReloadableResourceBundleMessageSource;
import org.springframework.web.servlet.LocaleResolver;
import org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver;

import java.util.List;
import java.util.Locale;

@Configuration
public class I18nConfig {

private static final List<Locale> SUPPORTED = List.of(
Locale.forLanguageTag("vi"),
Locale.ENGLISH,
Locale.JAPANESE
);

@Bean
public MessageSource messageSource() {
ReloadableResourceBundleMessageSource source = new ReloadableResourceBundleMessageSource();
source.setBasenames("classpath:i18n/messages");
source.setDefaultEncoding("UTF-8");
source.setUseCodeAsDefaultMessage(true);
source.setFallbackToSystemLocale(false);
source.setCacheSeconds(60);
return source;
}

@Bean
public LocaleResolver localeResolver() {
AcceptHeaderLocaleResolver resolver = new AcceptHeaderLocaleResolver();
resolver.setSupportedLocales(SUPPORTED);
resolver.setDefaultLocale(Locale.forLanguageTag("vi"));
return resolver;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,9 @@ public class OpenApiConfig {
public OpenAPI openAPI() {
return new OpenAPI()
.info(new Info()
.title("Maintain Service API")
.title("Maintenance Service API")
.version("v1")
.description("Có nhiều thứ rất là khó nói vậy nên là lá đò"))
.description("ISUMS service API documentation"))
.addSecurityItem(new SecurityRequirement().addList(BEARER_SCHEME))
.components(new Components().addSecuritySchemes(
BEARER_SCHEME,
Expand All @@ -28,3 +28,4 @@ public OpenAPI openAPI() {
));
}
}

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,14 @@
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import software.amazon.awssdk.auth.credentials.AwsBasicCredentials;
import software.amazon.awssdk.auth.credentials.AwsCredentialsProvider;
import software.amazon.awssdk.auth.credentials.DefaultCredentialsProvider;
import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider;
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.s3.S3Client;
import software.amazon.awssdk.services.s3.presigner.S3Presigner;
import software.amazon.awssdk.services.translate.TranslateClient;
import org.springframework.util.StringUtils;

@Configuration
public class S3Config {
Expand All @@ -24,8 +29,30 @@ public class S3Config {
public S3Client s3Client() {
return S3Client.builder()
.region(Region.of(region))
.credentialsProvider(StaticCredentialsProvider.create(
AwsBasicCredentials.create(accessKey, secretKey)
)).build();
.credentialsProvider(credentialsProvider())
.build();
}

@Bean
public S3Presigner s3Presigner() {
return S3Presigner.builder()
.region(Region.of(region))
.credentialsProvider(credentialsProvider())
.build();
}

@Bean
public TranslateClient translateClient() {
return TranslateClient.builder()
.region(Region.of(region))
.credentialsProvider(credentialsProvider())
.build();
}

private AwsCredentialsProvider credentialsProvider() {
if (StringUtils.hasText(accessKey) && StringUtils.hasText(secretKey)) {
return StaticCredentialsProvider.create(AwsBasicCredentials.create(accessKey, secretKey));
}
return DefaultCredentialsProvider.create();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,10 @@ public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
.authorizeHttpRequests(auth -> auth
.requestMatchers(
"/actuator/prometheus",
"/api/users/v3/api-docs",
"/api/users/v3/api-docs/**",
"/api/users/swagger",
"/api/users/swagger/**",
"/api/maintenances/v3/api-docs",
"/api/maintenances/v3/api-docs/**",
"/api/maintenances/swagger",
"/api/maintenances/swagger/**",
"/swagger-ui/**",
"/swagger-ui.html",
"/v3/api-docs",
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,19 @@
package com.isums.maintainservice.controllers;

import com.isums.maintainservice.domains.dtos.*;
import com.isums.maintainservice.domains.dtos.MaintainJobDTO.MaintenanceJobDto;
import com.isums.maintainservice.domains.enums.InspectionStatus;
import com.isums.maintainservice.infrastructures.abstracts.InspectionJobService;
import common.paginations.dtos.PageRequestParams;
import common.paginations.dtos.PageResponse;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import org.springdoc.core.annotations.ParameterObject;
import org.springframework.http.MediaType;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.security.oauth2.jwt.Jwt;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.util.List;
import java.util.UUID;
Expand All @@ -17,8 +26,10 @@ public class InspectionController {
private final InspectionJobService inspectionJobService;

@PostMapping
public ApiResponse<InspectionDto> createInspection(@RequestBody CreateInspectionRequest request) {
InspectionDto res = inspectionJobService.create(request);
public ApiResponse<InspectionDto> createInspection(
@AuthenticationPrincipal Jwt jwt,
@RequestBody CreateInspectionRequest request) {
InspectionDto res = inspectionJobService.create(jwt.getSubject(), request);
return ApiResponses.ok(res, "Create inspection successfully");
}

Expand All @@ -29,14 +40,22 @@ public ApiResponse<InspectionDto> getInspection(@PathVariable UUID id) {
}

@GetMapping
public ApiResponse<List<InspectionDto>> getAll(@RequestParam(required = false) InspectionStatus status) {
List<InspectionDto> res = inspectionJobService.getAll(status);
return ApiResponses.ok(res, "Get inspections successfully");
public com.isums.maintainservice.domains.dtos.ApiResponse<PageResponse<InspectionDto>> getAll(
@ParameterObject @Valid @ModelAttribute PageRequestParams params) {
return com.isums.maintainservice.domains.dtos.ApiResponses.ok(inspectionJobService.getAll(params.toPageRequest()), "Success");
}

@PutMapping("/{id}/status")
public ApiResponse<InspectionDto> updateStatus(@PathVariable UUID id, @RequestBody UpdateInspectionRequest request) {
InspectionDto res = inspectionJobService.updateStatus(id, request.status());
return ApiResponses.ok(res, "Update inspection status successfully");
}

@PostMapping(value = "/{id}/house-photos", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
public ApiResponse<InspectionDto> uploadHousePhotos(
@PathVariable UUID id,
@RequestParam("files") List<MultipartFile> files) {
InspectionDto res = inspectionJobService.uploadHousePhotos(id, files);
return ApiResponses.ok(res, "House photos uploaded");
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,11 @@
import com.isums.maintainservice.domains.enums.JobStatus;
import com.isums.maintainservice.infrastructures.abstracts.MaintenanceJobHistoryService;
import com.isums.maintainservice.infrastructures.abstracts.MaintenanceJobService;
import common.paginations.dtos.PageRequestParams;
import common.paginations.dtos.PageResponse;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import org.springdoc.core.annotations.ParameterObject;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.security.oauth2.jwt.Jwt;
import org.springframework.web.bind.annotation.*;
Expand Down Expand Up @@ -35,9 +39,9 @@ public ApiResponse<List<MaintenanceJobDto>> generateByPlan(@PathVariable UUID pl
}

@GetMapping
public ApiResponse<List<MaintenanceJobDto>> getAllJobs(@RequestParam(required = false) JobStatus status){
List<MaintenanceJobDto> res = maintenanceJobService.getAllJobs(status);
return ApiResponses.ok(res,"Get all jobs successfully");
public com.isums.maintainservice.domains.dtos.ApiResponse<PageResponse<MaintenanceJobDto>> getAll(
@ParameterObject @Valid @ModelAttribute PageRequestParams params) {
return com.isums.maintainservice.domains.dtos.ApiResponses.ok(maintenanceJobService.getAll(params.toPageRequest()), "Success");
}

@GetMapping("/house/{houseId}")
Expand Down Expand Up @@ -67,7 +71,7 @@ public ApiResponse<List<MaintenanceJobDto>> getMyJobs(@PathVariable UUID planId)

@PutMapping("/{jobId}/status")
public ApiResponse<MaintenanceJobDto> updateJobStatus(@PathVariable UUID jobId, @RequestParam JobStatus status){
MaintenanceJobDto res = maintenanceJobService.updateJobStatus(jobId,status);
MaintenanceJobDto res = maintenanceJobService.updateJobStatus(jobId, status);
return ApiResponses.ok(res,"Update job status successfully");
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,18 +4,21 @@
import com.isums.maintainservice.domains.enums.InspectionType;

import java.time.Instant;
import java.util.List;
import java.util.UUID;

public record InspectionDto(
UUID id,
UUID houseId,
UUID contractId,
UUID assignedStaffId,
String staffName,
String staffPhone,
UUID slotId,
InspectionStatus status,
InspectionType type,
String note,
List<String> housePhotoUrls,
Instant createdAt,
Instant updatedAt
) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,6 @@
package com.isums.maintainservice.domains.dtos.MaintainJobDTO;

import com.isums.maintainservice.domains.enums.JobStatus;
import jakarta.persistence.Column;

import java.time.Instant;
import java.time.LocalDate;
import java.util.UUID;

Expand All @@ -14,6 +11,7 @@ public record MaintenanceJobDto(
UUID assignedStaffId,
String staffName,
String staffPhone,
MaintenanceJobStaffDto staff,
LocalDate periodStartDate,
JobStatus status
) {
Expand Down
Loading
Loading