Skip to content
Merged

Test #31

Show file tree
Hide file tree
Changes from all commits
Commits
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
49 changes: 29 additions & 20 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,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 @@ -38,6 +50,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") ?: ""
}
}
}

dependencyManagement {
Expand All @@ -48,6 +68,10 @@ dependencyManagement {
}

dependencies {
implementation 'net.logstash.logback:logstash-logback-encoder:8.1'
implementation 'io.opentelemetry:opentelemetry-exporter-otlp'
implementation 'io.micrometer:micrometer-tracing-bridge-otel'
implementation 'com.isums:isums-observability-common:1.0-SNAPSHOT'
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-webmvc'
implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client'
Expand All @@ -65,7 +89,8 @@ dependencies {
implementation 'org.springframework.boot:spring-boot-starter-actuator'
implementation 'io.micrometer:micrometer-registry-prometheus'

implementation 'com.google.protobuf:protobuf-java:4.34.0-RC2'
implementation 'com.google.protobuf:protobuf-java:4.34.0'
implementation 'com.google.protobuf:protobuf-java-util:4.34.0'
implementation "org.springframework.grpc:spring-grpc-client-spring-boot-starter"
implementation "org.springframework.grpc:spring-grpc-spring-boot-starter"

Expand All @@ -90,24 +115,8 @@ 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'
// }
// }
// }
//}

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,53 @@
package com.isums.scheduleservice.configurations;

import org.apache.kafka.clients.admin.NewTopic;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.kafka.config.TopicBuilder;

@Configuration
public class KafkaTopicConfig {
private static final int JOB_TOPIC_PARTITIONS = 3;

@Bean
public NewTopic jobCreatedTopic() {
return jobTopic("job.created");
}

@Bean
public NewTopic jobScheduledTopic() {
return jobTopic("job.scheduled");
}

@Bean
public NewTopic jobRescheduledTopic() {
return jobTopic("job.rescheduled");
}

@Bean
public NewTopic jobNeedRescheduleTopic() {
return jobTopic("job.need-reschedule");
}

@Bean
public NewTopic jobAssignedTopic() {
return jobTopic("job.assigned");
}

@Bean
public NewTopic jobWaitingConfirmTopic() {
return jobTopic("job.waiting.confirm");
}

@Bean
public NewTopic jobCompletedTopic() {
return jobTopic("job.completed");
}

private NewTopic jobTopic(String name) {
return TopicBuilder.name(name)
.partitions(JOB_TOPIC_PARTITIONS)
.replicas(1)
.build();
}
}
Original file line number Diff line number Diff line change
@@ -1,30 +1,31 @@
package com.isums.scheduleservice.configurations;

import io.swagger.v3.oas.models.Components;
import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.info.Info;
import io.swagger.v3.oas.models.security.SecurityRequirement;
import io.swagger.v3.oas.models.security.SecurityScheme;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class OpenApiConfig {

private static final String BEARER_SCHEME = "bearerAuth";

@Bean
public OpenAPI openAPI() {
return new OpenAPI()
.info(new Info()
.title("EContract Service API")
.version("v1")
.description("Có nhiều thứ rất là khó nói vậy nên là lá đò"))
.addSecurityItem(new SecurityRequirement().addList(BEARER_SCHEME))
.components(new Components().addSecuritySchemes(
BEARER_SCHEME,
new SecurityScheme().name(BEARER_SCHEME).type(SecurityScheme.Type.HTTP)
.scheme("bearer").bearerFormat("JWT")
));
}
}
package com.isums.scheduleservice.configurations;

import io.swagger.v3.oas.models.Components;
import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.info.Info;
import io.swagger.v3.oas.models.security.SecurityRequirement;
import io.swagger.v3.oas.models.security.SecurityScheme;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class OpenApiConfig {

private static final String BEARER_SCHEME = "bearerAuth";

@Bean
public OpenAPI openAPI() {
return new OpenAPI()
.info(new Info()
.title("EContract Service API")
.version("v1")
.description("ISUMS service API documentation"))
.addSecurityItem(new SecurityRequirement().addList(BEARER_SCHEME))
.components(new Components().addSecuritySchemes(
BEARER_SCHEME,
new SecurityScheme().name(BEARER_SCHEME).type(SecurityScheme.Type.HTTP)
.scheme("bearer").bearerFormat("JWT")
));
}
}

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -20,22 +20,31 @@ public class LeaveController {
private final LeaveRequestService leaveRequestService;
private final UserClientsGrpc userClientsGrpc;


// Staff creates a leave request for the authenticated account.
@PostMapping
public ApiResponse<LeaveRequestDto> createLeaveRequest(@AuthenticationPrincipal Jwt jwt, @RequestBody CreateLeaveRequest req){
public ApiResponse<LeaveRequestDto> createLeaveRequest(@AuthenticationPrincipal Jwt jwt, @RequestBody CreateLeaveRequest req) {
UserResponse user = userClientsGrpc.getUserIdAndRoleByKeyCloakId(jwt.getSubject());
LeaveRequestDto res = leaveRequestService.createLeaveRequest(user.getId(),req);
return ApiResponses.created(res,"Create leave request successfully");
LeaveRequestDto res = leaveRequestService.createLeaveRequest(user.getId(), req);
return ApiResponses.created(res, "Create leave request successfully");
}

// Manager/admin updates the review status for a leave request.
@PutMapping("/{id}/status")
public ApiResponse<LeaveRequestDto> updateStatus(@PathVariable UUID id, @RequestBody UpdateLeaveStatusRequest req){
LeaveRequestDto res = leaveRequestService.updateStatus(id,req);
return ApiResponses.ok(res,"update status successfully");
public ApiResponse<LeaveRequestDto> updateStatus(@PathVariable UUID id, @RequestBody UpdateLeaveStatusRequest req) {
LeaveRequestDto res = leaveRequestService.updateStatus(id, req);
return ApiResponses.ok(res, "Update leave status successfully");
}

// Staff reads leave requests belonging to the authenticated account.
@GetMapping("/me")
public ApiResponse<List<LeaveRequestDto>> getLeaveRequestByStaffId(@AuthenticationPrincipal Jwt jwt){
public ApiResponse<List<LeaveRequestDto>> getLeaveRequestByStaffId(@AuthenticationPrincipal Jwt jwt) {
List<LeaveRequestDto> res = leaveRequestService.getLeaveRequestByStaffId(jwt.getSubject());
return ApiResponses.ok(res,"update status successfully");
return ApiResponses.ok(res, "Get my leave requests successfully");
}

@GetMapping("/staff/{staffId}")
public ApiResponse<List<LeaveRequestDto>> getLeaveRequestByInternalStaffId(@PathVariable UUID staffId) {
List<LeaveRequestDto> res = leaveRequestService.getLeaveRequestByInternalStaffId(staffId);
return ApiResponses.ok(res, "Get leave requests successfully");
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package com.isums.scheduleservice.controllers;

import com.isums.scheduleservice.domains.dtos.ApiResponse;
import com.isums.scheduleservice.domains.dtos.ApiResponses;
import com.isums.scheduleservice.services.StaffAssignmentService;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;
import java.util.Map;
import java.util.UUID;

@RestController
@RequiredArgsConstructor
@RequestMapping("/api/schedules/staff-assignments")
public class StaffAssignmentController {
private final StaffAssignmentService staffAssignmentService;

@GetMapping("/monthly-jobs")
public ApiResponse<Map<UUID, Long>> calculateMonthlyJobs(@RequestParam List<UUID> staffIds) {
Map<UUID, Long> res = staffAssignmentService.calculateMonthlyJobs(staffIds);
return ApiResponses.ok(res, "Calculate monthly jobs successfully");
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -81,8 +81,8 @@ public ApiResponse<List<DaySlotDto>> getSlots(@RequestParam UUID jobId, @Request
}

@GetMapping("/slots/staff")
public ApiResponse<List<UUID>> getAvailableStaff(@RequestParam UUID jobId, @RequestParam LocalDate date, @RequestParam LocalTime startTime) {
List<UUID> res = workSlotService.getAvailableStaff(jobId, date, startTime);
public ApiResponse<List<StaffDto>> getAvailableStaff(@RequestParam UUID jobId, @RequestParam LocalDate date, @RequestParam LocalTime startTime) {
List<StaffDto> res = workSlotService.getAvailableStaff(jobId, date, startTime);
return ApiResponses.ok(res, "Get available staff");
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.isums.scheduleservice.domains.dtos;

import java.util.UUID;

public record StaffDto(
UUID staffId,
UserDto info
) {
}
11 changes: 11 additions & 0 deletions src/main/java/com/isums/scheduleservice/domains/dtos/UserDto.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package com.isums.scheduleservice.domains.dtos;

import java.util.UUID;

public record UserDto(
UUID id,
String name,
String email,
String phone
) {
}
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
package com.isums.scheduleservice.domains.entities;

import com.isums.common.i18n.TranslationMap;
import com.isums.common.i18n.TranslationMapConverter;
import com.isums.scheduleservice.domains.enums.LeaveRequestStatus;
import jakarta.persistence.*;
import lombok.*;

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

@Entity
Expand Down Expand Up @@ -36,27 +37,33 @@ public class LeaveRequest {
@Column(name = "staff_id", nullable = false)
private UUID staffId;

// nghỉ theo ngày (dạng MVP)
@Column(name = "leave_date", nullable = false)
private LocalDate leaveDate;

@Column(columnDefinition = "text")
private String note;

@Column(name = "note_translations", columnDefinition = "text")
@Convert(converter = TranslationMapConverter.class)
private TranslationMap noteTranslations;

@Enumerated(EnumType.STRING)
@Column(nullable = false, length = 24)
private LeaveRequestStatus status;

// Manager duyệt ai
@Column(name = "manager_id")
private UUID managerId;

@Column(name = "decision_note", columnDefinition = "text")
private String decisionNote;

@Column(name = "decision_note_translations", columnDefinition = "text")
@Convert(converter = TranslationMapConverter.class)
private TranslationMap decisionNoteTranslations;

@Column(name = "created_at", nullable = false)
private Instant createdAt;

@Column(name = "updated_at")
private Instant updatedAt;
}
}
Loading
Loading