From da5cc25e95b41c1058f488193be370fb9f4988ed Mon Sep 17 00:00:00 2001 From: Mehara Rothila Ranawaka Date: Fri, 7 Nov 2025 00:43:24 +0530 Subject: [PATCH 01/13] Update project controller --- .../project_service/controller/ProjectController.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/project-service/src/main/java/com/techtorque/project_service/controller/ProjectController.java b/project-service/src/main/java/com/techtorque/project_service/controller/ProjectController.java index 8c4a451..b4b67ca 100644 --- a/project-service/src/main/java/com/techtorque/project_service/controller/ProjectController.java +++ b/project-service/src/main/java/com/techtorque/project_service/controller/ProjectController.java @@ -151,7 +151,9 @@ private ProjectResponseDto mapToResponseDto(Project project) { .id(project.getId()) .customerId(project.getCustomerId()) .vehicleId(project.getVehicleId()) + .projectType(project.getProjectType()) .description(project.getDescription()) + .desiredCompletionDate(project.getDesiredCompletionDate()) .budget(project.getBudget()) .status(project.getStatus()) .progress(project.getProgress()) From 459a77cb4a7c716b5c1c2c67698268972d3efb03 Mon Sep 17 00:00:00 2001 From: Mehara Rothila Ranawaka Date: Fri, 7 Nov 2025 00:43:32 +0530 Subject: [PATCH 02/13] Update project DTOs --- .../project_service/dto/request/ProjectRequestDto.java | 6 ++++++ .../project_service/dto/response/ProjectResponseDto.java | 2 ++ 2 files changed, 8 insertions(+) diff --git a/project-service/src/main/java/com/techtorque/project_service/dto/request/ProjectRequestDto.java b/project-service/src/main/java/com/techtorque/project_service/dto/request/ProjectRequestDto.java index 4e0273a..3cf6a67 100644 --- a/project-service/src/main/java/com/techtorque/project_service/dto/request/ProjectRequestDto.java +++ b/project-service/src/main/java/com/techtorque/project_service/dto/request/ProjectRequestDto.java @@ -9,6 +9,7 @@ import lombok.NoArgsConstructor; import java.math.BigDecimal; +import java.time.LocalDate; @Data @Builder @@ -19,9 +20,14 @@ public class ProjectRequestDto { @NotBlank(message = "Vehicle ID is required") private String vehicleId; + @NotBlank(message = "Project type is required") + private String projectType; + @NotBlank(message = "Description is required") @Size(min = 10, max = 2000, message = "Description must be between 10 and 2000 characters") private String description; + private String desiredCompletionDate; + private BigDecimal budget; } diff --git a/project-service/src/main/java/com/techtorque/project_service/dto/response/ProjectResponseDto.java b/project-service/src/main/java/com/techtorque/project_service/dto/response/ProjectResponseDto.java index 21ae1f4..3fec8ae 100644 --- a/project-service/src/main/java/com/techtorque/project_service/dto/response/ProjectResponseDto.java +++ b/project-service/src/main/java/com/techtorque/project_service/dto/response/ProjectResponseDto.java @@ -17,7 +17,9 @@ public class ProjectResponseDto { private String id; private String customerId; private String vehicleId; + private String projectType; private String description; + private String desiredCompletionDate; private BigDecimal budget; private ProjectStatus status; private int progress; From 3d6136c618367c9549a08207ab84333ca5912b84 Mon Sep 17 00:00:00 2001 From: Mehara Rothila Ranawaka Date: Fri, 7 Nov 2025 00:43:39 +0530 Subject: [PATCH 03/13] Update project entity and service implementation --- .../java/com/techtorque/project_service/entity/Project.java | 6 ++++++ .../project_service/service/impl/ProjectServiceImpl.java | 2 ++ 2 files changed, 8 insertions(+) diff --git a/project-service/src/main/java/com/techtorque/project_service/entity/Project.java b/project-service/src/main/java/com/techtorque/project_service/entity/Project.java index 7e54c6d..b68fe26 100644 --- a/project-service/src/main/java/com/techtorque/project_service/entity/Project.java +++ b/project-service/src/main/java/com/techtorque/project_service/entity/Project.java @@ -5,6 +5,7 @@ import org.hibernate.annotations.CreationTimestamp; import org.hibernate.annotations.UpdateTimestamp; import java.math.BigDecimal; +import java.time.LocalDate; import java.time.LocalDateTime; @Entity @@ -24,10 +25,15 @@ public class Project { @Column(nullable = false) private String vehicleId; + @Column(nullable = false) + private String projectType; + @Lob @Column(nullable = false) private String description; + private String desiredCompletionDate; + private BigDecimal budget; // Use BigDecimal for currency @Enumerated(EnumType.STRING) diff --git a/project-service/src/main/java/com/techtorque/project_service/service/impl/ProjectServiceImpl.java b/project-service/src/main/java/com/techtorque/project_service/service/impl/ProjectServiceImpl.java index 36d14a9..f2a2d86 100644 --- a/project-service/src/main/java/com/techtorque/project_service/service/impl/ProjectServiceImpl.java +++ b/project-service/src/main/java/com/techtorque/project_service/service/impl/ProjectServiceImpl.java @@ -36,7 +36,9 @@ public Project requestNewProject(ProjectRequestDto dto, String customerId) { Project newProject = Project.builder() .customerId(customerId) .vehicleId(dto.getVehicleId()) + .projectType(dto.getProjectType()) .description(dto.getDescription()) + .desiredCompletionDate(dto.getDesiredCompletionDate()) .budget(dto.getBudget()) .status(ProjectStatus.REQUESTED) .progress(0) From da92160faea6f877d5f2bc431d805096b014558f Mon Sep 17 00:00:00 2001 From: Paradoxrc Date: Sun, 9 Nov 2025 17:40:00 +0530 Subject: [PATCH 04/13] feat: Add project types to seeded projects in DataSeeder --- .../java/com/techtorque/project_service/config/DataSeeder.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/project-service/src/main/java/com/techtorque/project_service/config/DataSeeder.java b/project-service/src/main/java/com/techtorque/project_service/config/DataSeeder.java index 42cec4b..bfa39bb 100644 --- a/project-service/src/main/java/com/techtorque/project_service/config/DataSeeder.java +++ b/project-service/src/main/java/com/techtorque/project_service/config/DataSeeder.java @@ -111,6 +111,7 @@ private void seedProjects() { Project project1 = Project.builder() .customerId(CUSTOMER_1_ID) .vehicleId("VEH-001") + .projectType("Performance") .description("Install custom exhaust system and performance tuning") .budget(new BigDecimal("5000.00")) .status(ProjectStatus.APPROVED) @@ -121,6 +122,7 @@ private void seedProjects() { Project project2 = Project.builder() .customerId(CUSTOMER_2_ID) .vehicleId("VEH-002") + .projectType("Interior") .description("Full interior leather upholstery replacement") .budget(new BigDecimal("3000.00")) .status(ProjectStatus.QUOTED) @@ -131,6 +133,7 @@ private void seedProjects() { Project project3 = Project.builder() .customerId(CUSTOMER_1_ID) .vehicleId("VEH-001") + .projectType("Body Work") .description("Custom body kit installation and paint job") .budget(new BigDecimal("8000.00")) .status(ProjectStatus.IN_PROGRESS) From 7ecf4f5f0130580869bced71878c2e484b6ef76e Mon Sep 17 00:00:00 2001 From: Mehara Rothila Ranawaka Date: Mon, 10 Nov 2025 19:51:19 +0530 Subject: [PATCH 05/13] Add APPROVED and REJECTED project statuses --- .../com/techtorque/project_service/entity/ProjectStatus.java | 1 + 1 file changed, 1 insertion(+) diff --git a/project-service/src/main/java/com/techtorque/project_service/entity/ProjectStatus.java b/project-service/src/main/java/com/techtorque/project_service/entity/ProjectStatus.java index 6eb2339..6b386cc 100644 --- a/project-service/src/main/java/com/techtorque/project_service/entity/ProjectStatus.java +++ b/project-service/src/main/java/com/techtorque/project_service/entity/ProjectStatus.java @@ -2,6 +2,7 @@ public enum ProjectStatus { REQUESTED, + PENDING_ADMIN_REVIEW, // Custom project awaiting admin approval QUOTED, APPROVED, IN_PROGRESS, From 286a8dc2733bac2ec7b61abf2bf428a776e70ae3 Mon Sep 17 00:00:00 2001 From: Mehara Rothila Ranawaka Date: Mon, 10 Nov 2025 19:51:27 +0530 Subject: [PATCH 06/13] Add approval metadata fields to Project entity --- .../java/com/techtorque/project_service/entity/Project.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/project-service/src/main/java/com/techtorque/project_service/entity/Project.java b/project-service/src/main/java/com/techtorque/project_service/entity/Project.java index b68fe26..be5116f 100644 --- a/project-service/src/main/java/com/techtorque/project_service/entity/Project.java +++ b/project-service/src/main/java/com/techtorque/project_service/entity/Project.java @@ -25,6 +25,8 @@ public class Project { @Column(nullable = false) private String vehicleId; + private String appointmentId; // Link to appointment if project was created from appointment booking + @Column(nullable = false) private String projectType; From 8af715ddc8a39313fd8f4d1ccfc52b37a04bcf9f Mon Sep 17 00:00:00 2001 From: Mehara Rothila Ranawaka Date: Mon, 10 Nov 2025 19:51:34 +0530 Subject: [PATCH 07/13] Add approve and reject endpoints to project controller --- .../controller/ProjectController.java | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/project-service/src/main/java/com/techtorque/project_service/controller/ProjectController.java b/project-service/src/main/java/com/techtorque/project_service/controller/ProjectController.java index b4b67ca..3f5c7a4 100644 --- a/project-service/src/main/java/com/techtorque/project_service/controller/ProjectController.java +++ b/project-service/src/main/java/com/techtorque/project_service/controller/ProjectController.java @@ -145,6 +145,33 @@ public ResponseEntity listAllProjects() { return ResponseEntity.ok(ApiResponse.success("All projects retrieved successfully", response)); } + @Operation(summary = "Approve a custom project request (admin only)") + @PostMapping("/{projectId}/approve") + @PreAuthorize("hasRole('ADMIN')") + public ResponseEntity approveProject( + @PathVariable String projectId, + @RequestHeader("X-User-Subject") String adminId) { + + Project project = projectService.approveProject(projectId, adminId); + ProjectResponseDto response = mapToResponseDto(project); + + return ResponseEntity.ok(ApiResponse.success("Project approved successfully", response)); + } + + @Operation(summary = "Reject a custom project request (admin only)") + @PostMapping("/{projectId}/admin/reject") + @PreAuthorize("hasRole('ADMIN')") + public ResponseEntity rejectProject( + @PathVariable String projectId, + @RequestParam(required = false) String reason, + @RequestHeader("X-User-Subject") String adminId) { + + Project project = projectService.rejectProject(projectId, reason, adminId); + ProjectResponseDto response = mapToResponseDto(project); + + return ResponseEntity.ok(ApiResponse.success("Project rejected successfully", response)); + } + // Helper method to map Entity to DTO private ProjectResponseDto mapToResponseDto(Project project) { return ProjectResponseDto.builder() From ebfb84ea4c5d562501b22b0ffc7f279df7afaf4d Mon Sep 17 00:00:00 2001 From: Mehara Rothila Ranawaka Date: Mon, 10 Nov 2025 19:51:42 +0530 Subject: [PATCH 08/13] Define project approval service interface --- .../techtorque/project_service/service/ProjectService.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/project-service/src/main/java/com/techtorque/project_service/service/ProjectService.java b/project-service/src/main/java/com/techtorque/project_service/service/ProjectService.java index 49b98ac..24484df 100644 --- a/project-service/src/main/java/com/techtorque/project_service/service/ProjectService.java +++ b/project-service/src/main/java/com/techtorque/project_service/service/ProjectService.java @@ -25,4 +25,8 @@ public interface ProjectService { Project updateProgress(String projectId, ProgressUpdateDto dto); List getAllProjects(); + + Project approveProject(String projectId, String adminId); + + Project rejectProject(String projectId, String reason, String adminId); } \ No newline at end of file From e47685a37f56bf2f90ba5a533d29f3b11f8b8599 Mon Sep 17 00:00:00 2001 From: Mehara Rothila Ranawaka Date: Mon, 10 Nov 2025 19:51:50 +0530 Subject: [PATCH 09/13] Implement project approval and rejection workflow --- .../service/impl/ProjectServiceImpl.java | 95 ++++++++++++++++++- 1 file changed, 94 insertions(+), 1 deletion(-) diff --git a/project-service/src/main/java/com/techtorque/project_service/service/impl/ProjectServiceImpl.java b/project-service/src/main/java/com/techtorque/project_service/service/impl/ProjectServiceImpl.java index f2a2d86..b72889a 100644 --- a/project-service/src/main/java/com/techtorque/project_service/service/impl/ProjectServiceImpl.java +++ b/project-service/src/main/java/com/techtorque/project_service/service/impl/ProjectServiceImpl.java @@ -1,5 +1,7 @@ package com.techtorque.project_service.service.impl; +import com.techtorque.project_service.client.AppointmentClient; +import com.techtorque.project_service.client.NotificationClient; import com.techtorque.project_service.dto.request.ProgressUpdateDto; import com.techtorque.project_service.dto.request.ProjectRequestDto; import com.techtorque.project_service.dto.response.QuoteDto; @@ -23,9 +25,16 @@ public class ProjectServiceImpl implements ProjectService { private final ProjectRepository projectRepository; + private final AppointmentClient appointmentClient; + private final NotificationClient notificationClient; - public ProjectServiceImpl(ProjectRepository projectRepository) { + public ProjectServiceImpl( + ProjectRepository projectRepository, + AppointmentClient appointmentClient, + NotificationClient notificationClient) { this.projectRepository = projectRepository; + this.appointmentClient = appointmentClient; + this.notificationClient = notificationClient; } @Override @@ -211,4 +220,88 @@ public List getAllProjects() { log.info("Fetching all projects"); return projectRepository.findAll(); } + + @Override + public Project approveProject(String projectId, String adminId) { + log.info("Admin {} approving project {}", adminId, projectId); + + Project project = projectRepository.findById(projectId) + .orElseThrow(() -> new ProjectNotFoundException("Project not found: " + projectId)); + + // Validate project is in correct state for approval + if (project.getStatus() != ProjectStatus.REQUESTED && + project.getStatus() != ProjectStatus.PENDING_ADMIN_REVIEW) { + throw new InvalidProjectOperationException( + "Project must be in REQUESTED or PENDING_ADMIN_REVIEW status to be approved. Current status: " + project.getStatus()); + } + + // Approve the project + project.setStatus(ProjectStatus.APPROVED); + + Project savedProject = projectRepository.save(project); + log.info("Successfully approved project {}", projectId); + + // Send notification to customer that project was approved + notificationClient.sendProjectNotification( + project.getCustomerId(), + "SUCCESS", + "Project Approved", + String.format("Your custom project '%s' has been approved! We will proceed with the work as discussed.", + project.getProjectType()), + projectId + ); + + // If project has linked appointment, confirm it + if (project.getAppointmentId() != null && !project.getAppointmentId().isEmpty()) { + log.info("Project {} has linked appointment {}, confirming it", projectId, project.getAppointmentId()); + appointmentClient.confirmAppointment(project.getAppointmentId(), adminId); + } + + return savedProject; + } + + @Override + public Project rejectProject(String projectId, String reason, String adminId) { + log.info("Admin {} rejecting project {} with reason: {}", adminId, projectId, reason); + + Project project = projectRepository.findById(projectId) + .orElseThrow(() -> new ProjectNotFoundException("Project not found: " + projectId)); + + // Validate project is in correct state for rejection + if (project.getStatus() != ProjectStatus.REQUESTED && + project.getStatus() != ProjectStatus.PENDING_ADMIN_REVIEW && + project.getStatus() != ProjectStatus.QUOTED) { + throw new InvalidProjectOperationException( + "Project must be in REQUESTED, PENDING_ADMIN_REVIEW, or QUOTED status to be rejected. Current status: " + project.getStatus()); + } + + // Reject the project + project.setStatus(ProjectStatus.REJECTED); + + Project savedProject = projectRepository.save(project); + log.info("Successfully rejected project {}", projectId); + + // Send notification to customer about rejection with reason + String rejectionMessage = String.format( + "Your custom project '%s' has been reviewed and unfortunately cannot be accepted at this time.%s", + project.getProjectType(), + reason != null && !reason.isEmpty() ? " Reason: " + reason : "" + ); + + notificationClient.sendProjectNotification( + project.getCustomerId(), + "WARNING", + "Project Rejected", + rejectionMessage, + projectId + ); + + // If project has linked appointment, cancel it and free the timeslot + if (project.getAppointmentId() != null && !project.getAppointmentId().isEmpty()) { + log.info("Project {} has linked appointment {}, cancelling it", projectId, project.getAppointmentId()); + appointmentClient.cancelAppointment(project.getAppointmentId(), adminId); + } + + return savedProject; + } } \ No newline at end of file From d84622d7a88e16827b5d859c97db78a0e31e109c Mon Sep 17 00:00:00 2001 From: Mehara Rothila Ranawaka Date: Mon, 10 Nov 2025 19:51:57 +0530 Subject: [PATCH 10/13] Configure RestTemplate bean for external service calls --- .../project_service/config/RestTemplateConfig.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 project-service/src/main/java/com/techtorque/project_service/config/RestTemplateConfig.java diff --git a/project-service/src/main/java/com/techtorque/project_service/config/RestTemplateConfig.java b/project-service/src/main/java/com/techtorque/project_service/config/RestTemplateConfig.java new file mode 100644 index 0000000..52bdc45 --- /dev/null +++ b/project-service/src/main/java/com/techtorque/project_service/config/RestTemplateConfig.java @@ -0,0 +1,14 @@ +package com.techtorque.project_service.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.client.RestTemplate; + +@Configuration +public class RestTemplateConfig { + + @Bean + public RestTemplate restTemplate() { + return new RestTemplate(); + } +} From 67a2f1314d6bada717c4e546b2cb8dc7f2374af1 Mon Sep 17 00:00:00 2001 From: Mehara Rothila Ranawaka Date: Mon, 10 Nov 2025 19:52:06 +0530 Subject: [PATCH 11/13] Add notification and time slot client integrations --- .../client/AppointmentClient.java | 76 +++++++++++++++++++ .../client/NotificationClient.java | 53 +++++++++++++ 2 files changed, 129 insertions(+) create mode 100644 project-service/src/main/java/com/techtorque/project_service/client/AppointmentClient.java create mode 100644 project-service/src/main/java/com/techtorque/project_service/client/NotificationClient.java diff --git a/project-service/src/main/java/com/techtorque/project_service/client/AppointmentClient.java b/project-service/src/main/java/com/techtorque/project_service/client/AppointmentClient.java new file mode 100644 index 0000000..83326e4 --- /dev/null +++ b/project-service/src/main/java/com/techtorque/project_service/client/AppointmentClient.java @@ -0,0 +1,76 @@ +package com.techtorque.project_service.client; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.http.*; +import org.springframework.stereotype.Component; +import org.springframework.web.client.RestTemplate; +import org.springframework.web.client.HttpClientErrorException; + +/** + * Client for inter-service communication with Appointment Service + */ +@Component +@Slf4j +public class AppointmentClient { + + private final RestTemplate restTemplate; + private final String appointmentServiceUrl; + + public AppointmentClient( + RestTemplate restTemplate, + @Value("${services.appointment.url:http://localhost:8083}") String appointmentServiceUrl) { + this.restTemplate = restTemplate; + this.appointmentServiceUrl = appointmentServiceUrl; + } + + /** + * Cancel an appointment (used when project is rejected) + */ + public void cancelAppointment(String appointmentId, String adminId) { + try { + String url = appointmentServiceUrl + "/api/appointments/" + appointmentId; + + HttpHeaders headers = new HttpHeaders(); + headers.set("X-User-Subject", adminId); + headers.set("X-User-Roles", "ADMIN"); + + HttpEntity request = new HttpEntity<>(headers); + + restTemplate.exchange(url, HttpMethod.DELETE, request, Void.class); + + log.info("Successfully cancelled appointment {} via Appointment Service", appointmentId); + } catch (HttpClientErrorException e) { + log.error("Failed to cancel appointment {}: {}", appointmentId, e.getMessage()); + // Don't throw - project rejection should still succeed even if appointment cancellation fails + } catch (Exception e) { + log.error("Error communicating with Appointment Service: {}", e.getMessage()); + } + } + + /** + * Update appointment status to CONFIRMED (used when project is approved) + */ + public void confirmAppointment(String appointmentId, String adminId) { + try { + String url = appointmentServiceUrl + "/api/appointments/" + appointmentId + "/status"; + + HttpHeaders headers = new HttpHeaders(); + headers.set("X-User-Subject", adminId); + headers.set("X-User-Roles", "ADMIN"); + headers.setContentType(MediaType.APPLICATION_JSON); + + String body = "{\"newStatus\":\"CONFIRMED\"}"; + HttpEntity request = new HttpEntity<>(body, headers); + + restTemplate.exchange(url, HttpMethod.PATCH, request, String.class); + + log.info("Successfully confirmed appointment {} via Appointment Service", appointmentId); + } catch (HttpClientErrorException e) { + log.error("Failed to confirm appointment {}: {}", appointmentId, e.getMessage()); + // Don't throw - project approval should still succeed even if appointment confirmation fails + } catch (Exception e) { + log.error("Error communicating with Appointment Service: {}", e.getMessage()); + } + } +} diff --git a/project-service/src/main/java/com/techtorque/project_service/client/NotificationClient.java b/project-service/src/main/java/com/techtorque/project_service/client/NotificationClient.java new file mode 100644 index 0000000..4be0858 --- /dev/null +++ b/project-service/src/main/java/com/techtorque/project_service/client/NotificationClient.java @@ -0,0 +1,53 @@ +package com.techtorque.project_service.client; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.http.*; +import org.springframework.stereotype.Component; +import org.springframework.web.client.RestTemplate; +import org.springframework.web.client.HttpClientErrorException; + +/** + * Client for inter-service communication with Notification Service + */ +@Component +@Slf4j +public class NotificationClient { + + private final RestTemplate restTemplate; + private final String notificationServiceUrl; + + public NotificationClient( + RestTemplate restTemplate, + @Value("${services.notification.url:http://localhost:8088}") String notificationServiceUrl) { + this.restTemplate = restTemplate; + this.notificationServiceUrl = notificationServiceUrl; + } + + /** + * Send project notification to user + */ + public void sendProjectNotification(String userId, String type, String title, String message, String projectId) { + try { + String url = notificationServiceUrl + "/api/notifications/project"; + + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_JSON); + + String body = String.format( + "{\"userId\":\"%s\",\"type\":\"%s\",\"title\":\"%s\",\"message\":\"%s\",\"referenceId\":\"%s\",\"referenceType\":\"PROJECT\"}", + userId, type, title, message, projectId); + + HttpEntity request = new HttpEntity<>(body, headers); + + restTemplate.postForEntity(url, request, String.class); + + log.info("Successfully sent project notification to user {}", userId); + } catch (HttpClientErrorException e) { + log.error("Failed to send notification to user {}: {}", userId, e.getMessage()); + // Don't throw - project operations should still succeed even if notification fails + } catch (Exception e) { + log.error("Error communicating with Notification Service: {}", e.getMessage()); + } + } +} From 44862f018586e13f6aa0b11bd6c3c244d72ec506 Mon Sep 17 00:00:00 2001 From: Mehara Rothila Ranawaka Date: Mon, 10 Nov 2025 19:52:13 +0530 Subject: [PATCH 12/13] Update service URLs in project configuration --- project-service/src/main/resources/application.properties | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/project-service/src/main/resources/application.properties b/project-service/src/main/resources/application.properties index bbea78b..82b06d1 100644 --- a/project-service/src/main/resources/application.properties +++ b/project-service/src/main/resources/application.properties @@ -23,5 +23,9 @@ spring.servlet.multipart.max-file-size=10MB spring.servlet.multipart.max-request-size=50MB file.upload-dir=uploads/service-photos +# Inter-service Communication URLs +services.appointment.url=${APPOINTMENT_SERVICE_URL:http://localhost:8083} +services.notification.url=${NOTIFICATION_SERVICE_URL:http://localhost:8088} + # OpenAPI access URL # http://localhost:8084/swagger-ui/index.html \ No newline at end of file From 70e55ccdbcd812790bcbb417cb85a97ed64257ed Mon Sep 17 00:00:00 2001 From: RandithaK Date: Wed, 12 Nov 2025 00:32:19 +0530 Subject: [PATCH 13/13] Restrict pull request triggers to specific branches in build workflow --- .github/workflows/buildtest.yaml | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/.github/workflows/buildtest.yaml b/.github/workflows/buildtest.yaml index 132b427..72ab4c0 100644 --- a/.github/workflows/buildtest.yaml +++ b/.github/workflows/buildtest.yaml @@ -1,12 +1,11 @@ name: Build and Test Project Service on: - push: - branches: - - '**' pull_request: branches: - - '**' + - main + - dev + - devOps jobs: build-test: