diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml index 39e24a2..adb9fe7 100644 --- a/docker/docker-compose.yml +++ b/docker/docker-compose.yml @@ -45,13 +45,3 @@ services: - backend ports: - "3000:80" - - db-restore: - image: mysql:8.0 - depends_on: - mysql: - condition: service_healthy - volumes: - - ./backup.sql:/backup.sql - - ./docker/initdb.sh:/docker-entrypoint-initdb.d/initdb.sh - entrypoint: ["/bin/bash", "/docker-entrypoint-initdb.d/initdb.sh"] diff --git a/memberflow-api/libs/memberflow-data-1.0-SNAPSHOT.jar b/memberflow-api/libs/memberflow-data-1.0-SNAPSHOT.jar index dfe6bb1..aa2c3a8 100644 Binary files a/memberflow-api/libs/memberflow-data-1.0-SNAPSHOT.jar and b/memberflow-api/libs/memberflow-data-1.0-SNAPSHOT.jar differ diff --git a/memberflow-api/src/main/java/com/denniseckerskorn/MemberFlowApplication.java b/memberflow-api/src/main/java/com/denniseckerskorn/MemberFlowApplication.java index 6722e5d..9646420 100644 --- a/memberflow-api/src/main/java/com/denniseckerskorn/MemberFlowApplication.java +++ b/memberflow-api/src/main/java/com/denniseckerskorn/MemberFlowApplication.java @@ -3,6 +3,9 @@ package com.denniseckerskorn; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +/** + * Main application class for the MemberFlow application. + */ @SpringBootApplication public class MemberFlowApplication { public static void main(String[] args) { diff --git a/memberflow-api/src/main/java/com/denniseckerskorn/config/SecurityConfig.java b/memberflow-api/src/main/java/com/denniseckerskorn/config/SecurityConfig.java index a7ce3ff..5563b1d 100644 --- a/memberflow-api/src/main/java/com/denniseckerskorn/config/SecurityConfig.java +++ b/memberflow-api/src/main/java/com/denniseckerskorn/config/SecurityConfig.java @@ -14,27 +14,53 @@ import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.security.web.SecurityFilterChain; import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; +/** + * Security configuration class for the application. + */ @EnableMethodSecurity @Configuration public class SecurityConfig { private final JwtAuthFilter jwtAuthFilter; private final CustomUserDetailsService customUserDetailsService; + /** + * Constructor for SecurityConfig. + * + * @param jwtAuthFilter the JWT authentication filter + * @param customUserDetailsService the custom user details service + */ public SecurityConfig(JwtAuthFilter jwtAuthFilter, CustomUserDetailsService customUserDetailsService) { this.jwtAuthFilter = jwtAuthFilter; this.customUserDetailsService = customUserDetailsService; } + /** + * Bean for PasswordEncoder. + * + * @return a BCryptPasswordEncoder instance + */ @Bean public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); } + /** + * Bean for CustomUserDetailsService. + * + * @return the custom user details service + */ @Bean public AuthenticationManager authenticationManager(AuthenticationConfiguration config) throws Exception { return config.getAuthenticationManager(); } + /** + * Bean for SecurityFilterChain. + * + * @param http the HttpSecurity object + * @return a SecurityFilterChain instance + * @throws Exception if an error occurs during configuration + */ @Bean public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { return http diff --git a/memberflow-api/src/main/java/com/denniseckerskorn/config/SwaggerConfig.java b/memberflow-api/src/main/java/com/denniseckerskorn/config/SwaggerConfig.java index e15e52d..56e4a18 100644 --- a/memberflow-api/src/main/java/com/denniseckerskorn/config/SwaggerConfig.java +++ b/memberflow-api/src/main/java/com/denniseckerskorn/config/SwaggerConfig.java @@ -8,9 +8,18 @@ import io.swagger.v3.oas.models.security.SecurityScheme; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +/** + * Swagger configuration class for the MemberFlow API. + * This class sets up the OpenAPI documentation for the API, including security schemes and metadata. + */ @Configuration public class SwaggerConfig { + /** + * Configures the OpenAPI documentation for the MemberFlow API. + * + * @return an OpenAPI instance with the API information and security scheme. + */ @Bean public OpenAPI customOpenAPI() { final String securitySchemeName = "bearerAuth"; @@ -20,12 +29,12 @@ public class SwaggerConfig { .title("MemberFlow API") .version("1.0.0") .description(""" - Documentación de la API de MemberFlow. - **Usuarios de prueba:** - - Admin: admin@example.com / admin123 - - Teacher: teacher@example.com / 123456789 - - Student: student@example.com / 12345678 - """) + Documentación de la API de MemberFlow. + **Usuarios de prueba:** + - Admin: admin@example.com / admin123 + - Teacher: teacher@example.com / 123456789 + - Student: student@example.com / 12345678 + """) ) .addSecurityItem(new SecurityRequirement().addList(securitySchemeName)) .components(new Components() diff --git a/memberflow-api/src/main/java/com/denniseckerskorn/config/WebConfig.java b/memberflow-api/src/main/java/com/denniseckerskorn/config/WebConfig.java index 7cbf3fd..1307d9d 100644 --- a/memberflow-api/src/main/java/com/denniseckerskorn/config/WebConfig.java +++ b/memberflow-api/src/main/java/com/denniseckerskorn/config/WebConfig.java @@ -4,6 +4,10 @@ import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.CorsRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; +/** + * Web configuration class for setting up CORS mappings. + * This class allows cross-origin requests from specified origins. + */ @Configuration public class WebConfig implements WebMvcConfigurer { @Override diff --git a/memberflow-api/src/main/java/com/denniseckerskorn/controllers/AuthController.java b/memberflow-api/src/main/java/com/denniseckerskorn/controllers/AuthController.java index 3475e29..4a06d95 100644 --- a/memberflow-api/src/main/java/com/denniseckerskorn/controllers/AuthController.java +++ b/memberflow-api/src/main/java/com/denniseckerskorn/controllers/AuthController.java @@ -14,6 +14,10 @@ import org.springframework.security.authentication.UsernamePasswordAuthenticatio import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.web.bind.annotation.*; +/** + * AuthController handles user authentication requests. + * It provides an endpoint for user login, which returns a JWT token upon successful authentication. + */ @RestController @RequestMapping("/api/v1/auth") @Tag(name = "Authentication", description = "Operations related to user authentication") @@ -23,12 +27,25 @@ public class AuthController { private final JwtUtil jwtUtil; private final UserService userService; + /** + * Constructor for AuthController. + * + * @param authenticationManager Authentication manager for handling authentication requests. + * @param jwtUtil Utility class for generating JWT tokens. + * @param userService Service for handling user-related operations. + */ public AuthController(AuthenticationManager authenticationManager, JwtUtil jwtUtil, UserService userService) { this.authenticationManager = authenticationManager; this.jwtUtil = jwtUtil; this.userService = userService; } + /** + * API response codes for the login endpoint. + * + * @param loginRequest The login request containing user credentials. + * @return ResponseEntity containing the JWT token or an error message. + */ @ApiResponses(value = { @ApiResponse(responseCode = "200", description = "Successful login"), @ApiResponse(responseCode = "401", description = "Unauthorized"), diff --git a/memberflow-api/src/main/java/com/denniseckerskorn/controllers/class_management_controllers/AssistanceController.java b/memberflow-api/src/main/java/com/denniseckerskorn/controllers/class_management_controllers/AssistanceController.java index 8a17be6..2a42e3a 100644 --- a/memberflow-api/src/main/java/com/denniseckerskorn/controllers/class_management_controllers/AssistanceController.java +++ b/memberflow-api/src/main/java/com/denniseckerskorn/controllers/class_management_controllers/AssistanceController.java @@ -17,6 +17,10 @@ import org.springframework.web.bind.annotation.*; import java.util.List; import java.util.stream.Collectors; +/** + * AssistanceController handles requests related to assistance management. + * It provides endpoints for creating, updating, retrieving, and deleting assistance records. + */ @RestController @RequestMapping("/api/v1/assistances") @Tag(name = "Assistance Management", description = "Operations related to assistance management") @@ -26,6 +30,13 @@ public class AssistanceController { private final StudentService studentService; private final TrainingSessionService trainingSessionService; + /** + * Constructor for AssistanceController. + * + * @param assistanceService Service for handling assistance records. + * @param studentService Service for handling student records. + * @param trainingSessionService Service for handling training session records. + */ public AssistanceController( AssistanceService assistanceService, StudentService studentService, @@ -36,6 +47,12 @@ public class AssistanceController { this.trainingSessionService = trainingSessionService; } + /** + * Creates a new assistance record. + * + * @param dto The AssistanceDTO containing the details of the assistance to be created. + * @return ResponseEntity containing the created AssistanceDTO. + */ @Operation(summary = "Create a new assistance record") @PostMapping("/create") public ResponseEntity create(@RequestBody AssistanceDTO dto) { @@ -52,7 +69,12 @@ public class AssistanceController { return ResponseEntity.ok(AssistanceDTO.fromEntity(saved)); } - + /** + * Updates an existing assistance record. + * + * @param dto The AssistanceDTO containing the updated details of the assistance. + * @return ResponseEntity containing the updated AssistanceDTO. + */ @Operation(summary = "Update an existing assistance record", description = "Update an existing assistance record") @PutMapping("/update") public ResponseEntity update(@RequestBody AssistanceDTO dto) { @@ -64,6 +86,11 @@ public class AssistanceController { return ResponseEntity.ok(AssistanceDTO.fromEntity(updated)); } + /** + * Retrieves all assistance records. + * + * @return ResponseEntity containing a list of AssistanceDTOs. + */ @Operation(summary = "Get all assistance records", description = "Retrieve a list of all assistance records") @GetMapping("/getAll") public ResponseEntity> getAll() { @@ -74,6 +101,12 @@ public class AssistanceController { return ResponseEntity.ok(list); } + /** + * Retrieves assistance records by student ID. + * + * @param id The ID of the student whose assistance records are to be retrieved. + * @return ResponseEntity containing a list of AssistanceDTOs for the specified student. + */ @Operation(summary = "Get assistance records by student ID", description = "Retrieve assistance records for a specific student") @GetMapping("/getById/{id}") public ResponseEntity getAssistanceById(@PathVariable Integer id) { @@ -81,6 +114,12 @@ public class AssistanceController { return ResponseEntity.ok(AssistanceDTO.fromEntity(assistance)); } + /** + * Deletes an assistance record by ID. + * + * @param id The ID of the assistance record to be deleted. + * @return ResponseEntity indicating the result of the deletion operation. + */ @Operation(summary = "Delete an assistance record by ID") @DeleteMapping("/delete/{id}") public ResponseEntity delete(@PathVariable Integer id) { diff --git a/memberflow-api/src/main/java/com/denniseckerskorn/controllers/class_management_controllers/MembershipController.java b/memberflow-api/src/main/java/com/denniseckerskorn/controllers/class_management_controllers/MembershipController.java index 6f287e8..075dfd3 100644 --- a/memberflow-api/src/main/java/com/denniseckerskorn/controllers/class_management_controllers/MembershipController.java +++ b/memberflow-api/src/main/java/com/denniseckerskorn/controllers/class_management_controllers/MembershipController.java @@ -24,10 +24,21 @@ public class MembershipController { private final MembershipService membershipService; + /** + * Constructor for MembershipController. + * + * @param membershipService Service for handling membership records. + */ public MembershipController(MembershipService membershipService) { this.membershipService = membershipService; } + /** + * Creates a new membership. + * + * @param membershipDTO The MembershipDTO containing the details of the membership to be created. + * @return ResponseEntity containing the created MembershipDTO. + */ @Operation(summary = "Create a new membership") @PostMapping("/create") public ResponseEntity createMembership(@RequestBody MembershipDTO membershipDTO) { @@ -36,6 +47,11 @@ public class MembershipController { return ResponseEntity.status(HttpStatus.CREATED).body(MembershipDTO.fromEntity(savedMembership)); } + /** + * Retrieves all memberships. + * + * @return ResponseEntity containing a list of MembershipDTOs. + */ @Operation(summary = "Get all memberships", description = "Retrieve a list of all memberships") @GetMapping("/getAll") public ResponseEntity> getAllMemberships() { @@ -49,6 +65,12 @@ public class MembershipController { return ResponseEntity.ok(dtos); } + /** + * Retrieves a membership by its ID. + * + * @param id The ID of the membership to retrieve. + * @return ResponseEntity containing the MembershipDTO if found, or 404 Not Found if not found. + */ @Operation(summary = "Get a membership by ID", description = "Retrieve a membership by its ID") @GetMapping("/getById/{id}") public ResponseEntity getMembershipById(@PathVariable Integer id) { @@ -56,6 +78,13 @@ public class MembershipController { return ResponseEntity.ok(MembershipDTO.fromEntity(membership)); } + /** + * Updates an existing membership. + * + * @param id The ID of the membership to update. + * @param dto The MembershipDTO containing the updated details of the membership. + * @return ResponseEntity containing the updated MembershipDTO. + */ @Operation(summary = "Update a membership", description = "Update an existing membership") @Transactional @PutMapping("/update/{id}") @@ -65,6 +94,12 @@ public class MembershipController { return ResponseEntity.ok(MembershipDTO.fromEntity(updated)); } + /** + * Deletes a membership by its ID. + * + * @param id The ID of the membership to delete. + * @return ResponseEntity indicating the result of the deletion operation. + */ @Operation(summary = "Delete a membership", description = "Delete a membership by its ID") @Transactional @DeleteMapping("/delete/{id}") diff --git a/memberflow-api/src/main/java/com/denniseckerskorn/controllers/class_management_controllers/TrainingGroupController.java b/memberflow-api/src/main/java/com/denniseckerskorn/controllers/class_management_controllers/TrainingGroupController.java index 76dde1e..928140f 100644 --- a/memberflow-api/src/main/java/com/denniseckerskorn/controllers/class_management_controllers/TrainingGroupController.java +++ b/memberflow-api/src/main/java/com/denniseckerskorn/controllers/class_management_controllers/TrainingGroupController.java @@ -29,7 +29,6 @@ import java.util.stream.Collectors; * Controller for managing training groups. * Provides endpoints for creating, updating, retrieving, and deleting training groups. */ - @RestController @RequestMapping("/api/v1/training-groups") @Tag(name = "Training Group Management", description = "Operations related to training group management") @@ -40,7 +39,14 @@ public class TrainingGroupController { private final StudentService studentService; private final TrainingSessionService trainingSessionService; - + /** + * Constructor for TrainingGroupController. + * + * @param trainingGroupService Service for handling training group records. + * @param teacherService Service for handling teacher records. + * @param studentService Service for handling student records. + * @param trainingSessionService Service for handling training session records. + */ public TrainingGroupController(TrainingGroupService trainingGroupService, TeacherService teacherService, StudentService studentService, TrainingSessionService trainingSessionService) { this.trainingGroupService = trainingGroupService; this.teacherService = teacherService; @@ -48,6 +54,12 @@ public class TrainingGroupController { this.trainingSessionService = trainingSessionService; } + /** + * Creates a new training group with a teacher. + * + * @param dto The TrainingGroupDTO containing the details of the group to be created. + * @return ResponseEntity containing the created TrainingGroupDTO. + */ @Operation(summary = "Create a training group with a teacher") @PostMapping("/create") public ResponseEntity createGroup(@RequestBody TrainingGroupDTO dto) { @@ -68,7 +80,13 @@ public class TrainingGroupController { return ResponseEntity.status(HttpStatus.CREATED).body(new TrainingGroupDTO(createdGroup)); } - + /** + * Assigns a student to a training group. + * + * @param groupId The ID of the training group. + * @param studentId The ID of the student to be assigned. + * @return ResponseEntity indicating the result of the operation. + */ @Operation(summary = "Assign a student to a group") @PutMapping("/assign-student") public ResponseEntity assignStudent(@RequestParam Integer groupId, @RequestParam Integer studentId) { @@ -79,6 +97,13 @@ public class TrainingGroupController { return ResponseEntity.ok().build(); } + /** + * Removes a student from a training group. + * + * @param groupId The ID of the training group. + * @param studentId The ID of the student to be removed. + * @return ResponseEntity indicating the result of the operation. + */ @Operation(summary = "Remove a student from a group") @PutMapping("/remove-student") public ResponseEntity removeStudent(@RequestParam Integer groupId, @RequestParam Integer studentId) { @@ -89,7 +114,14 @@ public class TrainingGroupController { return ResponseEntity.ok().build(); } - @Operation(summary = "Actualizar un grupo de entrenamiento existente", description = "Actualiza un grupo de entrenamiento por su ID") + /** + * Updates an existing training group. + * + * @param id The ID of the training group to update. + * @param dto The TrainingGroupDTO containing the updated details of the group. + * @return ResponseEntity containing the updated TrainingGroupDTO. + */ + @Operation(summary = "Updates a training-group by its ID", description = "Update a training group with the specified ID") @Transactional @PutMapping("/update/{id}") public ResponseEntity update(@PathVariable Integer id, @RequestBody TrainingGroupDTO dto) { @@ -113,13 +145,23 @@ public class TrainingGroupController { return ResponseEntity.ok(new TrainingGroupDTO(updatedGroup)); } - + /** + * Finds a training group by its ID. + * + * @param id The ID of the training group to retrieve. + * @return ResponseEntity containing the TrainingGroupDTO if found, or 404 Not Found if not found. + */ @Operation(summary = "Find a training group by ID", description = "Retrieve a training group with the specified ID") @GetMapping("findById/{id}") public ResponseEntity findGroupById(@PathVariable Integer id) { return ResponseEntity.ok(new TrainingGroupDTO(trainingGroupService.findById(id))); } + /** + * Retrieves all training groups. + * + * @return ResponseEntity containing a list of TrainingGroupDTOs. + */ @Operation(summary = "Get all training groups", description = "Retrieve a list of all training groups") @GetMapping("/getAll") public ResponseEntity> getAll() { @@ -130,13 +172,19 @@ public class TrainingGroupController { ); } + /** + * Deletes a training group by its ID. + * + * @param id The ID of the training group to delete. + * @return ResponseEntity indicating the result of the deletion. + */ @Operation(summary = "Delete a training group by ID", description = "Delete a training group with the specified ID") @Transactional @DeleteMapping("/delete/{id}") public ResponseEntity delete(@PathVariable Integer id) { TrainingGroup group = trainingGroupService.findById(id); if (group == null) { - throw new EntityNotFoundException("Group not found"); + throw new EntityNotFoundException("Training group not found with ID: " + id); } for (TrainingSession session : group.getTrainingSessions()) { @@ -162,6 +210,12 @@ public class TrainingGroupController { return ResponseEntity.noContent().build(); } + /** + * Generates recurring training sessions for a group. + * + * @param dto The TrainingGroupDTO containing the group ID and recurrence details. + * @return ResponseEntity containing the updated TrainingGroupDTO. + */ @Operation(summary = "Generate recurring training sessions for a group", description = "Generates recurring training sessions for a specified number of months") @Transactional @PostMapping("/generate-recurring-sessions") @@ -176,5 +230,4 @@ public class TrainingGroupController { return ResponseEntity.ok(new TrainingGroupDTO(group)); } - } diff --git a/memberflow-api/src/main/java/com/denniseckerskorn/controllers/class_management_controllers/TrainingSessionController.java b/memberflow-api/src/main/java/com/denniseckerskorn/controllers/class_management_controllers/TrainingSessionController.java index 7b34dd3..c43b8cf 100644 --- a/memberflow-api/src/main/java/com/denniseckerskorn/controllers/class_management_controllers/TrainingSessionController.java +++ b/memberflow-api/src/main/java/com/denniseckerskorn/controllers/class_management_controllers/TrainingSessionController.java @@ -16,6 +16,10 @@ import java.time.LocalDateTime; import java.util.List; import java.util.stream.Collectors; +/** + * Controller for managing training sessions. + * Provides endpoints for creating, retrieving, and deleting training sessions. + */ @RestController @RequestMapping("/api/v1/training-sessions") @Tag(name = "Training Session Management", description = "Operations related to training session management") @@ -23,17 +27,34 @@ public class TrainingSessionController { private final TrainingSessionService trainingSessionService; private final TrainingGroupService trainingGroupService; + /** + * Constructor for TrainingSessionController. + * + * @param trainingSessionService Service for handling training session records. + * @param trainingGroupService Service for handling training group records. + */ public TrainingSessionController(TrainingSessionService trainingSessionService, TrainingGroupService trainingGroupService) { this.trainingSessionService = trainingSessionService; this.trainingGroupService = trainingGroupService; } + /** + * Finds a training session by its ID and returns it as a DTO. + * + * @param id The ID of the training session to find. + * @return TrainingSessionDTO containing the details of the found training session. + */ @Operation(summary = "Find a training session by ID", description = "Retrieve a training session by its ID") @GetMapping("findById/{id}") public TrainingSessionDTO findTrainingSessionById(@PathVariable Integer id) { return TrainingSessionDTO.fromEntity(trainingSessionService.findById(id)); } + /** + * Gets all training sessions and returns them as a list of DTOs. + * + * @return List of TrainingSessionDTOs containing all training sessions. + */ @Operation(summary = "Get all training sessions", description = "Retrieve a list of all training sessions") @GetMapping("/getAll") public List getAll() { @@ -43,6 +64,11 @@ public class TrainingSessionController { .collect(Collectors.toList()); } + /** + * Gets all training sessions by group ID and returns them as a list of DTOs. + * + * @param id The ID of the training group to find sessions for. + */ @Operation(summary = "Get all training sessions by group ID", description = "Retrieve a list of all training sessions by group ID") @DeleteMapping("delete/{id}") public void delete(@PathVariable Integer id) { diff --git a/memberflow-api/src/main/java/com/denniseckerskorn/controllers/finance_management/IVATypeController.java b/memberflow-api/src/main/java/com/denniseckerskorn/controllers/finance_management/IVATypeController.java index 116b397..cd3f531 100644 --- a/memberflow-api/src/main/java/com/denniseckerskorn/controllers/finance_management/IVATypeController.java +++ b/memberflow-api/src/main/java/com/denniseckerskorn/controllers/finance_management/IVATypeController.java @@ -16,6 +16,10 @@ import org.springframework.web.bind.annotation.*; import java.util.List; import java.util.stream.Collectors; +/** + * Controller for managing IVA types. + * Provides endpoints for creating, retrieving, updating, and deleting IVA types. + */ @RestController @RequestMapping("/api/v1/iva-types") @Tag(name = "IVA Types", description = "Operations related to IVA type management") @@ -23,10 +27,22 @@ public class IVATypeController { private final IVATypeService ivaTypeService; + /** + * Constructor for IVATypeController. + * + * @param ivaTypeService Service for handling IVA type records. + */ public IVATypeController(IVATypeService ivaTypeService) { this.ivaTypeService = ivaTypeService; } + /** + * Creates a new IVA type. + * + * @param dto The IVATypeDTO containing the details of the IVA type to be created. + * @return ResponseEntity containing the created IVATypeDTO. + * @throws DuplicateEntityException if an IVA type with the same name already exists. + */ @PostMapping("/create") @Operation(summary = "Create a new IVA type") public ResponseEntity create(@Valid @RequestBody IVATypeDTO dto) throws DuplicateEntityException { @@ -34,6 +50,14 @@ public class IVATypeController { return new ResponseEntity<>(new IVATypeDTO(saved), HttpStatus.CREATED); } + /** + * Updates an existing IVA type. + * + * @param dto The IVATypeDTO containing the updated details of the IVA type. + * @return ResponseEntity containing the updated IVATypeDTO. + * @throws EntityNotFoundException if the IVA type to update does not exist. + * @throws InvalidDataException if the provided data is invalid. + */ @PutMapping("/update") @Operation(summary = "Update an existing IVA type") public ResponseEntity update(@Valid @RequestBody IVATypeDTO dto) throws EntityNotFoundException, InvalidDataException { @@ -41,6 +65,14 @@ public class IVATypeController { return new ResponseEntity<>(new IVATypeDTO(updated), HttpStatus.OK); } + /** + * Retrieves an IVA type by its ID. + * + * @param id The ID of the IVA type to retrieve. + * @return ResponseEntity containing the IVATypeDTO if found. + * @throws EntityNotFoundException if the IVA type with the specified ID does not exist. + * @throws InvalidDataException if the provided ID is invalid. + */ @GetMapping("/getById/{id}") @Operation(summary = "Get IVA type by ID") public ResponseEntity getById(@PathVariable Integer id) throws EntityNotFoundException, InvalidDataException { @@ -48,6 +80,11 @@ public class IVATypeController { return new ResponseEntity<>(new IVATypeDTO(entity), HttpStatus.OK); } + /** + * Retrieves all IVA types. + * + * @return ResponseEntity containing a list of IVATypeDTOs. + */ @GetMapping("/getAll") @Operation(summary = "Get all IVA types") public ResponseEntity> getAll() { @@ -56,6 +93,14 @@ public class IVATypeController { return new ResponseEntity<>(dtos, HttpStatus.OK); } + /** + * Deletes an IVA type by its ID. + * + * @param id The ID of the IVA type to delete. + * @return ResponseEntity with no content if deletion is successful. + * @throws EntityNotFoundException if the IVA type with the specified ID does not exist. + * @throws InvalidDataException if the IVA type is in use and cannot be deleted. + */ @DeleteMapping("/deleteById/{id}") @Operation(summary = "Delete IVA type by ID (if not in use)") public ResponseEntity delete(@PathVariable Integer id) throws EntityNotFoundException, InvalidDataException { diff --git a/memberflow-api/src/main/java/com/denniseckerskorn/controllers/finance_management/InvoiceController.java b/memberflow-api/src/main/java/com/denniseckerskorn/controllers/finance_management/InvoiceController.java index bf2e8aa..6916479 100644 --- a/memberflow-api/src/main/java/com/denniseckerskorn/controllers/finance_management/InvoiceController.java +++ b/memberflow-api/src/main/java/com/denniseckerskorn/controllers/finance_management/InvoiceController.java @@ -27,6 +27,10 @@ import org.springframework.web.bind.annotation.*; import java.util.List; import java.util.stream.Collectors; +/** + * Controller for managing invoices. + * Provides endpoints for creating, retrieving, updating, and deleting invoices, + */ @RestController @RequestMapping("/api/v1/invoices") @Tag(name = "Invoices", description = "Operations related to invoice management") @@ -37,6 +41,14 @@ public class InvoiceController { private final ProductServiceService productServiceService; private final InvoicePdfGenerator invoicePdfGenerator; + /** + * Constructor for InvoiceController. + * + * @param invoiceService Service for handling invoice records. + * @param userService Service for handling user records. + * @param productServiceService Service for handling product/service records. + * @param invoicePdfGenerator Service for generating PDF invoices. + */ public InvoiceController(InvoiceService invoiceService, UserService userService, ProductServiceService productServiceService, InvoicePdfGenerator invoicePdfGenerator) { this.invoiceService = invoiceService; this.userService = userService; @@ -44,6 +56,14 @@ public class InvoiceController { this.invoicePdfGenerator = invoicePdfGenerator; } + /** + * Creates a new invoice with lines. + * + * @param dto The CreateInvoiceRequestDTO containing the details of the invoice and its lines. + * @return ResponseEntity containing the created InvoiceDTO. + * @throws EntityNotFoundException If the user or product/service is not found. + * @throws InvalidDataException If the provided data is invalid. + */ @PostMapping("/createInvoiceWithLines") @Operation(summary = "Create a new invoice with lines") public ResponseEntity createInvoiceWithLines(@Valid @RequestBody CreateInvoiceRequestDTO dto) throws EntityNotFoundException, InvalidDataException { @@ -59,7 +79,7 @@ public class InvoiceController { for (CreateInvoiceLineDTO lineDTO : dto.getLines()) { ProductService product = productServiceService.findById(lineDTO.getProductServiceId()); if (product == null) { - throw new EntityNotFoundException("Product/Service not found"); + throw new EntityNotFoundException("Product/Service not found with ID: " + lineDTO.getProductServiceId()); } InvoiceLine line = lineDTO.toEntity(invoice, product); invoiceService.addLineToInvoiceById(invoice.getId(), line); @@ -69,6 +89,13 @@ public class InvoiceController { return new ResponseEntity<>(new InvoiceDTO(invoice), HttpStatus.CREATED); } + /** + * Generates a PDF for an invoice by its ID. + * + * @param id The ID of the invoice to generate the PDF for. + * @return ResponseEntity containing the PDF file as a byte array. + * @throws EntityNotFoundException If the invoice is not found. + */ @GetMapping("/generatePDFById/{id}") @Operation(summary = "Generate PDF for invoice by ID") public ResponseEntity downloadInvoicePdf(@PathVariable Integer id) throws EntityNotFoundException { @@ -82,7 +109,13 @@ public class InvoiceController { .body(pdf); } - + /** + * Creates a new invoice. + * + * @param dto The InvoiceDTO containing the details of the invoice to be created. + * @return ResponseEntity containing the created InvoiceDTO. + * @throws DuplicateEntityException If an invoice with the same details already exists. + */ @PostMapping("/create") @Operation(summary = "Create a new invoice") public ResponseEntity createInvoice(@Valid @RequestBody InvoiceDTO dto) throws DuplicateEntityException { @@ -90,6 +123,14 @@ public class InvoiceController { return new ResponseEntity<>(new InvoiceDTO(saved), HttpStatus.CREATED); } + /** + * Updates an existing invoice. + * + * @param dto The InvoiceDTO containing the updated details of the invoice. + * @return ResponseEntity containing the updated InvoiceDTO. + * @throws EntityNotFoundException If the invoice to update is not found. + * @throws InvalidDataException If the provided data is invalid. + */ @PutMapping("/update") @Operation(summary = "Update an existing invoice") public ResponseEntity updateInvoice(@Valid @RequestBody InvoiceDTO dto) throws EntityNotFoundException, InvalidDataException { @@ -97,6 +138,14 @@ public class InvoiceController { return new ResponseEntity<>(new InvoiceDTO(updated), HttpStatus.OK); } + /** + * Retrieves an invoice by its ID. + * + * @param id The ID of the invoice to retrieve. + * @return ResponseEntity containing the InvoiceDTO if found, or 404 Not Found if not found. + * @throws EntityNotFoundException If the invoice is not found. + * @throws InvalidDataException If the provided data is invalid. + */ @GetMapping("/getById/{id}") @Operation(summary = "Get invoice by ID") public ResponseEntity getInvoiceById(@PathVariable Integer id) throws EntityNotFoundException, InvalidDataException { @@ -104,6 +153,11 @@ public class InvoiceController { return new ResponseEntity<>(new InvoiceDTO(invoice), HttpStatus.OK); } + /** + * Retrieves all invoices. + * + * @return ResponseEntity containing a list of InvoiceDTOs. + */ @GetMapping("/getAll") @Operation(summary = "Get all invoices") public ResponseEntity> getAllInvoices() { @@ -112,6 +166,14 @@ public class InvoiceController { return new ResponseEntity<>(dtos, HttpStatus.OK); } + /** + * Deletes an invoice by its ID. + * + * @param id The ID of the invoice to delete. + * @return ResponseEntity with status NO_CONTENT if successful. + * @throws EntityNotFoundException If the invoice to delete is not found. + * @throws InvalidDataException If the provided data is invalid. + */ @DeleteMapping("/deleteById/{id}") @Operation(summary = "Delete invoice by ID") public ResponseEntity deleteInvoice(@PathVariable Integer id) throws EntityNotFoundException, InvalidDataException { @@ -119,6 +181,13 @@ public class InvoiceController { return new ResponseEntity<>(HttpStatus.NO_CONTENT); } + /** + * Retrieves all invoices associated with a specific user ID. + * + * @param userId The ID of the user whose invoices are to be retrieved. + * @return ResponseEntity containing a list of InvoiceDTOs for the specified user. + * @throws InvalidDataException If the provided data is invalid. + */ @GetMapping("/getAllInvoicesByUserId/{userId}") @Operation(summary = "Get all invoices by user ID") public ResponseEntity> getInvoicesByUserId(@PathVariable Integer userId) throws InvalidDataException { @@ -127,6 +196,13 @@ public class InvoiceController { return new ResponseEntity<>(dtos, HttpStatus.OK); } + /** + * Adds a line to an invoice by its ID. + * + * @param invoiceId The ID of the invoice to add the line to. + * @param line The InvoiceLine to be added to the invoice. + * @return ResponseEntity with status OK if successful. + */ @PostMapping("/addLinesByInvoiceId/{invoiceId}") @Operation(summary = "Add a line to an invoice by invoice ID") public ResponseEntity addLineToInvoice(@PathVariable Integer invoiceId, @RequestBody @Valid InvoiceLine line) { @@ -134,6 +210,14 @@ public class InvoiceController { return new ResponseEntity<>(HttpStatus.OK); } + /** + * Removes a line from an invoice by its ID. + * + * @param invoiceId The ID of the invoice to remove the line from. + * @param lineId The ID of the line to be removed. + * @return ResponseEntity with status NO_CONTENT if successful. + * @throws EntityNotFoundException If the invoice or line is not found. + */ @DeleteMapping("/removeLineFromInvoiceById/{invoiceId}") @Operation(summary = "Remove a line from an invoice by IDs") public ResponseEntity removeLineFromInvoice(@PathVariable Integer invoiceId, @PathVariable Integer lineId) { @@ -141,6 +225,14 @@ public class InvoiceController { return new ResponseEntity<>(HttpStatus.NO_CONTENT); } + /** + * Recalculates the total of an invoice by its ID. + * + * @param invoiceId The ID of the invoice to recalculate the total for. + * @return ResponseEntity with status OK if successful. + * @throws EntityNotFoundException If the invoice is not found. + * @throws InvalidDataException If the provided data is invalid. + */ @PutMapping("/recalculateTotalOfInvoiceById/{invoiceId}") @Operation(summary = "Recalculate the total of an invoice") public ResponseEntity recalculateTotal(@PathVariable Integer invoiceId) throws EntityNotFoundException, InvalidDataException { @@ -149,6 +241,14 @@ public class InvoiceController { return new ResponseEntity<>(HttpStatus.OK); } + /** + * Clears all lines from an invoice by its ID. + * + * @param invoiceId The ID of the invoice to clear lines from. + * @return ResponseEntity with status NO_CONTENT if successful. + * @throws EntityNotFoundException If the invoice is not found. + * @throws InvalidDataException If the provided data is invalid. + */ @DeleteMapping("/clearAllLinesFromInvoiceById/{invoiceId}") @Operation(summary = "Clear all invoice lines from an invoice") public ResponseEntity clearInvoiceLines(@PathVariable Integer invoiceId) throws EntityNotFoundException, InvalidDataException { diff --git a/memberflow-api/src/main/java/com/denniseckerskorn/controllers/finance_management/InvoiceLineController.java b/memberflow-api/src/main/java/com/denniseckerskorn/controllers/finance_management/InvoiceLineController.java index 19965a5..8facc6b 100644 --- a/memberflow-api/src/main/java/com/denniseckerskorn/controllers/finance_management/InvoiceLineController.java +++ b/memberflow-api/src/main/java/com/denniseckerskorn/controllers/finance_management/InvoiceLineController.java @@ -17,7 +17,8 @@ import java.util.List; import java.util.stream.Collectors; /** - * InvoiceLineController handles operations related to invoice lines (items in invoices). + * Controller for managing invoice lines. + * Provides endpoints for creating, retrieving, updating, and deleting invoice lines. */ @RestController @RequestMapping("/api/v1/invoice-lines") @@ -26,10 +27,22 @@ public class InvoiceLineController { private final InvoiceLineService invoiceLineService; + /** + * Constructor for InvoiceLineController. + * + * @param invoiceLineService Service for handling invoice line records. + */ public InvoiceLineController(InvoiceLineService invoiceLineService) { this.invoiceLineService = invoiceLineService; } + /** + * Creates a new invoice line. + * + * @param dto The InvoiceLineDTO containing the details of the invoice line to be created. + * @return ResponseEntity containing the created InvoiceLineDTO. + * @throws DuplicateEntityException if an invoice line with the same details already exists. + */ @PostMapping("/create") @Operation(summary = "Create a new invoice line") public ResponseEntity create(@Valid @RequestBody InvoiceLineDTO dto) throws DuplicateEntityException { @@ -37,6 +50,14 @@ public class InvoiceLineController { return new ResponseEntity<>(new InvoiceLineDTO(saved), HttpStatus.CREATED); } + /** + * Updates an existing invoice line. + * + * @param dto The InvoiceLineDTO containing the updated details of the invoice line. + * @return ResponseEntity containing the updated InvoiceLineDTO. + * @throws InvalidDataException if the provided data is invalid. + * @throws EntityNotFoundException if the invoice line to update does not exist. + */ @PutMapping("/update") @Operation(summary = "Update an existing invoice line") public ResponseEntity update(@Valid @RequestBody InvoiceLineDTO dto) throws InvalidDataException, EntityNotFoundException { @@ -44,6 +65,14 @@ public class InvoiceLineController { return new ResponseEntity<>(new InvoiceLineDTO(updated), HttpStatus.OK); } + /** + * Retrieves an invoice line by its ID. + * + * @param id The ID of the invoice line to retrieve. + * @return ResponseEntity containing the InvoiceLineDTO of the found invoice line. + * @throws InvalidDataException if the provided ID is invalid. + * @throws EntityNotFoundException if the invoice line with the given ID does not exist. + */ @GetMapping("/getById/{id}") @Operation(summary = "Get invoice line by ID") public ResponseEntity getById(@PathVariable Integer id) throws InvalidDataException, EntityNotFoundException { @@ -51,6 +80,11 @@ public class InvoiceLineController { return new ResponseEntity<>(new InvoiceLineDTO(line), HttpStatus.OK); } + /** + * Retrieves all invoice lines. + * + * @return ResponseEntity containing a list of InvoiceLineDTOs representing all invoice lines. + */ @GetMapping("/getAll") @Operation(summary = "Get all invoice lines") public ResponseEntity> getAll() { @@ -59,6 +93,14 @@ public class InvoiceLineController { return new ResponseEntity<>(dtos, HttpStatus.OK); } + /** + * Deletes an invoice line by its ID. + * + * @param id The ID of the invoice line to delete. + * @return ResponseEntity with no content status. + * @throws InvalidDataException if the provided ID is invalid. + * @throws EntityNotFoundException if the invoice line with the given ID does not exist. + */ @DeleteMapping("/deleteById/{id}") @Operation(summary = "Delete invoice line by ID") public ResponseEntity delete(@PathVariable Integer id) throws InvalidDataException, EntityNotFoundException { diff --git a/memberflow-api/src/main/java/com/denniseckerskorn/controllers/finance_management/PaymentController.java b/memberflow-api/src/main/java/com/denniseckerskorn/controllers/finance_management/PaymentController.java index ff95ced..1c55385 100644 --- a/memberflow-api/src/main/java/com/denniseckerskorn/controllers/finance_management/PaymentController.java +++ b/memberflow-api/src/main/java/com/denniseckerskorn/controllers/finance_management/PaymentController.java @@ -17,6 +17,10 @@ import org.springframework.web.bind.annotation.*; import java.util.List; import java.util.stream.Collectors; +/** + * PaymentController handles requests related to payment management. + * It provides endpoints for creating, updating, retrieving, and deleting payments. + */ @RestController @RequestMapping("/api/v1/payments") @Tag(name = "Payments", description = "Operations related to payment management") @@ -24,10 +28,23 @@ public class PaymentController { private final PaymentService paymentService; + /** + * Constructor for PaymentController. + * + * @param paymentService Service for handling payment records. + */ public PaymentController(PaymentService paymentService) { this.paymentService = paymentService; } + /** + * Creates a new payment and marks the associated invoice as PAID. + * + * @param dto The PaymentDTO containing the details of the payment to be created. + * @return ResponseEntity containing the created PaymentDTO. + * @throws DuplicateEntityException if a payment already exists for the given invoice ID. + * @throws EntityNotFoundException if the invoice with the given ID does not exist. + */ @PostMapping("/create") @Operation(summary = "Create a new payment and mark invoice as PAID") public ResponseEntity create(@Valid @RequestBody PaymentDTO dto) @@ -46,7 +63,14 @@ public class PaymentController { return new ResponseEntity<>(new PaymentDTO(saved), HttpStatus.CREATED); } - + /** + * Updates an existing payment and adjusts the invoice status accordingly. + * + * @param dto The PaymentDTO containing the updated details of the payment. + * @return ResponseEntity containing the updated PaymentDTO. + * @throws EntityNotFoundException if the invoice with the given ID does not exist. + * @throws InvalidDataException if the provided data is invalid. + */ @PutMapping("/update") @Operation(summary = "Update an existing payment and adjust invoice status") public ResponseEntity update(@Valid @RequestBody PaymentDTO dto) @@ -61,11 +85,18 @@ public class PaymentController { if (updated == null) { throw new InvalidDataException("Payment update failed for invoice ID: " + dto.getInvoiceId()); } - + return new ResponseEntity<>(new PaymentDTO(updated), HttpStatus.OK); } - + /** + * Retrieves a payment by its ID. + * + * @param id The ID of the payment to retrieve. + * @return ResponseEntity containing the PaymentDTO if found. + * @throws EntityNotFoundException if the payment with the given ID does not exist. + * @throws InvalidDataException if the provided ID is invalid. + */ @GetMapping("/getById/{id}") @Operation(summary = "Get payment by ID") public ResponseEntity getById(@PathVariable Integer id) throws EntityNotFoundException, InvalidDataException { @@ -73,6 +104,11 @@ public class PaymentController { return new ResponseEntity<>(new PaymentDTO(payment), HttpStatus.OK); } + /** + * Retrieves all payments. + * + * @return ResponseEntity containing a list of PaymentDTOs. + */ @GetMapping("/getAll") @Operation(summary = "Get all payments") public ResponseEntity> getAll() { @@ -81,6 +117,14 @@ public class PaymentController { return new ResponseEntity<>(dtos, HttpStatus.OK); } + /** + * Deletes a payment by its ID and sets the associated invoice status to NOT_PAID. + * + * @param id The ID of the payment to delete. + * @return ResponseEntity with no content status. + * @throws EntityNotFoundException if the payment with the given ID does not exist. + * @throws InvalidDataException if the provided ID is invalid. + */ @DeleteMapping("/deleteById/{id}") @Operation(summary = "Remove a payment and set invoice status to NOT_PAID") public ResponseEntity removePayment(@PathVariable Integer id) throws EntityNotFoundException, InvalidDataException { @@ -88,6 +132,12 @@ public class PaymentController { return new ResponseEntity<>(HttpStatus.NO_CONTENT); } + /** + * Retrieves all payments made by a specific user. + * + * @param userId The ID of the user whose payments are to be retrieved. + * @return ResponseEntity containing a list of PaymentDTOs for the specified user. + */ @GetMapping("/getAllByUserId/{userId}") @Operation(summary = "Get all payments by user ID") public ResponseEntity> getAllByUserId(@PathVariable Integer userId) { diff --git a/memberflow-api/src/main/java/com/denniseckerskorn/controllers/finance_management/ProductServiceController.java b/memberflow-api/src/main/java/com/denniseckerskorn/controllers/finance_management/ProductServiceController.java index 1b5eb90..cbb5b00 100644 --- a/memberflow-api/src/main/java/com/denniseckerskorn/controllers/finance_management/ProductServiceController.java +++ b/memberflow-api/src/main/java/com/denniseckerskorn/controllers/finance_management/ProductServiceController.java @@ -18,6 +18,10 @@ import org.springframework.web.bind.annotation.*; import java.util.List; import java.util.stream.Collectors; +/** + * Controller for managing products and services. + * Provides endpoints for creating, updating, retrieving, and deleting products/services. + */ @RestController @RequestMapping("/api/v1/products-services") @Tag(name = "Product Services", description = "Operations related to product/service management") @@ -26,11 +30,24 @@ public class ProductServiceController { private final ProductServiceService productServiceService; private final IVATypeService ivaTypeService; + /** + * Constructor for ProductServiceController. + * + * @param productServiceService Service for handling product/service records. + * @param ivaTypeService Service for handling IVA type records. + */ public ProductServiceController(ProductServiceService productServiceService, IVATypeService ivaTypeService) { this.productServiceService = productServiceService; this.ivaTypeService = ivaTypeService; } + /** + * Creates a new product/service. + * + * @param dto The ProductServiceDTO containing the details of the product/service to be created. + * @return ResponseEntity containing the created ProductServiceDTO. + * @throws DuplicateEntityException if a product/service with the same name already exists. + */ @PostMapping("/create") @Operation(summary = "Create a new product/service") public ResponseEntity create(@Valid @RequestBody ProductServiceDTO dto) throws DuplicateEntityException { @@ -39,6 +56,14 @@ public class ProductServiceController { return new ResponseEntity<>(new ProductServiceDTO(saved), HttpStatus.CREATED); } + /** + * Updates an existing product/service. + * + * @param dto The ProductServiceDTO containing the updated details of the product/service. + * @return ResponseEntity containing the updated ProductServiceDTO. + * @throws EntityNotFoundException if the product/service to update does not exist. + * @throws InvalidDataException if the provided data is invalid. + */ @PutMapping("/update") @Operation(summary = "Update an existing product/service") public ResponseEntity update(@Valid @RequestBody ProductServiceDTO dto) throws EntityNotFoundException, InvalidDataException { @@ -47,7 +72,14 @@ public class ProductServiceController { return new ResponseEntity<>(new ProductServiceDTO(updated), HttpStatus.OK); } - + /** + * Retrieves a product/service by its ID. + * + * @param id The ID of the product/service to retrieve. + * @return ResponseEntity containing the ProductServiceDTO if found. + * @throws EntityNotFoundException if the product/service with the specified ID does not exist. + * @throws InvalidDataException if the provided ID is invalid. + */ @GetMapping("/getById/{id}") @Operation(summary = "Get product/service by ID") public ResponseEntity getById(@PathVariable Integer id) throws EntityNotFoundException, InvalidDataException { @@ -55,6 +87,11 @@ public class ProductServiceController { return new ResponseEntity<>(new ProductServiceDTO(entity), HttpStatus.OK); } + /** + * Retrieves all products/services. + * + * @return ResponseEntity containing a list of ProductServiceDTOs. + */ @GetMapping("/getAll") @Operation(summary = "Get all products/services") public ResponseEntity> getAll() { @@ -63,6 +100,14 @@ public class ProductServiceController { return new ResponseEntity<>(dtos, HttpStatus.OK); } + /** + * Deletes a product/service by its ID. + * + * @param id The ID of the product/service to delete. + * @return ResponseEntity with no content if deletion is successful. + * @throws EntityNotFoundException if the product/service with the specified ID does not exist. + * @throws InvalidDataException if the provided ID is invalid. + */ @DeleteMapping("/deleteById/{id}") @Operation(summary = "Delete product/service by ID") public ResponseEntity delete(@PathVariable Integer id) throws EntityNotFoundException, InvalidDataException { diff --git a/memberflow-api/src/main/java/com/denniseckerskorn/controllers/user_managment_controllers/AdminController.java b/memberflow-api/src/main/java/com/denniseckerskorn/controllers/user_managment_controllers/AdminController.java index 509ef80..ea01225 100644 --- a/memberflow-api/src/main/java/com/denniseckerskorn/controllers/user_managment_controllers/AdminController.java +++ b/memberflow-api/src/main/java/com/denniseckerskorn/controllers/user_managment_controllers/AdminController.java @@ -18,6 +18,10 @@ import java.time.LocalDateTime; import java.util.List; import java.util.stream.Collectors; +/** + * Controller for managing administrators. + * Provides endpoints for creating, retrieving, updating, and deleting administrators. + */ @RestController @RequestMapping("/api/v1/admins") @Tag(name = "Administrator Management", description = "Operations related to administrator management") @@ -26,14 +30,28 @@ public class AdminController { private final AdminService adminService; private final RoleService roleService; + /** + * Password encoder for encoding passwords. + */ @Autowired private PasswordEncoder passwordEncoder; + /** + * Constructor for AdminController. + * + * @param adminService Service for handling administrator records. + * @param roleService Service for handling roles. + */ public AdminController(AdminService adminService, RoleService roleService) { this.adminService = adminService; this.roleService = roleService; } + /** + * Gets all administrators and returns them as a list of DTOs. + * + * @return ResponseEntity containing a list of AdminDTOs or no content if none found. + */ @Operation(summary = "Get all administrators") @GetMapping("/getAll") public ResponseEntity> getAllAdmins() { @@ -45,6 +63,12 @@ public class AdminController { return dtos.isEmpty() ? ResponseEntity.noContent().build() : ResponseEntity.ok(dtos); } + /** + * Gets administrator by ID and returns it as a DTO. + * + * @param id The ID of the administrator to find. + * @return ResponseEntity containing the AdminDTO or not found if the ID does not exist. + */ @Operation(summary = "Get administrator by ID") @GetMapping("/getById/{id}") public ResponseEntity getById(@PathVariable Integer id) { @@ -52,6 +76,12 @@ public class AdminController { return ResponseEntity.ok(convertToDTO(admin)); } + /** + * Creates a new administrator. + * + * @param dto The AdminDTO containing the details of the administrator to be created. + * @return ResponseEntity containing the created AdminDTO with status 201 Created. + */ @Operation(summary = "Create a new administrator") @PostMapping("/create") public ResponseEntity create(@RequestBody AdminDTO dto) { @@ -60,6 +90,13 @@ public class AdminController { return ResponseEntity.status(201).body(convertToDTO(saved)); } + /** + * Updates an existing administrator. + * + * @param id The ID of the administrator to update. + * @param dto The AdminDTO containing the updated details of the administrator. + * @return ResponseEntity containing the updated AdminDTO. + */ @Operation(summary = "Update an existing administrator") @PutMapping("/update/{id}") public ResponseEntity update(@PathVariable Integer id, @RequestBody AdminDTO dto) { @@ -69,6 +106,12 @@ public class AdminController { return ResponseEntity.ok(convertToDTO(updated)); } + /** + * Deletes an administrator by ID. + * + * @param id The ID of the administrator to delete. + * @return ResponseEntity with a message indicating successful deletion. + */ @Operation(summary = "Delete an administrator by ID") @DeleteMapping("/delete/{id}") public ResponseEntity delete(@PathVariable Integer id) { @@ -76,12 +119,26 @@ public class AdminController { return ResponseEntity.ok("Admin deleted"); } - // -------------------- Utils -------------------- + /* -------------------- Utils -------------------- */ + /** + * Converts an Admin entity to an AdminDTO. + * + * @param admin The Admin entity to convert. + * @return The converted AdminDTO. + */ private AdminDTO convertToDTO(Admin admin) { return AdminDTO.fromEntity(admin); } + /** + * Converts an AdminDTO to an Admin entity. + * + * @param dto The AdminDTO to convert. + * @param isCreate Indicates if the conversion is for creation (true) or update (false). + * @return The converted Admin entity. + * @throws InvalidDataException if the provided data is invalid. + */ private Admin convertToEntity(AdminDTO dto, boolean isCreate) { if (dto == null || dto.getUser() == null) { throw new InvalidDataException("Admin and User data are required"); @@ -118,5 +175,4 @@ public class AdminController { admin.setUser(user); return admin; } - } diff --git a/memberflow-api/src/main/java/com/denniseckerskorn/controllers/user_managment_controllers/NotificationController.java b/memberflow-api/src/main/java/com/denniseckerskorn/controllers/user_managment_controllers/NotificationController.java index 6468507..1503aba 100644 --- a/memberflow-api/src/main/java/com/denniseckerskorn/controllers/user_managment_controllers/NotificationController.java +++ b/memberflow-api/src/main/java/com/denniseckerskorn/controllers/user_managment_controllers/NotificationController.java @@ -15,6 +15,10 @@ import java.util.List; import java.util.Set; import java.util.stream.Collectors; +/** + * NotificationController handles requests related to notification management. + * It provides endpoints for creating, retrieving, updating, and deleting notifications. + */ @RestController @RequestMapping("/api/v1/notifications") @Tag(name = "Notification Management", description = "Operations related to notifications") @@ -23,11 +27,22 @@ public class NotificationController { private final NotificationService notificationService; private final UserService userService; + /** + * Constructor for NotificationController. + * + * @param notificationService Service for handling notification records. + * @param userService Service for handling user records. + */ public NotificationController(NotificationService notificationService, UserService userService) { this.notificationService = notificationService; this.userService = userService; } + /** + * Gets all notifications and returns them as a list of DTOs. + * + * @return ResponseEntity containing a list of NotificationDTOs or no content if none found. + */ @Operation(summary = "Get all notifications", description = "Retrieve a list of all notifications") @GetMapping("/getAll") public ResponseEntity> getAll() { @@ -38,6 +53,12 @@ public class NotificationController { return ResponseEntity.ok(dtos); } + /** + * Gets a notification by its ID and returns it as a DTO. + * + * @param id The ID of the notification to find. + * @return ResponseEntity containing the NotificationDTO or not found if it doesn't exist. + */ @Operation(summary = "Get a notification by ID", description = "Retrieve a notification by its ID") @GetMapping("/getById/{id}") public ResponseEntity getById(@PathVariable Integer id) { @@ -45,6 +66,12 @@ public class NotificationController { return ResponseEntity.ok(toDTO(notification)); } + /** + * Creates a new notification. + * + * @param dto The NotificationDTO containing the details of the notification to be created. + * @return ResponseEntity containing the created NotificationDTO. + */ @Operation(summary = "Create a new notification", description = "Create a new notification") @PostMapping("/create") public ResponseEntity create(@RequestBody NotificationDTO dto) { @@ -57,11 +84,16 @@ public class NotificationController { notificationService.addNotificationToUser(saved, user); } } - return ResponseEntity.status(201).body(toDTO(saved)); } - + /** + * Updates an existing notification by its ID. + * + * @param id The ID of the notification to update. + * @param dto The NotificationDTO containing the updated details of the notification. + * @return ResponseEntity containing the updated NotificationDTO. + */ @Operation(summary = "Update a notification by ID", description = "Update a notification by its ID") @PutMapping("/update/{id}") public ResponseEntity update(@PathVariable Integer id, @RequestBody NotificationDTO dto) { @@ -87,7 +119,12 @@ public class NotificationController { return ResponseEntity.ok(toDTO(updated)); } - + /** + * Deletes a notification by its ID. + * + * @param id The ID of the notification to delete. + * @return ResponseEntity with a message indicating successful deletion. + */ @Operation(summary = "Delete a notification by ID", description = "Delete a notification by its ID") @DeleteMapping("/delete/{id}") public ResponseEntity delete(@PathVariable Integer id) { @@ -95,8 +132,14 @@ public class NotificationController { return ResponseEntity.ok("Notification deleted successfully."); } - // -------------------- Mapping -------------------- + /* -------------------- Utils -------------------- */ + /** + * Converts a Notification entity to a NotificationDTO. + * + * @param notification The Notification entity to convert. + * @return The converted NotificationDTO. + */ private NotificationDTO toDTO(Notification notification) { Set userIds = notification.getUsers() != null ? notification.getUsers().stream().map(User::getId).collect(Collectors.toSet()) @@ -113,6 +156,13 @@ public class NotificationController { ); } + /** + * Converts a NotificationDTO to a Notification entity. + * + * @param dto The NotificationDTO to convert. + * @param includeUsers Whether to include users in the conversion. + * @return The converted Notification entity. + */ private Notification toEntity(NotificationDTO dto, boolean includeUsers) { Notification notification = (dto.getId() != null) ? notificationService.findById(dto.getId()) @@ -126,5 +176,4 @@ public class NotificationController { return notification; } - } diff --git a/memberflow-api/src/main/java/com/denniseckerskorn/controllers/user_managment_controllers/PermissionController.java b/memberflow-api/src/main/java/com/denniseckerskorn/controllers/user_managment_controllers/PermissionController.java index 9640ab6..f7e48c2 100644 --- a/memberflow-api/src/main/java/com/denniseckerskorn/controllers/user_managment_controllers/PermissionController.java +++ b/memberflow-api/src/main/java/com/denniseckerskorn/controllers/user_managment_controllers/PermissionController.java @@ -11,6 +11,10 @@ import org.springframework.web.bind.annotation.*; import java.util.List; import java.util.stream.Collectors; +/** + * PermissionController handles requests related to permission management. + * It provides endpoints for creating, retrieving, updating, and deleting permissions. + */ @RestController @RequestMapping("/api/v1/permissions") @Tag(name = "Permission Management", description = "Operations related to permissions") @@ -18,10 +22,20 @@ public class PermissionController { private final PermissionService permissionService; + /** + * Constructor for PermissionController. + * + * @param permissionService Service for handling permission records. + */ public PermissionController(PermissionService permissionService) { this.permissionService = permissionService; } + /** + * Retrieves all permissions and returns them as a list of DTOs. + * + * @return ResponseEntity containing a list of PermissionDTOs or no content if none found. + */ @Operation(summary = "Get all permissions", description = "Retrieve a list of all permissions") @GetMapping("/getAll") public ResponseEntity> getAll() { @@ -34,6 +48,12 @@ public class PermissionController { return ResponseEntity.ok(dtos); } + /** + * Retrieves a permission by its ID and returns it as a DTO. + * + * @param id The ID of the permission to find. + * @return ResponseEntity containing the PermissionDTO or not found if it doesn't exist. + */ @Operation(summary = "Get permission by ID", description = "Retrieve a permission by its ID") @GetMapping("/getById/{id}") public ResponseEntity getById(@PathVariable Integer id) { @@ -41,6 +61,12 @@ public class PermissionController { return ResponseEntity.ok(toDTO(permission)); } + /** + * Creates a new permission and returns the created permission as a DTO. + * + * @param dto The PermissionDTO containing the details of the permission to be created. + * @return ResponseEntity containing the created PermissionDTO. + */ @Operation(summary = "Create a new permission", description = "Create a new permission") @PostMapping("/create") public ResponseEntity create(@RequestBody PermissionDTO dto) { @@ -49,6 +75,13 @@ public class PermissionController { return ResponseEntity.status(201).body(toDTO(saved)); } + /** + * Updates an existing permission and returns the updated permission as a DTO. + * + * @param id The ID of the permission to update. + * @param dto The PermissionDTO containing the updated details of the permission. + * @return ResponseEntity containing the updated PermissionDTO. + */ @Operation(summary = "Update an existing permission", description = "Update an existing permission") @PutMapping("/update/{id}") public ResponseEntity update(@PathVariable Integer id, @RequestBody PermissionDTO dto) { @@ -57,6 +90,12 @@ public class PermissionController { return ResponseEntity.ok(toDTO(updated)); } + /** + * Deletes a permission by its ID. + * + * @param id The ID of the permission to delete. + * @return ResponseEntity with a success message. + */ @Operation(summary = "Delete a permission", description = "Delete a permission by its ID") @DeleteMapping("/delete/{id}") public ResponseEntity delete(@PathVariable Integer id) { @@ -64,12 +103,24 @@ public class PermissionController { return ResponseEntity.ok("Permission deleted successfully."); } - // -------------------- Mapping -------------------- + /* -------------------- Utils -------------------- */ + /** + * Converts a Permission entity to a PermissionDTO. + * + * @param permission The Permission entity to convert. + * @return The converted PermissionDTO. + */ private PermissionDTO toDTO(Permission permission) { return new PermissionDTO(permission.getId(), permission.getPermissionName()); } + /** + * Converts a PermissionDTO to a Permission entity. + * + * @param dto The PermissionDTO to convert. + * @return The converted Permission entity. + */ private Permission toEntity(PermissionDTO dto) { Permission permission = (dto.getId() != null) ? permissionService.findById(dto.getId()) diff --git a/memberflow-api/src/main/java/com/denniseckerskorn/controllers/user_managment_controllers/RoleController.java b/memberflow-api/src/main/java/com/denniseckerskorn/controllers/user_managment_controllers/RoleController.java index ffe3857..cd3565f 100644 --- a/memberflow-api/src/main/java/com/denniseckerskorn/controllers/user_managment_controllers/RoleController.java +++ b/memberflow-api/src/main/java/com/denniseckerskorn/controllers/user_managment_controllers/RoleController.java @@ -14,6 +14,10 @@ import java.util.List; import java.util.Set; import java.util.stream.Collectors; +/** + * RoleController handles requests related to role management. + * It provides endpoints for creating, retrieving, updating, and deleting roles. + */ @RestController @RequestMapping("/api/v1/roles") @Tag(name = "Role Management", description = "Operations related to roles") @@ -22,11 +26,22 @@ public class RoleController { private final RoleService roleService; private final PermissionService permissionService; + /** + * Constructor for RoleController. + * + * @param roleService Service for handling role records. + * @param permissionService Service for handling permission records. + */ public RoleController(RoleService roleService, PermissionService permissionService) { this.roleService = roleService; this.permissionService = permissionService; } + /** + * Retrieves all roles and returns them as a list of DTOs. + * + * @return ResponseEntity containing a list of RoleDTOs or no content if none found. + */ @Operation(summary = "Get all roles", description = "Retrieve a list of all roles") @GetMapping("/getAll") public ResponseEntity> getAll() { @@ -37,6 +52,12 @@ public class RoleController { return ResponseEntity.ok(dtos); } + /** + * Retrieves a role by its ID and returns it as a DTO. + * + * @param id The ID of the role to find. + * @return ResponseEntity containing the RoleDTO or not found if it doesn't exist. + */ @Operation(summary = "Get role by ID", description = "Retrieve a role by its ID") @GetMapping("/getById/{id}") public ResponseEntity getById(@PathVariable Integer id) { @@ -44,6 +65,12 @@ public class RoleController { return ResponseEntity.ok(toDTO(role)); } + /** + * Creates a new role and returns the created role as a DTO. + * + * @param dto The RoleDTO containing the details of the role to be created. + * @return ResponseEntity containing the created RoleDTO. + */ @Operation(summary = "Create a new role", description = "Create a new role") @PostMapping("/create") public ResponseEntity create(@RequestBody RoleDTO dto) { @@ -61,6 +88,13 @@ public class RoleController { return ResponseEntity.status(201).body(toDTO(saved)); } + /** + * Updates an existing role and returns the updated role as a DTO. + * + * @param id The ID of the role to update. + * @param dto The RoleDTO containing the updated details of the role. + * @return ResponseEntity containing the updated RoleDTO. + */ @Operation(summary = "Update a role", description = "Update an existing role") @PutMapping("/update/{id}") public ResponseEntity update(@PathVariable Integer id, @RequestBody RoleDTO dto) { @@ -79,6 +113,12 @@ public class RoleController { return ResponseEntity.ok(toDTO(updated)); } + /** + * Deletes a role by its ID. + * + * @param id The ID of the role to delete. + * @return ResponseEntity with a message indicating successful deletion. + */ @Operation(summary = "Delete a role", description = "Delete a role by its ID") @DeleteMapping("/delete/{id}") public ResponseEntity delete(@PathVariable Integer id) { @@ -86,6 +126,13 @@ public class RoleController { return ResponseEntity.ok("Role deleted successfully."); } + /** + * Adds a permission to a role. + * + * @param roleId The ID of the role to which the permission will be added. + * @param permissionId The ID of the permission to add to the role. + * @return ResponseEntity with a success message. + */ @Operation(summary = "Add permission to role", description = "Add a permission to a role") @PostMapping("/permissions/add/{roleId}/{permissionId}") public ResponseEntity addPermissionToRole(@PathVariable Integer roleId, @PathVariable Integer permissionId) { @@ -95,6 +142,13 @@ public class RoleController { return ResponseEntity.ok("Permission added to role."); } + /** + * Removes a permission from a role. + * + * @param roleId The ID of the role from which the permission will be removed. + * @param permissionId The ID of the permission to remove from the role. + * @return ResponseEntity with a success message. + */ @Operation(summary = "Remove permission from role", description = "Remove a permission from a role") @DeleteMapping("/permissions/remove/{permissionId}/{roleId}") public ResponseEntity removePermissionFromRole(@PathVariable Integer roleId, @PathVariable Integer permissionId) { @@ -104,8 +158,14 @@ public class RoleController { return ResponseEntity.ok("Permission removed from role."); } - // -------------------- Mapping -------------------- + /* -------------------- Utils -------------------- */ + /** + * Converts a Role entity to a RoleDTO. + * + * @param role The Role entity to convert. + * @return The converted RoleDTO. + */ private RoleDTO toDTO(Role role) { Set permissionIds = role.getPermissions().stream() .map(Permission::getId) diff --git a/memberflow-api/src/main/java/com/denniseckerskorn/controllers/user_managment_controllers/StudentController.java b/memberflow-api/src/main/java/com/denniseckerskorn/controllers/user_managment_controllers/StudentController.java index 4bdc443..3c137fd 100644 --- a/memberflow-api/src/main/java/com/denniseckerskorn/controllers/user_managment_controllers/StudentController.java +++ b/memberflow-api/src/main/java/com/denniseckerskorn/controllers/user_managment_controllers/StudentController.java @@ -31,6 +31,10 @@ import java.time.LocalDateTime; import java.util.List; import java.util.stream.Collectors; +/** + * Controller for managing students. + * Provides endpoints for creating, retrieving, updating, and deleting students. + */ @RestController @RequestMapping("/api/v1/students") @Tag(name = "Student Management", description = "Operations related to student management") @@ -42,9 +46,21 @@ public class StudentController { private final MembershipService membershipService; private final TrainingSessionService trainingSessionService; + /** + * Password encoder for encoding passwords. + */ @Autowired private PasswordEncoder passwordEncoder; + /** + * Constructor for StudentController. + * + * @param studentService Service for handling student records. + * @param roleService Service for handling roles. + * @param userService Service for handling user records. + * @param membershipService Service for handling membership records. + * @param trainingSessionService Service for handling training session records. + */ public StudentController(StudentService studentService, RoleService roleService, UserService userService, MembershipService membershipService, TrainingSessionService trainingSessionService) { this.studentService = studentService; this.roleService = roleService; @@ -53,6 +69,12 @@ public class StudentController { this.trainingSessionService = trainingSessionService; } + /** + * Registers a new student with the provided details. + * + * @param studentRegisterDTO The DTO containing the student's registration details. + * @return ResponseEntity containing the created StudentDTO. + */ @Operation(summary = "Register a new Student", description = "Registers a new student with the provided details.") @PostMapping("/register") public ResponseEntity registerStudent(@RequestBody @Valid StudentRegisterDTO studentRegisterDTO) { @@ -100,7 +122,11 @@ public class StudentController { return ResponseEntity.status(HttpStatus.CREATED).body(response); } - + /** + * Retrieves all students. + * + * @return ResponseEntity containing a list of StudentDTOs. + */ @Operation(summary = "Get all Students", description = "Retrieves a list of all students.") @GetMapping("/getAll") public ResponseEntity> getAllStudents() { @@ -114,6 +140,12 @@ public class StudentController { return ResponseEntity.ok(dtos); } + /** + * Creates a new student with the provided details. + * + * @param dto The StudentDTO containing the details of the student to be created. + * @return ResponseEntity containing the created StudentDTO. + */ @Operation(summary = "Create a new Student", description = "Creates a new student with the provided details.") @PostMapping("/create") public ResponseEntity createStudent(@RequestBody StudentDTO dto) { @@ -122,6 +154,13 @@ public class StudentController { return ResponseEntity.status(HttpStatus.CREATED).body(convertToDTO(saved)); } + /** + * Updates an existing student with the provided details. + * + * @param id The ID of the student to update. + * @param dto The StudentDTO containing the updated details of the student. + * @return ResponseEntity containing the updated StudentDTO. + */ @Operation(summary = "Update an existing Student", description = "Updates the details of an existing student.") @PutMapping("/update/{id}") public ResponseEntity updateStudent(@PathVariable Integer id, @RequestBody StudentDTO dto) { @@ -131,6 +170,12 @@ public class StudentController { return ResponseEntity.ok(convertToDTO(updated)); } + /** + * Retrieves a student by their ID. + * + * @param id The ID of the student to find. + * @return ResponseEntity containing the StudentDTO or not found if the ID does not exist. + */ @Operation(summary = "Find a Student by ID", description = "Retrieves a student by their ID.") @GetMapping("/findById/{id}") public ResponseEntity getStudentById(@PathVariable Integer id) { @@ -138,6 +183,12 @@ public class StudentController { return ResponseEntity.ok(convertToDTO(student)); } + /** + * Deletes a student by their ID. + * + * @param id The ID of the student to delete. + * @return ResponseEntity with a success message. + */ @Operation(summary = "Delete a Student", description = "Deletes a student by their ID.") @DeleteMapping("/delete/{id}") public ResponseEntity deleteStudent(@PathVariable Integer id) { @@ -145,6 +196,13 @@ public class StudentController { return ResponseEntity.ok("Student deleted successfully"); } + /** + * Adds a history record to a student by their ID. + * + * @param id The ID of the student to whom the history will be added. + * @param history The StudentHistory object containing the history details to be added. + * @return ResponseEntity with a success message. + */ @Operation(summary = "Add a Student History", description = "Adds a history record to a student by their ID.") @PostMapping("/addStudentHistory/{id}") public ResponseEntity addStudentHistory(@PathVariable Integer id, @RequestBody StudentHistory history) { @@ -153,6 +211,12 @@ public class StudentController { return ResponseEntity.ok("Student history added successfully"); } + /** + * Removes a history record from a student by their ID. + * + * @param id The ID of the history record to remove. + * @return ResponseEntity with a success message. + */ @Operation(summary = "Remove a Student History", description = "Removes a history record from a student.") @DeleteMapping("/removeStudentHistory/{id}") public ResponseEntity removeStudentHistory(@PathVariable Integer id) { @@ -160,6 +224,13 @@ public class StudentController { return ResponseEntity.ok("Student history removed successfully"); } + /** + * Adds a membership to a student by their ID. + * + * @param id The ID of the student to whom the membership will be added. + * @param membership The Membership object containing the membership details to be added. + * @return ResponseEntity with a success message. + */ @Operation(summary = "Add a Membership to a Student", description = "Adds a membership to a student by their ID.") @PostMapping("/addMembershipToStudent/{id}") public ResponseEntity addMembershipToStudent(@PathVariable Integer id, @RequestBody Membership membership) { @@ -168,6 +239,12 @@ public class StudentController { return ResponseEntity.ok("Membership added to student successfully"); } + /** + * Removes a membership from a student by their ID. + * + * @param id The ID of the student from whom the membership will be removed. + * @return ResponseEntity with a success message. + */ @Operation(summary = "Remove a Membership from a Student", description = "Removes a membership from a student by their ID.") @DeleteMapping("/removeMembershipFromStudent/{id}") public ResponseEntity removeMembershipFromStudent(@PathVariable Integer id) { @@ -175,6 +252,13 @@ public class StudentController { return ResponseEntity.ok("Membership removed from student successfully"); } + /** + * Adds an assistance record to a student by their ID. + * + * @param id The ID of the student to whom the assistance will be added. + * @param assistanceDTO The AssistanceDTO containing the details of the assistance to be added. + * @return ResponseEntity with a success message. + */ @Operation(summary = "Add an Assistance to a Student", description = "Adds an assistance record to a student by their ID.") @PostMapping("/addAssistanceToStudent/{id}") public ResponseEntity addAssistanceToStudent(@PathVariable Integer id, @RequestBody AssistanceDTO assistanceDTO) { @@ -185,6 +269,13 @@ public class StudentController { return ResponseEntity.ok("Assistance added to student successfully"); } + /** + * Removes an assistance record from a student by their ID. + * + * @param studentId The ID of the student from whom the assistance will be removed. + * @param assistanceId The ID of the assistance record to remove. + * @return ResponseEntity with a success message. + */ @Operation(summary = "Remove an Assistance from a Student", description = "Removes an assistance record from a student by their ID.") @DeleteMapping("/deleteAssistanceFromStudent/{id}") public ResponseEntity deleteAssistanceFromStudent(@PathVariable Integer studentId, @PathVariable Integer assistanceId) { @@ -192,6 +283,13 @@ public class StudentController { return ResponseEntity.ok("Assistance removed from student successfully"); } + /** + * Adds a training group to a student by their ID. + * + * @param id The ID of the student to whom the training group will be added. + * @param group The TrainingGroup object containing the details of the group to be added. + * @return ResponseEntity with a success message. + */ @Operation(summary = "Add a Training Group to a Student", description = "Adds a training group to a student by their ID.") @PostMapping("/addGroupToStudent/{id}") public ResponseEntity addGroupToStudent(@PathVariable Integer id, @RequestBody TrainingGroup group) { @@ -199,6 +297,13 @@ public class StudentController { return ResponseEntity.ok("Training group added to student successfully"); } + /** + * Updates a student's membership by their ID. + * + * @param studentId The ID of the student whose membership will be updated. + * @param membershipId The ID of the membership to assign to the student. + * @return ResponseEntity indicating the result of the operation. + */ @Operation(summary = "Update a student's membership") @PutMapping("/updateMembership/{studentId}") public ResponseEntity updateMembership( @@ -216,13 +321,26 @@ public class StudentController { - /* ----------------- Mapping Methods ------------------ */ + /* ----------------- Utils ------------------ */ + /** + * Converts a Student entity to a StudentDTO. + * + * @param student The Student entity to convert. + * @return The converted StudentDTO. + */ private StudentDTO convertToDTO(Student student) { return StudentDTO.fromEntity(student); } + /** + * Converts a StudentDTO to a Student entity. + * + * @param dto The StudentDTO to convert. + * @param isCreate Indicates if the conversion is for creating a new student. + * @return The converted Student entity. + */ private Student convertToEntity(StudentDTO dto, boolean isCreate) { if (dto == null || dto.getUser() == null) { throw new InvalidDataException("User data is required"); @@ -271,5 +389,4 @@ public class StudentController { return student; } - } diff --git a/memberflow-api/src/main/java/com/denniseckerskorn/controllers/user_managment_controllers/StudentHistoryController.java b/memberflow-api/src/main/java/com/denniseckerskorn/controllers/user_managment_controllers/StudentHistoryController.java index c7aade3..03843fb 100644 --- a/memberflow-api/src/main/java/com/denniseckerskorn/controllers/user_managment_controllers/StudentHistoryController.java +++ b/memberflow-api/src/main/java/com/denniseckerskorn/controllers/user_managment_controllers/StudentHistoryController.java @@ -13,6 +13,10 @@ import org.springframework.web.bind.annotation.*; import java.util.List; import java.util.stream.Collectors; +/** + * StudentHistoryController handles requests related to student history management. + * It provides endpoints for creating, retrieving, updating, and deleting student histories. + */ @RestController @RequestMapping("/api/v1/student-history") @Tag(name = "Student History Management", description = "Operations related to student history") @@ -21,11 +25,22 @@ public class StudentHistoryController { private final StudentHistoryService studentHistoryService; private final StudentService studentService; + /** + * Constructor for StudentHistoryController. + * + * @param studentHistoryService Service for handling student history records. + * @param studentService Service for handling student records. + */ public StudentHistoryController(StudentHistoryService studentHistoryService, StudentService studentService) { this.studentHistoryService = studentHistoryService; this.studentService = studentService; } + /** + * Retrieves all student histories and returns them as a list of DTOs. + * + * @return ResponseEntity containing a list of StudentHistoryDTOs or no content if none found. + */ @Operation(summary = "Get all student histories", description = "Retrieve a list of all student histories") @GetMapping("/getAll") public ResponseEntity> getAll() { @@ -36,6 +51,12 @@ public class StudentHistoryController { return ResponseEntity.ok(dtos); } + /** + * Retrieves a student history by its ID and returns it as a DTO. + * + * @param id The ID of the student history to find. + * @return ResponseEntity containing the StudentHistoryDTO or not found if it doesn't exist. + */ @Operation(summary = "find student history by ID", description = "Retrieve a student history by its ID") @GetMapping("/findById/{id}") public ResponseEntity findById(@PathVariable Integer id) { @@ -43,6 +64,12 @@ public class StudentHistoryController { return ResponseEntity.ok(toDTO(history)); } + /** + * Creates a new student history and returns the created history as a DTO. + * + * @param dto The StudentHistoryDTO containing the details of the history to be created. + * @return ResponseEntity containing the created StudentHistoryDTO. + */ @Operation(summary = "Create a new student history", description = "Create a new student history") @PostMapping("/create") public ResponseEntity create(@RequestBody StudentHistoryDTO dto) { @@ -51,6 +78,13 @@ public class StudentHistoryController { return ResponseEntity.status(201).body(toDTO(saved)); } + /** + * Updates an existing student history and returns the updated history as a DTO. + * + * @param id The ID of the student history to update. + * @param dto The StudentHistoryDTO containing the updated details. + * @return ResponseEntity containing the updated StudentHistoryDTO. + */ @Operation(summary = "Update an existing student history", description = "Update an existing student history") @PutMapping("/update/{id}") public ResponseEntity update(@PathVariable Integer id, @RequestBody StudentHistoryDTO dto) { @@ -60,6 +94,12 @@ public class StudentHistoryController { return ResponseEntity.ok(toDTO(updated)); } + /** + * Deletes a student history by its ID. + * + * @param id The ID of the student history to delete. + * @return ResponseEntity with a success message. + */ @Operation(summary = "Delete a student history", description = "Delete a student history by its ID") @DeleteMapping("/delete/{id}") public ResponseEntity delete(@PathVariable Integer id) { @@ -67,8 +107,14 @@ public class StudentHistoryController { return ResponseEntity.ok("Student history deleted successfully."); } - // -------------------- Mapping -------------------- + /* -------------------- Utils -------------------- */ + /** + * Converts a StudentHistory entity to a StudentHistoryDTO. + * + * @param history The StudentHistory entity to convert. + * @return The converted StudentHistoryDTO. + */ private StudentHistoryDTO toDTO(StudentHistory history) { return new StudentHistoryDTO( history.getId(), @@ -79,6 +125,13 @@ public class StudentHistoryController { ); } + /** + * Converts a StudentHistoryDTO to a StudentHistory entity. + * + * @param dto The StudentHistoryDTO to convert. + * @param includeExistingStudent Whether to include the existing student in the history. + * @return The converted StudentHistory entity. + */ private StudentHistory toEntity(StudentHistoryDTO dto, boolean includeExistingStudent) { StudentHistory history = (dto.getId() != null) ? studentHistoryService.findById(dto.getId()) diff --git a/memberflow-api/src/main/java/com/denniseckerskorn/controllers/user_managment_controllers/TeacherController.java b/memberflow-api/src/main/java/com/denniseckerskorn/controllers/user_managment_controllers/TeacherController.java index 2145c0c..377f8f3 100644 --- a/memberflow-api/src/main/java/com/denniseckerskorn/controllers/user_managment_controllers/TeacherController.java +++ b/memberflow-api/src/main/java/com/denniseckerskorn/controllers/user_managment_controllers/TeacherController.java @@ -18,6 +18,10 @@ import java.time.LocalDateTime; import java.util.List; import java.util.stream.Collectors; +/** + * Controller for managing teachers. + * Provides endpoints for creating, retrieving, updating, and deleting teachers. + */ @RestController @RequestMapping("/api/v1/teachers") @Tag(name = "Teacher Management", description = "Operations related to teachers") @@ -26,14 +30,28 @@ public class TeacherController { private final TeacherService teacherService; private final RoleService roleService; + /** + * Password encoder for encoding passwords. + */ @Autowired private PasswordEncoder passwordEncoder; + /** + * Constructor for TeacherController. + * + * @param teacherService Service for handling teacher records. + * @param roleService Service for handling roles. + */ public TeacherController(TeacherService teacherService, RoleService roleService) { this.teacherService = teacherService; this.roleService = roleService; } + /** + * Gets all teachers and returns them as a list of DTOs. + * + * @return ResponseEntity containing a list of TeacherDTOs or no content if none found. + */ @Operation(summary = "Get all teachers", description = "Retrieve a list of all teachers") @GetMapping("/getAll") public ResponseEntity> getAllTeachers() { @@ -49,6 +67,12 @@ public class TeacherController { return ResponseEntity.ok(dtos); } + /** + * Creates a new teacher and returns the created teacher as a DTO. + * + * @param dto The TeacherDTO containing the details of the teacher to be created. + * @return ResponseEntity containing the created TeacherDTO. + */ @Operation(summary = "Create a new teacher", description = "Create a new teacher") @PostMapping("/create") public ResponseEntity createTeacher(@RequestBody TeacherDTO dto) { @@ -57,6 +81,12 @@ public class TeacherController { return ResponseEntity.status(HttpStatus.CREATED).body(convertToDTO(saved)); } + /** + * Finds a teacher by their ID and returns it as a DTO. + * + * @param id The ID of the teacher to find. + * @return ResponseEntity containing the TeacherDTO or not found if it doesn't exist. + */ @Operation(summary = "Find a teacher by ID", description = "Retrieve a teacher by their ID") @GetMapping("/findById/{id}") public ResponseEntity findById(@PathVariable Integer id) { @@ -67,6 +97,13 @@ public class TeacherController { return ResponseEntity.ok(convertToDTO(teacher)); } + /** + * Updates an existing teacher and returns the updated teacher as a DTO. + * + * @param id The ID of the teacher to update. + * @param dto The TeacherDTO containing the updated details of the teacher. + * @return ResponseEntity containing the updated TeacherDTO. + */ @Operation(summary = "Update a teacher", description = "Update an existing teacher") @PutMapping("/update/{id}") public ResponseEntity updateTeacher(@PathVariable Integer id, @RequestBody TeacherDTO dto) { @@ -76,7 +113,12 @@ public class TeacherController { return ResponseEntity.ok(convertToDTO(updated)); } - + /** + * Deletes a teacher by their ID. + * + * @param id The ID of the teacher to delete. + * @return ResponseEntity with a success message. + */ @Operation(summary = "Delete a teacher", description = "Delete a teacher by their ID") @DeleteMapping("/delete/{id}") public ResponseEntity deleteTeacher(@PathVariable Integer id) { @@ -84,12 +126,25 @@ public class TeacherController { return ResponseEntity.ok("Teacher deleted successfully"); } - // ----------------- Mapping ------------------ + /* ----------------- Utils ------------------ */ + /** + * Converts a Teacher entity to a TeacherDTO. + * + * @param teacher The Teacher entity to convert. + * @return The converted TeacherDTO. + */ private TeacherDTO convertToDTO(Teacher teacher) { return TeacherDTO.fromEntity(teacher); } + /** + * Converts a TeacherDTO to a Teacher entity. + * + * @param dto The TeacherDTO to convert. + * @param isCreate Indicates if this is a creation operation (true) or an update (false). + * @return The converted Teacher entity. + */ private Teacher convertToEntity(TeacherDTO dto, boolean isCreate) { if (dto == null || dto.getUser() == null) { throw new InvalidDataException("User data is required"); @@ -133,5 +188,4 @@ public class TeacherController { return teacher; } - } diff --git a/memberflow-api/src/main/java/com/denniseckerskorn/controllers/user_managment_controllers/UserController.java b/memberflow-api/src/main/java/com/denniseckerskorn/controllers/user_managment_controllers/UserController.java index ef5acb3..fbf9c7c 100644 --- a/memberflow-api/src/main/java/com/denniseckerskorn/controllers/user_managment_controllers/UserController.java +++ b/memberflow-api/src/main/java/com/denniseckerskorn/controllers/user_managment_controllers/UserController.java @@ -38,15 +38,30 @@ public class UserController { private final RoleService roleService; private final JwtUtil jwtUtil; + /** + * Password encoder for encoding passwords. + */ @Autowired private PasswordEncoder passwordEncoder; + /** + * Constructor for UserController. + * + * @param userService Service for handling user records. + * @param roleService Service for handling roles. + * @param jwtUtil Utility for JWT operations. + */ public UserController(UserService userService, RoleService roleService, JwtUtil jwtUtil) { this.userService = userService; this.roleService = roleService; this.jwtUtil = jwtUtil; } + /** + * Gets all users and returns them as a list of DTOs. + * + * @return ResponseEntity containing a list of UserDTOs or no content if none found. + */ @Operation(summary = "Get all users", description = "Retrieve a list of all users") @GetMapping("/getAll") public ResponseEntity> getAllUsers() { @@ -62,6 +77,12 @@ public class UserController { return ResponseEntity.ok(userDTOs); } + /** + * Finds a user by their ID and returns it as a DTO. + * + * @param id The ID of the user to find. + * @return ResponseEntity containing the UserDTO or not found if the ID does not exist. + */ @Operation(summary = "Find a User by ID", description = "Retrieve a user by their ID") @GetMapping("/getById/{id}") public ResponseEntity getUserById(@PathVariable Integer id) { @@ -69,7 +90,13 @@ public class UserController { return ResponseEntity.ok(convertToDTO(user)); } - @Operation( summary = "Find a User by email", description = "Retrieve a user by their email") + /** + * Creates a new user and returns the created user as a DTO. + * + * @param userDTO The UserDTO containing the details of the user to be created. + * @return ResponseEntity containing the created UserDTO with status 201 Created. + */ + @Operation(summary = "Create a new User", description = "Create a new user") @PostMapping("/create") public ResponseEntity createUser(@RequestBody UserDTO userDTO) { User user = convertToEntity(userDTO, true); @@ -77,6 +104,13 @@ public class UserController { return ResponseEntity.status(HttpStatus.CREATED).body(convertToDTO(saved)); } + /** + * Updates an existing user by ID and returns the updated user as a DTO. + * + * @param id The ID of the user to update. + * @param userDTO The UserDTO containing the updated details of the user. + * @return ResponseEntity containing the updated UserDTO. + */ @Operation(summary = "Update a user by ID", description = "Update an existing user") @PutMapping("/update/{id}") public ResponseEntity updateUser(@PathVariable Integer id, @RequestBody UserDTO userDTO) { @@ -86,13 +120,25 @@ public class UserController { return ResponseEntity.ok(convertToDTO(updated)); } - @Operation(summary = "Update a user by email", description = "Update an existing user") + /** + * Deletes a user by ID. + * + * @param id The ID of the user to delete. + * @return ResponseEntity with a success message. + */ + @Operation(summary = "Delete User by Id", description = "Delete a user by ID") @DeleteMapping("/delete/{id}") public ResponseEntity deleteUser(@PathVariable Integer id) { userService.deleteById(id); return ResponseEntity.ok("User deleted successfully"); } + /** + * Retrieves the currently authenticated user based on the JWT token from the request. + * + * @param request The HTTP request containing the JWT token. + * @return ResponseEntity containing the UserDTO of the current user. + */ @Operation(summary = "Get current user", description = "Retrieve the currently authenticated user") @GetMapping("/me") public ResponseEntity getCurrentUser(HttpServletRequest request) { @@ -103,8 +149,15 @@ public class UserController { return ResponseEntity.ok(convertToDTO(user)); } - // ------------------ UTILS ------------------ + /* ------------------ UTILS ------------------ */ + /** + * Extracts the JWT token from the Authorization header of the request. + * + * @param request The HTTP request containing the Authorization header. + * @return The extracted JWT token. + * @throws InvalidDataException if the Authorization header is missing or invalid. + */ private String extractTokenFromRequest(HttpServletRequest request) { String authHeader = request.getHeader("Authorization"); if (authHeader == null || !authHeader.startsWith("Bearer ")) { @@ -113,6 +166,12 @@ public class UserController { return authHeader.substring(7); // Remove "Bearer " } + /** + * Converts a User entity to a UserDTO. + * + * @param user The User entity to convert. + * @return The converted UserDTO. + */ private UserDTO convertToDTO(User user) { UserDTO dto = new UserDTO( user.getId(), @@ -156,6 +215,12 @@ public class UserController { return dto; } + /** + * Converts a Notification entity to a NotificationMiniDTO. + * + * @param notification The Notification entity to convert. + * @return The converted NotificationMiniDTO. + */ private NotificationMiniDTO convertNotificationToMiniDTO(Notification notification) { return new NotificationMiniDTO( notification.getId(), @@ -166,6 +231,14 @@ public class UserController { ); } + /** + * Converts a UserDTO to a User entity. + * + * @param dto The UserDTO to convert. + * @param isCreate Indicates if the conversion is for creation (true) or update (false). + * @return The converted User entity. + * @throws InvalidDataException if the provided data is invalid. + */ private User convertToEntity(UserDTO dto, boolean isCreate) { User user; diff --git a/memberflow-api/src/main/java/com/denniseckerskorn/dtos/class_managment_dtos/AssistanceDTO.java b/memberflow-api/src/main/java/com/denniseckerskorn/dtos/class_managment_dtos/AssistanceDTO.java index bde1a28..9a2905f 100644 --- a/memberflow-api/src/main/java/com/denniseckerskorn/dtos/class_managment_dtos/AssistanceDTO.java +++ b/memberflow-api/src/main/java/com/denniseckerskorn/dtos/class_managment_dtos/AssistanceDTO.java @@ -1,6 +1,5 @@ package com.denniseckerskorn.dtos.class_managment_dtos; - import com.denniseckerskorn.entities.class_managment.Assistance; import com.denniseckerskorn.entities.class_managment.TrainingSession; import com.denniseckerskorn.entities.user_managment.users.Student; diff --git a/memberflow-api/src/main/java/com/denniseckerskorn/dtos/finance_management_dtos/CreateInvoiceLineDTO.java b/memberflow-api/src/main/java/com/denniseckerskorn/dtos/finance_management_dtos/CreateInvoiceLineDTO.java index d81f895..d6fac5d 100644 --- a/memberflow-api/src/main/java/com/denniseckerskorn/dtos/finance_management_dtos/CreateInvoiceLineDTO.java +++ b/memberflow-api/src/main/java/com/denniseckerskorn/dtos/finance_management_dtos/CreateInvoiceLineDTO.java @@ -39,7 +39,6 @@ public class CreateInvoiceLineDTO { this.unitPrice = unitPrice; } - // Convierte a entidad con parámetros necesarios public InvoiceLine toEntity(Invoice invoice, ProductService productService) { InvoiceLine entity = new InvoiceLine(); entity.setInvoice(invoice); @@ -47,11 +46,10 @@ public class CreateInvoiceLineDTO { entity.setQuantity(this.quantity); entity.setUnitPrice(this.unitPrice); entity.setSubtotal(this.unitPrice.multiply(BigDecimal.valueOf(this.quantity))); - entity.setDescription(productService.getName()); // opcional + entity.setDescription(productService.getName()); return entity; } - // Convierte desde una entidad (opcional) public static CreateInvoiceLineDTO fromEntity(InvoiceLine entity) { CreateInvoiceLineDTO dto = new CreateInvoiceLineDTO(); dto.setProductServiceId(entity.getProductService() != null ? entity.getProductService().getId() : null); diff --git a/memberflow-api/src/main/java/com/denniseckerskorn/dtos/finance_management_dtos/CreateInvoiceRequestDTO.java b/memberflow-api/src/main/java/com/denniseckerskorn/dtos/finance_management_dtos/CreateInvoiceRequestDTO.java index 5d34acb..e1012b6 100644 --- a/memberflow-api/src/main/java/com/denniseckerskorn/dtos/finance_management_dtos/CreateInvoiceRequestDTO.java +++ b/memberflow-api/src/main/java/com/denniseckerskorn/dtos/finance_management_dtos/CreateInvoiceRequestDTO.java @@ -20,8 +20,6 @@ public class CreateInvoiceRequestDTO { public CreateInvoiceRequestDTO() { } - // Getters y setters - public Integer getUserId() { return userId; } @@ -62,7 +60,6 @@ public class CreateInvoiceRequestDTO { this.lines = lines; } - // Convierte el DTO a entidad base (sin líneas, requiere setUser) public Invoice toEntity(User user) { Invoice invoice = new Invoice(); invoice.setUser(user); @@ -72,7 +69,6 @@ public class CreateInvoiceRequestDTO { return invoice; } - // Crea el DTO desde una entidad (opcional) public static CreateInvoiceRequestDTO fromEntity(Invoice invoice) { CreateInvoiceRequestDTO dto = new CreateInvoiceRequestDTO(); dto.setUserId(invoice.getUser() != null ? invoice.getUser().getId().intValue() : null); diff --git a/memberflow-api/src/main/java/com/denniseckerskorn/dtos/finance_management_dtos/IVATypeDTO.java b/memberflow-api/src/main/java/com/denniseckerskorn/dtos/finance_management_dtos/IVATypeDTO.java index 643ecdb..8556b47 100644 --- a/memberflow-api/src/main/java/com/denniseckerskorn/dtos/finance_management_dtos/IVATypeDTO.java +++ b/memberflow-api/src/main/java/com/denniseckerskorn/dtos/finance_management_dtos/IVATypeDTO.java @@ -14,7 +14,8 @@ public class IVATypeDTO { private String description; - public IVATypeDTO() {} + public IVATypeDTO() { + } public IVATypeDTO(IVAType entity) { this.id = entity.getId(); @@ -34,9 +35,6 @@ public class IVATypeDTO { return iva; } - // Getters y setters... - - public Integer getId() { return id; } diff --git a/memberflow-api/src/main/java/com/denniseckerskorn/dtos/finance_management_dtos/InvoiceDTO.java b/memberflow-api/src/main/java/com/denniseckerskorn/dtos/finance_management_dtos/InvoiceDTO.java index b3410ef..44d00df 100644 --- a/memberflow-api/src/main/java/com/denniseckerskorn/dtos/finance_management_dtos/InvoiceDTO.java +++ b/memberflow-api/src/main/java/com/denniseckerskorn/dtos/finance_management_dtos/InvoiceDTO.java @@ -63,9 +63,6 @@ public class InvoiceDTO { return invoice; } - // Getters y setters (puedes generarlos automáticamente) - - public Integer getId() { return id; } diff --git a/memberflow-api/src/main/java/com/denniseckerskorn/dtos/finance_management_dtos/InvoiceLineDTO.java b/memberflow-api/src/main/java/com/denniseckerskorn/dtos/finance_management_dtos/InvoiceLineDTO.java index 551be37..1bd59c4 100644 --- a/memberflow-api/src/main/java/com/denniseckerskorn/dtos/finance_management_dtos/InvoiceLineDTO.java +++ b/memberflow-api/src/main/java/com/denniseckerskorn/dtos/finance_management_dtos/InvoiceLineDTO.java @@ -25,7 +25,8 @@ public class InvoiceLineDTO { private BigDecimal subtotal; - public InvoiceLineDTO() {} + public InvoiceLineDTO() { + } public InvoiceLineDTO(InvoiceLine entity) { this.id = entity.getId(); @@ -51,9 +52,6 @@ public class InvoiceLineDTO { return entity; } - // Getters y setters... - - public Integer getId() { return id; } diff --git a/memberflow-api/src/main/java/com/denniseckerskorn/dtos/finance_management_dtos/PaymentDTO.java b/memberflow-api/src/main/java/com/denniseckerskorn/dtos/finance_management_dtos/PaymentDTO.java index 0690699..101733b 100644 --- a/memberflow-api/src/main/java/com/denniseckerskorn/dtos/finance_management_dtos/PaymentDTO.java +++ b/memberflow-api/src/main/java/com/denniseckerskorn/dtos/finance_management_dtos/PaymentDTO.java @@ -67,10 +67,6 @@ public class PaymentDTO { return payment; } - - // Getters y setters... - - public Integer getId() { return id; } diff --git a/memberflow-api/src/main/java/com/denniseckerskorn/dtos/finance_management_dtos/ProductServiceDTO.java b/memberflow-api/src/main/java/com/denniseckerskorn/dtos/finance_management_dtos/ProductServiceDTO.java index dbba695..53fa4fb 100644 --- a/memberflow-api/src/main/java/com/denniseckerskorn/dtos/finance_management_dtos/ProductServiceDTO.java +++ b/memberflow-api/src/main/java/com/denniseckerskorn/dtos/finance_management_dtos/ProductServiceDTO.java @@ -70,8 +70,6 @@ public class ProductServiceDTO { return entity; } - // Getters y setters - public Integer getId() { return id; } diff --git a/memberflow-api/src/main/java/com/denniseckerskorn/dtos/user_managment_dtos/AdminDTO.java b/memberflow-api/src/main/java/com/denniseckerskorn/dtos/user_managment_dtos/AdminDTO.java index eaa43cf..3d03692 100644 --- a/memberflow-api/src/main/java/com/denniseckerskorn/dtos/user_managment_dtos/AdminDTO.java +++ b/memberflow-api/src/main/java/com/denniseckerskorn/dtos/user_managment_dtos/AdminDTO.java @@ -30,8 +30,6 @@ public class AdminDTO { this.user = user; } - // ------------ Métodos de conversión ------------ - public static AdminDTO fromEntity(Admin admin) { if (admin == null || admin.getUser() == null) { return null; diff --git a/memberflow-api/src/main/java/com/denniseckerskorn/dtos/user_managment_dtos/NotificationDTO.java b/memberflow-api/src/main/java/com/denniseckerskorn/dtos/user_managment_dtos/NotificationDTO.java index e50e4be..7f1a907 100644 --- a/memberflow-api/src/main/java/com/denniseckerskorn/dtos/user_managment_dtos/NotificationDTO.java +++ b/memberflow-api/src/main/java/com/denniseckerskorn/dtos/user_managment_dtos/NotificationDTO.java @@ -14,7 +14,8 @@ public class NotificationDTO { private StatusValues status; private Set userIds; - public NotificationDTO() {} + public NotificationDTO() { + } public NotificationDTO(Integer id, String title, String message, LocalDateTime shippingDate, String type, StatusValues status, Set userIds) { this.id = id; diff --git a/memberflow-api/src/main/java/com/denniseckerskorn/dtos/user_managment_dtos/NotificationMiniDTO.java b/memberflow-api/src/main/java/com/denniseckerskorn/dtos/user_managment_dtos/NotificationMiniDTO.java index 3386648..4353270 100644 --- a/memberflow-api/src/main/java/com/denniseckerskorn/dtos/user_managment_dtos/NotificationMiniDTO.java +++ b/memberflow-api/src/main/java/com/denniseckerskorn/dtos/user_managment_dtos/NotificationMiniDTO.java @@ -20,7 +20,6 @@ public class NotificationMiniDTO { this.type = type; } - // Getters y setters public Integer getId() { return id; } diff --git a/memberflow-api/src/main/java/com/denniseckerskorn/dtos/user_managment_dtos/StudentDTO.java b/memberflow-api/src/main/java/com/denniseckerskorn/dtos/user_managment_dtos/StudentDTO.java index 87a488e..04783f0 100644 --- a/memberflow-api/src/main/java/com/denniseckerskorn/dtos/user_managment_dtos/StudentDTO.java +++ b/memberflow-api/src/main/java/com/denniseckerskorn/dtos/user_managment_dtos/StudentDTO.java @@ -109,8 +109,6 @@ public class StudentDTO { return student; } - // Getters y Setters... - public Integer getId() { return id; } diff --git a/memberflow-api/src/main/java/com/denniseckerskorn/dtos/user_managment_dtos/StudentHistoryMiniDTO.java b/memberflow-api/src/main/java/com/denniseckerskorn/dtos/user_managment_dtos/StudentHistoryMiniDTO.java index 25aeedf..ccd6034 100644 --- a/memberflow-api/src/main/java/com/denniseckerskorn/dtos/user_managment_dtos/StudentHistoryMiniDTO.java +++ b/memberflow-api/src/main/java/com/denniseckerskorn/dtos/user_managment_dtos/StudentHistoryMiniDTO.java @@ -18,7 +18,6 @@ public class StudentHistoryMiniDTO { this.description = description; } - // Getters y setters public Integer getId() { return id; } diff --git a/memberflow-api/src/main/java/com/denniseckerskorn/dtos/user_managment_dtos/StudentMiniDTO.java b/memberflow-api/src/main/java/com/denniseckerskorn/dtos/user_managment_dtos/StudentMiniDTO.java index f55d990..b22d4b6 100644 --- a/memberflow-api/src/main/java/com/denniseckerskorn/dtos/user_managment_dtos/StudentMiniDTO.java +++ b/memberflow-api/src/main/java/com/denniseckerskorn/dtos/user_managment_dtos/StudentMiniDTO.java @@ -4,9 +4,10 @@ import java.util.Set; public class StudentMiniDTO { private Integer id; - private Set histories; // 🔥 mini DTO + private Set histories; - public StudentMiniDTO() {} + public StudentMiniDTO() { + } public Integer getId() { return id; diff --git a/memberflow-api/src/main/java/com/denniseckerskorn/dtos/user_managment_dtos/StudentRegisterDTO.java b/memberflow-api/src/main/java/com/denniseckerskorn/dtos/user_managment_dtos/StudentRegisterDTO.java index adbbf55..828a67a 100644 --- a/memberflow-api/src/main/java/com/denniseckerskorn/dtos/user_managment_dtos/StudentRegisterDTO.java +++ b/memberflow-api/src/main/java/com/denniseckerskorn/dtos/user_managment_dtos/StudentRegisterDTO.java @@ -1,21 +1,19 @@ package com.denniseckerskorn.dtos.user_managment_dtos; import java.time.LocalDate; + import com.fasterxml.jackson.annotation.JsonFormat; public class StudentRegisterDTO { - - // Datos de usuario private String name; private String surname; private String email; private String password; private String phoneNumber; private String address; - private String roleName; // ejemplo: "ROLE_STUDENT" - private String status; // ejemplo: "ACTIVE" + private String roleName; + private String status; - // Datos de estudiante private String dni; @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd") @@ -25,91 +23,117 @@ public class StudentRegisterDTO { private String progress; private String medicalReport; private String parentName; - private Integer membershipId; + private Integer membershipId; - // --- Getters y Setters --- public String getName() { return name; } + public void setName(String name) { this.name = name; } + public String getSurname() { return surname; } + public void setSurname(String surname) { this.surname = surname; } + public String getEmail() { return email; } + public void setEmail(String email) { this.email = email; } + public String getPassword() { return password; } + public void setPassword(String password) { this.password = password; } + public String getPhoneNumber() { return phoneNumber; } + public void setPhoneNumber(String phoneNumber) { this.phoneNumber = phoneNumber; } + public String getAddress() { return address; } + public void setAddress(String address) { this.address = address; } + public String getRoleName() { return roleName; } + public void setRoleName(String roleName) { this.roleName = roleName; } + public String getStatus() { return status; } + public void setStatus(String status) { this.status = status; } + public String getDni() { return dni; } + public void setDni(String dni) { this.dni = dni; } + public LocalDate getBirthdate() { return birthdate; } + public void setBirthdate(LocalDate birthdate) { this.birthdate = birthdate; } + public String getBelt() { return belt; } + public void setBelt(String belt) { this.belt = belt; } + public String getProgress() { return progress; } + public void setProgress(String progress) { this.progress = progress; } + public String getMedicalReport() { return medicalReport; } + public void setMedicalReport(String medicalReport) { this.medicalReport = medicalReport; } + public String getParentName() { return parentName; } + public void setParentName(String parentName) { this.parentName = parentName; } @@ -117,9 +141,9 @@ public class StudentRegisterDTO { public Integer getMembershipId() { return membershipId; } + public void setMembershipId(Integer membershipId) { this.membershipId = membershipId; } - } diff --git a/memberflow-api/src/main/java/com/denniseckerskorn/dtos/user_managment_dtos/TeacherDTO.java b/memberflow-api/src/main/java/com/denniseckerskorn/dtos/user_managment_dtos/TeacherDTO.java index a8c34c9..0023b7d 100644 --- a/memberflow-api/src/main/java/com/denniseckerskorn/dtos/user_managment_dtos/TeacherDTO.java +++ b/memberflow-api/src/main/java/com/denniseckerskorn/dtos/user_managment_dtos/TeacherDTO.java @@ -16,10 +16,7 @@ public class TeacherDTO { this.user = user; this.discipline = discipline; } - - // Getters y Setters - - + public Integer getId() { return id; } diff --git a/memberflow-api/src/main/java/com/denniseckerskorn/dtos/user_managment_dtos/UserDTO.java b/memberflow-api/src/main/java/com/denniseckerskorn/dtos/user_managment_dtos/UserDTO.java index 0e7473d..1e96c84 100644 --- a/memberflow-api/src/main/java/com/denniseckerskorn/dtos/user_managment_dtos/UserDTO.java +++ b/memberflow-api/src/main/java/com/denniseckerskorn/dtos/user_managment_dtos/UserDTO.java @@ -20,8 +20,6 @@ public class UserDTO { private LocalDateTime registerDate; private String roleName; private StatusValues status; - - // 🔥 Nuevos campos para el perfil completo private Set notifications; private StudentMiniDTO student; @@ -54,8 +52,6 @@ public class UserDTO { this.status = user.getStatus(); } - - // Getters y Setters public Integer getId() { return id; } @@ -152,7 +148,6 @@ public class UserDTO { this.student = student; } - // Conversión (opcional) public static UserDTO fromEntity(User user) { if (user == null) return null; diff --git a/memberflow-api/src/main/java/com/denniseckerskorn/exceptions/GlobalExceptionHandler.java b/memberflow-api/src/main/java/com/denniseckerskorn/exceptions/GlobalExceptionHandler.java index fbf96e7..a24820a 100644 --- a/memberflow-api/src/main/java/com/denniseckerskorn/exceptions/GlobalExceptionHandler.java +++ b/memberflow-api/src/main/java/com/denniseckerskorn/exceptions/GlobalExceptionHandler.java @@ -24,6 +24,10 @@ import org.springframework.web.servlet.resource.NoResourceFoundException; import java.util.HashMap; import java.util.Map; +/** + * GlobalExceptionHandler handles exceptions thrown by the application. + * It provides a centralized way to manage error responses for various exceptions. + */ @ControllerAdvice public class GlobalExceptionHandler { diff --git a/memberflow-api/src/main/java/com/denniseckerskorn/services/finance_service/InvoicePdfGenerator.java b/memberflow-api/src/main/java/com/denniseckerskorn/services/finance_service/InvoicePdfGenerator.java index cb4fcd8..382cd6f 100644 --- a/memberflow-api/src/main/java/com/denniseckerskorn/services/finance_service/InvoicePdfGenerator.java +++ b/memberflow-api/src/main/java/com/denniseckerskorn/services/finance_service/InvoicePdfGenerator.java @@ -13,6 +13,10 @@ import org.springframework.stereotype.Service; import java.io.ByteArrayOutputStream; import java.math.BigDecimal; +/** + * InvoicePdfGenerator is a service that generates a PDF representation of an Invoice. + * It uses iText library to create the PDF document with invoice details. + */ @Service public class InvoicePdfGenerator { @@ -23,20 +27,20 @@ public class InvoicePdfGenerator { PdfDocument pdf = new PdfDocument(writer); Document doc = new Document(pdf); - // Cabecera + // Document title and metadata doc.add(new Paragraph("FACTURA #" + invoice.getId()).setFontSize(16).setBold()); doc.add(new Paragraph("Fecha: " + invoice.getDate())); doc.add(new Paragraph("Estado: " + invoice.getStatus())); doc.add(new Paragraph(" ")); - // Información del cliente + // Cliente information var user = invoice.getUser(); doc.add(new Paragraph("Cliente: " + user.getName() + " " + user.getSurname())); doc.add(new Paragraph("Email: " + user.getEmail())); doc.add(new Paragraph("Teléfono: " + user.getPhoneNumber())); doc.add(new Paragraph("Dirección: " + user.getAddress())); - // Si es estudiante, mostrar info básica (sin tutor ni cinturón) + // Student information Student student = user.getStudent(); if (student != null) { doc.add(new Paragraph("DNI: " + student.getDni())); @@ -45,7 +49,7 @@ public class InvoicePdfGenerator { doc.add(new Paragraph(" ")); - // Detalle de productos + // Products and services details doc.add(new Paragraph("Detalle de productos:").setBold()); doc.add(new Paragraph("Producto | Cant. | Precio | IVA % | Subtotal (sin IVA) | IVA")); @@ -74,7 +78,7 @@ public class InvoicePdfGenerator { )); } - // Totales + // Totals doc.add(new Paragraph(" ")); doc.add(new Paragraph("Subtotal (sin IVA): " + totalSubtotal + " €").setBold()); doc.add(new Paragraph("IVA total: " + totalIVA + " €").setBold()); diff --git a/memberflow-api/src/main/resources/Checklist.txt b/memberflow-api/src/main/resources/Checklist.txt deleted file mode 100644 index e0e1dbf..0000000 --- a/memberflow-api/src/main/resources/Checklist.txt +++ /dev/null @@ -1,7 +0,0 @@ -1. Comprobar seguridad y permisos en cada endpoint. -2. Comprobar o arreglar el tema de los ID automáticos y los DTOs. -3. Documentar los endpoints. -4. Crear javadoc de cada metodo. -5. Crear un README.md con la información del proyecto. -7. Comprobar como funciona logger en cada endpoint. -8. Mejorar excepciones y mensajes de error. \ No newline at end of file diff --git a/memberflow-data/src/main/java/com/denniseckerskorn/config/HibernateConfig.java b/memberflow-data/src/main/java/com/denniseckerskorn/config/HibernateConfig.java index 5c228cf..6a6d0a7 100644 --- a/memberflow-data/src/main/java/com/denniseckerskorn/config/HibernateConfig.java +++ b/memberflow-data/src/main/java/com/denniseckerskorn/config/HibernateConfig.java @@ -13,16 +13,31 @@ import org.springframework.transaction.annotation.EnableTransactionManagement; import javax.sql.DataSource; import java.util.Properties; +/** + * Hibernate configuration class for setting up the EntityManagerFactory and DataSource. + * It uses HikariCP for connection pooling and configures JPA properties. + */ @Configuration @EnableTransactionManagement public class HibernateConfig { private final Environment env; + /** + * Constructor to inject the Environment object for accessing properties. + * + * @param env the Environment object containing application properties + */ public HibernateConfig(Environment env) { this.env = env; } + /** + * Bean definition for DataSource using HikariCP. + * Reads properties from the application environment. + * + * @return a configured DataSource instance + */ @Bean public DataSource dataSource() { HikariDataSource dataSource = new HikariDataSource(); @@ -33,6 +48,12 @@ public class HibernateConfig { return dataSource; } + /** + * Bean definition for LocalContainerEntityManagerFactoryBean. + * + * @param dataSource the DataSource to be used by the EntityManagerFactory + * @return a configured LocalContainerEntityManagerFactoryBean instance + */ @Bean public LocalContainerEntityManagerFactoryBean entityManagerFactory(DataSource dataSource) { LocalContainerEntityManagerFactoryBean emf = new LocalContainerEntityManagerFactoryBean(); @@ -50,6 +71,13 @@ public class HibernateConfig { return emf; } + /** + * Bean definition for PlatformTransactionManager. + * Uses JpaTransactionManager to manage transactions. + * + * @param emf the LocalContainerEntityManagerFactoryBean to be used by the transaction manager + * @return a configured PlatformTransactionManager instance + */ @Bean public PlatformTransactionManager transactionManager(LocalContainerEntityManagerFactoryBean emf) { JpaTransactionManager transactionManager = new JpaTransactionManager(); diff --git a/memberflow-data/src/main/java/com/denniseckerskorn/repositories/class_managment_repositories/AssistanceRepository.java b/memberflow-data/src/main/java/com/denniseckerskorn/repositories/class_managment_repositories/AssistanceRepository.java index b261b09..7c79679 100644 --- a/memberflow-data/src/main/java/com/denniseckerskorn/repositories/class_managment_repositories/AssistanceRepository.java +++ b/memberflow-data/src/main/java/com/denniseckerskorn/repositories/class_managment_repositories/AssistanceRepository.java @@ -8,6 +8,11 @@ import org.springframework.data.repository.query.Param; import java.time.LocalDateTime; import java.util.List; +/** + * Repository interface for managing Assistance entities. + * Provides methods to find assistance records by training session ID, student ID, + * and date range, as well as a method to find assistance by both training session ID and student ID. + */ public interface AssistanceRepository extends JpaRepository { Assistance findByTrainingSessionId(Integer trainingSessionId); diff --git a/memberflow-data/src/main/java/com/denniseckerskorn/repositories/class_managment_repositories/MembershipRepository.java b/memberflow-data/src/main/java/com/denniseckerskorn/repositories/class_managment_repositories/MembershipRepository.java index d285639..ed261c1 100644 --- a/memberflow-data/src/main/java/com/denniseckerskorn/repositories/class_managment_repositories/MembershipRepository.java +++ b/memberflow-data/src/main/java/com/denniseckerskorn/repositories/class_managment_repositories/MembershipRepository.java @@ -8,6 +8,10 @@ import org.springframework.data.repository.query.Param; import java.time.LocalDate; +/** + * Repository interface for managing Membership entities. + * Provides methods to find memberships by various attributes. + */ public interface MembershipRepository extends JpaRepository { Membership findByType(MembershipTypeValues type); diff --git a/memberflow-data/src/main/java/com/denniseckerskorn/repositories/class_managment_repositories/TrainingGroupRepository.java b/memberflow-data/src/main/java/com/denniseckerskorn/repositories/class_managment_repositories/TrainingGroupRepository.java index 1b82567..592aaed 100644 --- a/memberflow-data/src/main/java/com/denniseckerskorn/repositories/class_managment_repositories/TrainingGroupRepository.java +++ b/memberflow-data/src/main/java/com/denniseckerskorn/repositories/class_managment_repositories/TrainingGroupRepository.java @@ -3,5 +3,9 @@ package com.denniseckerskorn.repositories.class_managment_repositories; import com.denniseckerskorn.entities.class_managment.TrainingGroup; import org.springframework.data.jpa.repository.JpaRepository; +/** + * Repository interface for managing TrainingGroup entities. + * Provides methods to perform CRUD operations on TrainingGroup entities. + */ public interface TrainingGroupRepository extends JpaRepository { } diff --git a/memberflow-data/src/main/java/com/denniseckerskorn/repositories/class_managment_repositories/TrainingSessionRepository.java b/memberflow-data/src/main/java/com/denniseckerskorn/repositories/class_managment_repositories/TrainingSessionRepository.java index 211b83e..c2c5c89 100644 --- a/memberflow-data/src/main/java/com/denniseckerskorn/repositories/class_managment_repositories/TrainingSessionRepository.java +++ b/memberflow-data/src/main/java/com/denniseckerskorn/repositories/class_managment_repositories/TrainingSessionRepository.java @@ -7,6 +7,10 @@ import java.time.LocalDateTime; import java.util.List; +/** + * Repository interface for managing TrainingSession entities. + * Provides methods to find training sessions by date and date range. + */ public interface TrainingSessionRepository extends JpaRepository { TrainingSession findByDate(LocalDateTime date); diff --git a/memberflow-data/src/main/java/com/denniseckerskorn/repositories/finance_repositories/IVATypeRepository.java b/memberflow-data/src/main/java/com/denniseckerskorn/repositories/finance_repositories/IVATypeRepository.java index 59c5245..84726cb 100644 --- a/memberflow-data/src/main/java/com/denniseckerskorn/repositories/finance_repositories/IVATypeRepository.java +++ b/memberflow-data/src/main/java/com/denniseckerskorn/repositories/finance_repositories/IVATypeRepository.java @@ -5,6 +5,10 @@ import org.springframework.data.jpa.repository.JpaRepository; import java.math.BigDecimal; +/** + * Repository interface for managing IVAType entities. + * Provides methods to perform CRUD operations on IVAType entities. + */ public interface IVATypeRepository extends JpaRepository { boolean existsByPercentage(BigDecimal percentage); diff --git a/memberflow-data/src/main/java/com/denniseckerskorn/repositories/finance_repositories/InvoiceLineRepository.java b/memberflow-data/src/main/java/com/denniseckerskorn/repositories/finance_repositories/InvoiceLineRepository.java index ad579c0..9dac0ca 100644 --- a/memberflow-data/src/main/java/com/denniseckerskorn/repositories/finance_repositories/InvoiceLineRepository.java +++ b/memberflow-data/src/main/java/com/denniseckerskorn/repositories/finance_repositories/InvoiceLineRepository.java @@ -3,5 +3,9 @@ package com.denniseckerskorn.repositories.finance_repositories; import com.denniseckerskorn.entities.finance.InvoiceLine; import org.springframework.data.jpa.repository.JpaRepository; +/** + * Repository interface for managing InvoiceLine entities. + * Provides methods to perform CRUD operations on InvoiceLine entities. + */ public interface InvoiceLineRepository extends JpaRepository { } diff --git a/memberflow-data/src/main/java/com/denniseckerskorn/repositories/finance_repositories/InvoiceRepository.java b/memberflow-data/src/main/java/com/denniseckerskorn/repositories/finance_repositories/InvoiceRepository.java index e2cc959..607edd4 100644 --- a/memberflow-data/src/main/java/com/denniseckerskorn/repositories/finance_repositories/InvoiceRepository.java +++ b/memberflow-data/src/main/java/com/denniseckerskorn/repositories/finance_repositories/InvoiceRepository.java @@ -3,5 +3,9 @@ package com.denniseckerskorn.repositories.finance_repositories; import com.denniseckerskorn.entities.finance.Invoice; import org.springframework.data.jpa.repository.JpaRepository; +/** + * Repository interface for managing Invoice entities. + * Provides methods to perform CRUD operations on Invoice entities. + */ public interface InvoiceRepository extends JpaRepository { } diff --git a/memberflow-data/src/main/java/com/denniseckerskorn/repositories/finance_repositories/PaymentRepository.java b/memberflow-data/src/main/java/com/denniseckerskorn/repositories/finance_repositories/PaymentRepository.java index f49de6d..81869a3 100644 --- a/memberflow-data/src/main/java/com/denniseckerskorn/repositories/finance_repositories/PaymentRepository.java +++ b/memberflow-data/src/main/java/com/denniseckerskorn/repositories/finance_repositories/PaymentRepository.java @@ -5,6 +5,10 @@ import com.denniseckerskorn.entities.finance.Payment; import org.springframework.data.jpa.repository.JpaRepository; import java.util.List; +/** + * Repository interface for managing Payment entities. + * Provides methods to check if a payment exists by invoice ID and to find payments by user ID. + */ public interface PaymentRepository extends JpaRepository { boolean existsByInvoiceId(Integer invoiceId); diff --git a/memberflow-data/src/main/java/com/denniseckerskorn/repositories/finance_repositories/ProductServiceRepository.java b/memberflow-data/src/main/java/com/denniseckerskorn/repositories/finance_repositories/ProductServiceRepository.java index 984052a..bd32fe7 100644 --- a/memberflow-data/src/main/java/com/denniseckerskorn/repositories/finance_repositories/ProductServiceRepository.java +++ b/memberflow-data/src/main/java/com/denniseckerskorn/repositories/finance_repositories/ProductServiceRepository.java @@ -3,6 +3,10 @@ package com.denniseckerskorn.repositories.finance_repositories; import com.denniseckerskorn.entities.finance.ProductService; import org.springframework.data.jpa.repository.JpaRepository; +/** + * Repository interface for managing ProductService entities. + * Provides methods to perform CRUD operations on ProductService entities. + */ public interface ProductServiceRepository extends JpaRepository { boolean existsByName(String name); diff --git a/memberflow-data/src/main/java/com/denniseckerskorn/repositories/user_managment_repositories/AdminRepository.java b/memberflow-data/src/main/java/com/denniseckerskorn/repositories/user_managment_repositories/AdminRepository.java index 1336fd4..7832c21 100644 --- a/memberflow-data/src/main/java/com/denniseckerskorn/repositories/user_managment_repositories/AdminRepository.java +++ b/memberflow-data/src/main/java/com/denniseckerskorn/repositories/user_managment_repositories/AdminRepository.java @@ -3,6 +3,10 @@ package com.denniseckerskorn.repositories.user_managment_repositories; import com.denniseckerskorn.entities.user_managment.users.Admin; import org.springframework.data.jpa.repository.JpaRepository; +/** + * Repository interface for managing Admin entities. + * Provides methods to perform CRUD operations on Admin entities. + */ public interface AdminRepository extends JpaRepository { boolean existsByUserEmail(String email); diff --git a/memberflow-data/src/main/java/com/denniseckerskorn/repositories/user_managment_repositories/NotificationRepository.java b/memberflow-data/src/main/java/com/denniseckerskorn/repositories/user_managment_repositories/NotificationRepository.java index 039bd94..1a0437a 100644 --- a/memberflow-data/src/main/java/com/denniseckerskorn/repositories/user_managment_repositories/NotificationRepository.java +++ b/memberflow-data/src/main/java/com/denniseckerskorn/repositories/user_managment_repositories/NotificationRepository.java @@ -6,6 +6,11 @@ import org.springframework.data.jpa.repository.JpaRepository; import java.time.LocalDateTime; import java.util.List; +/** + * Repository interface for managing Notification entities. + * Provides methods to check if a notification exists by title and shipping date, + * and to find notifications by their ID. + */ public interface NotificationRepository extends JpaRepository { boolean existsByTitleAndShippingDate(String title, LocalDateTime shippingDate); List findNotificationsById(Integer id); diff --git a/memberflow-data/src/main/java/com/denniseckerskorn/repositories/user_managment_repositories/PermissionRepository.java b/memberflow-data/src/main/java/com/denniseckerskorn/repositories/user_managment_repositories/PermissionRepository.java index 7e47c07..fdc0c36 100644 --- a/memberflow-data/src/main/java/com/denniseckerskorn/repositories/user_managment_repositories/PermissionRepository.java +++ b/memberflow-data/src/main/java/com/denniseckerskorn/repositories/user_managment_repositories/PermissionRepository.java @@ -4,6 +4,10 @@ import com.denniseckerskorn.entities.user_managment.Permission; import com.denniseckerskorn.enums.PermissionValues; import org.springframework.data.jpa.repository.JpaRepository; +/** + * Repository interface for managing Permission entities. + * Provides methods to perform CRUD operations on Permission entities. + */ public interface PermissionRepository extends JpaRepository { Permission findByPermissionName(PermissionValues permissionName); boolean existsByPermissionName(PermissionValues permissionName); diff --git a/memberflow-data/src/main/java/com/denniseckerskorn/repositories/user_managment_repositories/RoleRepository.java b/memberflow-data/src/main/java/com/denniseckerskorn/repositories/user_managment_repositories/RoleRepository.java index 4b5c97c..467d292 100644 --- a/memberflow-data/src/main/java/com/denniseckerskorn/repositories/user_managment_repositories/RoleRepository.java +++ b/memberflow-data/src/main/java/com/denniseckerskorn/repositories/user_managment_repositories/RoleRepository.java @@ -3,6 +3,10 @@ package com.denniseckerskorn.repositories.user_managment_repositories; import com.denniseckerskorn.entities.user_managment.Role; import org.springframework.data.jpa.repository.JpaRepository; +/** + * Repository interface for managing Role entities. + * Provides methods to perform CRUD operations on Role entities. + */ public interface RoleRepository extends JpaRepository { Role findByName(String name); } diff --git a/memberflow-data/src/main/java/com/denniseckerskorn/repositories/user_managment_repositories/StudentHistoryRepository.java b/memberflow-data/src/main/java/com/denniseckerskorn/repositories/user_managment_repositories/StudentHistoryRepository.java index 78df28d..cce8da1 100644 --- a/memberflow-data/src/main/java/com/denniseckerskorn/repositories/user_managment_repositories/StudentHistoryRepository.java +++ b/memberflow-data/src/main/java/com/denniseckerskorn/repositories/user_managment_repositories/StudentHistoryRepository.java @@ -3,6 +3,10 @@ package com.denniseckerskorn.repositories.user_managment_repositories; import com.denniseckerskorn.entities.user_managment.StudentHistory; import org.springframework.data.jpa.repository.JpaRepository; +/** + * Repository interface for managing StudentHistory entities. + * Provides methods to perform CRUD operations on StudentHistory entities. + */ public interface StudentHistoryRepository extends JpaRepository { boolean existsByEventType(String eventType); diff --git a/memberflow-data/src/main/java/com/denniseckerskorn/repositories/user_managment_repositories/StudentRepository.java b/memberflow-data/src/main/java/com/denniseckerskorn/repositories/user_managment_repositories/StudentRepository.java index 31f9ba0..6ad1d30 100644 --- a/memberflow-data/src/main/java/com/denniseckerskorn/repositories/user_managment_repositories/StudentRepository.java +++ b/memberflow-data/src/main/java/com/denniseckerskorn/repositories/user_managment_repositories/StudentRepository.java @@ -3,6 +3,10 @@ package com.denniseckerskorn.repositories.user_managment_repositories; import com.denniseckerskorn.entities.user_managment.users.Student; import org.springframework.data.jpa.repository.JpaRepository; +/** + * Repository interface for managing Student entities. + * Provides methods to perform CRUD operations on Student entities. + */ public interface StudentRepository extends JpaRepository { boolean existsByDni(String dni); Student findByDni(String dni); diff --git a/memberflow-data/src/main/java/com/denniseckerskorn/repositories/user_managment_repositories/TeacherRepository.java b/memberflow-data/src/main/java/com/denniseckerskorn/repositories/user_managment_repositories/TeacherRepository.java index 46f7f8a..4b79850 100644 --- a/memberflow-data/src/main/java/com/denniseckerskorn/repositories/user_managment_repositories/TeacherRepository.java +++ b/memberflow-data/src/main/java/com/denniseckerskorn/repositories/user_managment_repositories/TeacherRepository.java @@ -3,6 +3,10 @@ package com.denniseckerskorn.repositories.user_managment_repositories; import com.denniseckerskorn.entities.user_managment.users.Teacher; import org.springframework.data.jpa.repository.JpaRepository; +/** + * Repository interface for managing Teacher entities. + * Provides methods to perform CRUD operations on Teacher entities. + */ public interface TeacherRepository extends JpaRepository { boolean existsByUserEmail(String mail); diff --git a/memberflow-data/src/main/java/com/denniseckerskorn/repositories/user_managment_repositories/UserRepository.java b/memberflow-data/src/main/java/com/denniseckerskorn/repositories/user_managment_repositories/UserRepository.java index 720045a..655f837 100644 --- a/memberflow-data/src/main/java/com/denniseckerskorn/repositories/user_managment_repositories/UserRepository.java +++ b/memberflow-data/src/main/java/com/denniseckerskorn/repositories/user_managment_repositories/UserRepository.java @@ -6,6 +6,11 @@ import org.springframework.data.jpa.repository.JpaRepository; import java.util.List; +/** + * Repository interface for managing User entities. + * Provides methods to check if a user exists by email, find a user by email, + * and retrieve all users with a specific role. + */ public interface UserRepository extends JpaRepository { boolean existsByEmail(String email); diff --git a/memberflow-data/src/main/java/com/denniseckerskorn/seeder/TestDataSeeder.java b/memberflow-data/src/main/java/com/denniseckerskorn/seeder/TestDataSeeder.java index 8ae44a5..8eb77e5 100644 --- a/memberflow-data/src/main/java/com/denniseckerskorn/seeder/TestDataSeeder.java +++ b/memberflow-data/src/main/java/com/denniseckerskorn/seeder/TestDataSeeder.java @@ -33,6 +33,12 @@ import java.math.BigDecimal; import java.time.LocalDate; import java.time.LocalDateTime; +/** + * TestDataSeeder is a component that seeds the database with initial test data + * when the application starts in the "dev" profile. + * It creates roles, permissions, users, memberships, training groups, sessions, + * and other entities to facilitate development and testing. + */ @Component @Profile("dev") public class TestDataSeeder implements CommandLineRunner { @@ -58,7 +64,27 @@ public class TestDataSeeder implements CommandLineRunner { private final ProductServiceService productServiceService; private final PaymentService paymentService; - + /** + * Constructor for TestDataSeeder. + * + * @param adminService Service for managing admin entities. + * @param notificationService Service for managing notifications. + * @param permissionService Service for managing permissions. + * @param roleService Service for managing roles. + * @param studentHistoryService Service for managing student history. + * @param studentService Service for managing student entities. + * @param teacherService Service for managing teacher entities. + * @param userService Service for managing user entities. + * @param membershipService Service for managing memberships. + * @param assistanceService Service for managing assistance records. + * @param trainingGroupService Service for managing training groups. + * @param trainingSessionService Service for managing training sessions. + * @param invoiceService Service for managing invoices. + * @param invoiceLineService Service for managing invoice lines. + * @param ivaTypeService Service for managing IVA types. + * @param productServiceService Service for managing product/services. + * @param paymentService Service for managing payments. + */ @Autowired public TestDataSeeder(AdminService adminService, NotificationService notificationService, @@ -96,6 +122,14 @@ public class TestDataSeeder implements CommandLineRunner { this.paymentService = paymentService; } + /** + * This method is executed when the application starts. + * It seeds the database with initial data for roles, permissions, users, + * memberships, training groups, sessions, and other entities. + * + * @param args command line arguments + * @throws Exception if an error occurs during seeding + */ @Override public void run(String... args) throws Exception { // Roles @@ -111,32 +145,30 @@ public class TestDataSeeder implements CommandLineRunner { adminRole.setName("ROLE_ADMIN"); this.roleService.save(adminRole); - // Permisos + // Permissions for (PermissionValues value : PermissionValues.values()) { Permission p = new Permission(); p.setPermissionName(value); this.permissionService.save(p); } - // Obtener permisos de la base de datos + // Obtain permissions Permission fullAccess = this.permissionService.findPermissionByName(PermissionValues.FULL_ACCESS); Permission manageUsers = this.permissionService.findPermissionByName(PermissionValues.MANAGE_STUDENTS); Permission viewOwnData = this.permissionService.findPermissionByName(PermissionValues.VIEW_OWN_DATA); - // Asignar permisos a roles + // Assign permissions to roles studentRole.addPermission(viewOwnData); teacherRole.addPermission(manageUsers); teacherRole.addPermission(viewOwnData); adminRole.addPermission(fullAccess); - - // Guardar roles actualizados + // Update roles with permissions this.roleService.update(studentRole); this.roleService.update(teacherRole); this.roleService.update(adminRole); - - // Membresías + // Memberships Membership basicMembership = new Membership(); basicMembership.setType(MembershipTypeValues.BASIC); basicMembership.setStartDate(LocalDate.now()); @@ -165,7 +197,7 @@ public class TestDataSeeder implements CommandLineRunner { noLimitMembership.setStatus(StatusValues.ACTIVE); this.membershipService.save(noLimitMembership); - // Usuarios + // Users and their roles User studentUser = new User(); studentUser.setName("Student"); studentUser.setSurname("One"); @@ -178,7 +210,6 @@ public class TestDataSeeder implements CommandLineRunner { studentUser.setRole(studentRole); this.userService.save(studentUser); - Student student = new Student(); student.setUser(studentUser); student.setBirthdate(LocalDate.of(2005, 5, 20)); @@ -210,7 +241,6 @@ public class TestDataSeeder implements CommandLineRunner { teacherUser.setRole(teacherRole); this.userService.save(teacherUser); - Teacher teacher = new Teacher(); teacher.setUser(teacherUser); teacher.setDiscipline("Jiu-Jitsu"); @@ -228,7 +258,6 @@ public class TestDataSeeder implements CommandLineRunner { adminUser.setRole(adminRole); this.userService.save(adminUser); - Admin admin = new Admin(); admin.setUser(adminUser); this.adminService.save(admin); @@ -246,32 +275,31 @@ public class TestDataSeeder implements CommandLineRunner { notification.addUser(adminUser); this.notificationService.update(notification); - // Grupo de entrenamiento + // Create a training group TrainingGroup trainingGroup = new TrainingGroup(); trainingGroup.setName("Grupo JiuJitsu Avanzado"); trainingGroup.setSchedule(LocalDateTime.now().plusDays(1)); trainingGroup.setTeacher(teacher); this.trainingGroupService.save(trainingGroup); - // Asignar grupo al estudiante + // Assign the training group to the student this.studentService.addGroupToStudent(student.getId(), trainingGroup); - // Sesión de entrenamiento + // Create a training session TrainingSession trainingSession = new TrainingSession(); trainingSession.setTrainingGroup(trainingGroup); trainingSession.setDate(LocalDateTime.now().plusDays(2)); trainingSession.setStatus(StatusValues.ACTIVE); this.trainingSessionService.save(trainingSession); - - // Crear asistencia con sesión válida + // Add the training session to the group Assistance validAssistance = new Assistance(); validAssistance.setDate(LocalDateTime.now()); validAssistance.setStudent(student); validAssistance.setTrainingSession(trainingSession); this.studentService.addAssistanceToStudent(student, validAssistance); - // Factura para el estudiante + // Create an invalid assistance Invoice invoice = new Invoice(); invoice.setUser(studentUser); invoice.setDate(LocalDateTime.now().minusDays(1)); @@ -280,13 +308,13 @@ public class TestDataSeeder implements CommandLineRunner { this.invoiceService.save(invoice); this.userService.addInvoiceToUser(studentUser, invoice); - // IVA TYPE + // Create an IVA type IVAType ivaGeneral = new IVAType(); ivaGeneral.setPercentage(new BigDecimal("21.00")); ivaGeneral.setDescription("IVA General"); this.ivaTypeService.save(ivaGeneral); - // PRODUCTO / SERVICIO + // Create a product/service ProductService jiuJitsuClass = new ProductService(); jiuJitsuClass.setName("Clase de JiuJitsu"); jiuJitsuClass.setType("Servicio"); @@ -295,7 +323,7 @@ public class TestDataSeeder implements CommandLineRunner { jiuJitsuClass.setStatus(StatusValues.ACTIVE); this.productServiceService.save(jiuJitsuClass); - // LÍNEA DE FACTURA + // Add the product/service to the invoice InvoiceLine line = new InvoiceLine(); line.setInvoice(invoice); line.setProductService(jiuJitsuClass); @@ -304,18 +332,16 @@ public class TestDataSeeder implements CommandLineRunner { line.setSubtotal(jiuJitsuClass.getPrice().multiply(BigDecimal.valueOf(line.getQuantity()))); this.invoiceService.addLineToInvoice(invoice, line); - - // PAGO (PAYMENT) + // Calculate the total with IVA Payment payment = new Payment(); payment.setInvoice(invoice); - payment.setAmount(invoice.getTotal()); // Debe incluir el IVA si se calcula externamente + payment.setAmount(invoice.getTotal()); payment.setPaymentMethod(PaymentMethodValues.CREDIT_CARD); payment.setPaymentDate(LocalDateTime.now()); payment.setStatus(StatusValues.PAID); this.paymentService.save(payment); - - // Mostrar todo + // Show all data in the console System.out.println("--- ROLES ---"); this.roleService.findAll().forEach(System.out::println); diff --git a/memberflow-data/src/main/java/com/denniseckerskorn/services/class_managment_services/AssistanceService.java b/memberflow-data/src/main/java/com/denniseckerskorn/services/class_managment_services/AssistanceService.java index e52efe6..4919ad9 100644 --- a/memberflow-data/src/main/java/com/denniseckerskorn/services/class_managment_services/AssistanceService.java +++ b/memberflow-data/src/main/java/com/denniseckerskorn/services/class_managment_services/AssistanceService.java @@ -23,15 +23,23 @@ public class AssistanceService extends AbstractService { private final AssistanceRepository assistanceRepository; /** - * Constructor for AssitanceService. + * Constructor for AssistanceService. * - * @param assistanceRepository the assistance repository + * @param assistanceRepository the repository for assistance records */ public AssistanceService(AssistanceRepository assistanceRepository) { super(assistanceRepository); this.assistanceRepository = assistanceRepository; } + /** + * Creates a new Assistance entity with the current date and time. + * + * @param entity the assistance to create + * @return the created assistance entity + * @throws IllegalArgumentException if the assistance is null + * @throws DuplicateEntityException if the assistance already exists + */ @Override public Assistance save(Assistance entity) throws IllegalArgumentException, DuplicateEntityException { logger.info("Saving assistance: {}", entity); @@ -42,6 +50,15 @@ public class AssistanceService extends AbstractService { return super.save(entity); } + /** + * Updates an existing Assistance entity. + * + * @param entity the entity to update + * @return the updated assistance entity + * @throws IllegalArgumentException if the assistance is null + * @throws InvalidDataException if the assistance data is invalid + * @throws EntityNotFoundException if the assistance does not exist + */ @Override public Assistance update(Assistance entity) throws IllegalArgumentException, InvalidDataException, EntityNotFoundException { logger.info("Updating assistance: {}", entity); @@ -49,11 +66,26 @@ public class AssistanceService extends AbstractService { return super.update(entity); } + /** + * Gets the ID of the Assistance entity. + * + * @param entity the assistance entity + * @return the ID of the assistance entity + * @throws IllegalStateException if the entity does not have an ID + */ @Override protected Integer getEntityId(Assistance entity) throws IllegalStateException { return super.getEntityId(entity); } + /** + * Finds an Assistance entity by its ID. + * + * @param id the ID of the assistance + * @return the found assistance entity + * @throws InvalidDataException if the ID is null + * @throws EntityNotFoundException if the assistance does not exist + */ @Override public Assistance findById(Integer id) throws InvalidDataException, EntityNotFoundException { logger.info("Finding assistance by ID: {}", id); @@ -64,6 +96,13 @@ public class AssistanceService extends AbstractService { return super.findById(id); } + /** + * Deletes an Assistance entity by its ID. + * + * @param id the ID of the assistance to delete + * @throws InvalidDataException if the ID is null + * @throws EntityNotFoundException if the assistance does not exist + */ @Override public void deleteById(Integer id) throws InvalidDataException, EntityNotFoundException { logger.info("Deleting assistance by ID: {}", id); @@ -75,12 +114,23 @@ public class AssistanceService extends AbstractService { super.deleteById(id); } + /** + * Finds all Assistance records. + * + * @return a list of all assistance records + */ @Override public List findAll() { logger.info("Finding all assistance records"); return super.findAll(); } + /** + * Checks if an Assistance entity exists. + * + * @param entity the assistance entity to check + * @return true if the assistance exists, false otherwise + */ @Override protected boolean exists(Assistance entity) { logger.info("Checking if assistance exists: {}", entity); diff --git a/memberflow-data/src/main/java/com/denniseckerskorn/services/class_managment_services/TrainingGroupService.java b/memberflow-data/src/main/java/com/denniseckerskorn/services/class_managment_services/TrainingGroupService.java index 864c6f8..a46a091 100644 --- a/memberflow-data/src/main/java/com/denniseckerskorn/services/class_managment_services/TrainingGroupService.java +++ b/memberflow-data/src/main/java/com/denniseckerskorn/services/class_managment_services/TrainingGroupService.java @@ -15,17 +15,33 @@ import org.springframework.stereotype.Service; import java.util.List; +/** + * Service class for managing training groups. + */ @Service public class TrainingGroupService extends AbstractService { private static final Logger logger = LoggerFactory.getLogger(TrainingGroupService.class); private final TrainingGroupRepository trainingGroupRepository; + /** + * Constructor for TrainingGroupService. + * + * @param trainingGroupRepository the repository for training groups + */ public TrainingGroupService(TrainingGroupRepository trainingGroupRepository) { super(trainingGroupRepository); this.trainingGroupRepository = trainingGroupRepository; } + /** + * Saves a new TrainingGroup entity. + * + * @param entity the training group to save + * @return the saved training group + * @throws IllegalArgumentException if the training group is null + * @throws DuplicateEntityException if the training group already exists + */ @Override public TrainingGroup save(TrainingGroup entity) throws IllegalArgumentException, DuplicateEntityException { logger.info("Saving training group: {}", entity); @@ -36,6 +52,15 @@ public class TrainingGroupService extends AbstractService findAll() { logger.info("Finding all training groups"); return super.findAll(); } + /** + * Checks if a TrainingGroup exists in the database. + * + * @param entity the training group to check + * @return true if the training group exists, false otherwise + */ @Override protected boolean exists(TrainingGroup entity) { logger.info("Checking if training group exists: {}", entity); return super.exists(entity); } + /** + * Validates the TrainingGroup entity. + * + * @param group the training group to validate + * @throws InvalidDataException if the training group data is invalid + */ private void validateTrainingGroup(TrainingGroup group) throws InvalidDataException { if (group.getTeacher() == null) { throw new InvalidDataException("Teacher cannot be null"); @@ -89,6 +152,14 @@ public class TrainingGroupService extends AbstractService findAll() { logger.info("Finding all training sessions"); return super.findAll(); } + /** + * Checks if a training session exists in the database. + * + * @param entity the training session to check + * @return true if the training session exists, false otherwise + */ @Override protected boolean exists(TrainingSession entity) { logger.info("Checking if training session exists: {}", entity); @@ -98,6 +153,14 @@ public class TrainingSessionService extends AbstractService getStudentsFromSession(TrainingSession session) throws EntityNotFoundException, InvalidDataException { if (session == null || session.getId() == null) { throw new InvalidDataException("Session cannot be null"); @@ -107,6 +170,13 @@ public class TrainingSessionService extends AbstractService { @@ -21,12 +25,25 @@ public class IVATypeService extends AbstractService { private final IVATypeRepository ivaTypeRepository; private final ProductServiceRepository productServiceRepository; + /** + * Constructor for IVATypeService. + * + * @param ivaTypeRepository the repository for IVA types + * @param productServiceRepository the repository for product services + */ public IVATypeService(IVATypeRepository ivaTypeRepository, ProductServiceRepository productServiceRepository) { super(ivaTypeRepository); this.ivaTypeRepository = ivaTypeRepository; this.productServiceRepository = productServiceRepository; } + /** + * Saves a new IVAType entity. + * + * @param entity the IVAType to save + * @return the saved IVAType + * @throws DuplicateEntityException if an entity with the same percentage already exists + */ @Override public IVAType save(IVAType entity) throws DuplicateEntityException { logger.info("Saving IVAType: {}", entity); @@ -37,6 +54,14 @@ public class IVATypeService extends AbstractService { return super.save(entity); } + /** + * Updates an existing IVAType entity. + * + * @param entity the IVAType to update + * @return the updated IVAType + * @throws InvalidDataException if the entity data is invalid + * @throws EntityNotFoundException if the entity does not exist + */ @Override public IVAType update(IVAType entity) throws InvalidDataException, EntityNotFoundException { logger.info("Updating IVAType: {}", entity); @@ -44,22 +69,46 @@ public class IVATypeService extends AbstractService { return super.update(entity); } + /** + * Verifies if an IVAType entity exists in the database. + * + * @param entity the entity to check + * @return true if the entity exists, false otherwise + */ @Override protected boolean exists(IVAType entity) { return entity != null && entity.getId() != null && ivaTypeRepository.existsById(entity.getId()); } + /** + * Gets the ID of the IVAType entity. + * + * @param entity the IVAType entity + * @return the ID of the IVAType + */ @Override protected Integer getEntityId(IVAType entity) { return entity.getId(); } + /** + * Finds all IVAType entities. + * + * @return a list of all IVAType entities + */ @Override public List findAll() { logger.info("Retrieving all IVA types"); return super.findAll(); } + /** + * Deletes an IVAType entity by its ID. + * + * @param id the ID of the entity to delete + * @throws InvalidDataException if the ID is null or invalid + * @throws EntityNotFoundException if the entity does not exist + */ @Override public void deleteById(Integer id) throws InvalidDataException, EntityNotFoundException { if (productServiceRepository.existsByIvaTypeId(id)) { @@ -68,6 +117,12 @@ public class IVATypeService extends AbstractService { super.deleteById(id); } + /** + * Validates the IVAType entity before saving or updating. + * + * @param ivaType the IVAType to validate + * @throws InvalidDataException if the IVAType data is invalid + */ private void validate(IVAType ivaType) { if (ivaType.getPercentage() == null || ivaType.getPercentage().compareTo(BigDecimal.ZERO) < 0) { throw new InvalidDataException("IVA percentage must be >= 0"); diff --git a/memberflow-data/src/main/java/com/denniseckerskorn/services/finance_services/InvoiceLineService.java b/memberflow-data/src/main/java/com/denniseckerskorn/services/finance_services/InvoiceLineService.java index 9a61858..ed4f044 100644 --- a/memberflow-data/src/main/java/com/denniseckerskorn/services/finance_services/InvoiceLineService.java +++ b/memberflow-data/src/main/java/com/denniseckerskorn/services/finance_services/InvoiceLineService.java @@ -23,11 +23,24 @@ public class InvoiceLineService extends AbstractService { private static final Logger logger = LoggerFactory.getLogger(InvoiceLineService.class); private final InvoiceLineRepository invoiceLineRepository; + /** + * Constructor for InvoiceLineService. + * + * @param invoiceLineRepository the repository for InvoiceLine entities + */ public InvoiceLineService(InvoiceLineRepository invoiceLineRepository) { super(invoiceLineRepository); this.invoiceLineRepository = invoiceLineRepository; } + /** + * Saves a new InvoiceLine entity. + * + * @param entity the InvoiceLine to save + * @return the saved InvoiceLine + * @throws IllegalArgumentException if the entity is null + * @throws DuplicateEntityException if an entity with the same ID already exists + */ @Override public InvoiceLine save(InvoiceLine entity) throws IllegalArgumentException, DuplicateEntityException { logger.info("Saving invoice line: {}", entity); @@ -35,6 +48,15 @@ public class InvoiceLineService extends AbstractService { return super.save(entity); } + /** + * Updates an existing InvoiceLine entity. + * + * @param entity the InvoiceLine to update + * @return the updated InvoiceLine + * @throws IllegalArgumentException if the entity is null + * @throws InvalidDataException if the entity data is invalid + * @throws EntityNotFoundException if the entity does not exist + */ @Override public InvoiceLine update(InvoiceLine entity) throws IllegalArgumentException, InvalidDataException, EntityNotFoundException { logger.info("Updating invoice line: {}", entity); @@ -42,22 +64,44 @@ public class InvoiceLineService extends AbstractService { return super.update(entity); } + /** + * Finds all InvoiceLine entities. + * + * @return a list of all InvoiceLine entities + */ @Override public List findAll() { logger.info("Retrieving all invoice lines"); return super.findAll(); } + /** + * Verifies if an InvoiceLine entity exists in the repository. + * + * @param entity the entity to check + * @return true if the entity exists, false otherwise + */ @Override protected boolean exists(InvoiceLine entity) { return entity != null && entity.getId() != null && invoiceLineRepository.existsById(entity.getId()); } + /** + * Retrieves the ID of an InvoiceLine entity. + * + * @param entity the entity from which to retrieve the ID + * @return the ID of the InvoiceLine entity + */ @Override protected Integer getEntityId(InvoiceLine entity) { return entity.getId(); } + /** + * Validates the InvoiceLine entity before saving or updating. + * + * @param line the InvoiceLine to validate + */ private void validateInvoiceLine(InvoiceLine line) { if (line.getInvoice() == null) { throw new InvalidDataException("InvoiceLine must be linked to an invoice"); @@ -72,7 +116,6 @@ public class InvoiceLineService extends AbstractService { throw new InvalidDataException("Unit price must be greater than 0"); } - // Validación automática de subtotal BigDecimal expected = line.getUnitPrice().multiply(new BigDecimal(line.getQuantity())); line.setSubtotal(expected); } diff --git a/memberflow-data/src/main/java/com/denniseckerskorn/services/finance_services/InvoiceService.java b/memberflow-data/src/main/java/com/denniseckerskorn/services/finance_services/InvoiceService.java index 53b6776..5efc95c 100644 --- a/memberflow-data/src/main/java/com/denniseckerskorn/services/finance_services/InvoiceService.java +++ b/memberflow-data/src/main/java/com/denniseckerskorn/services/finance_services/InvoiceService.java @@ -17,17 +17,34 @@ import java.time.LocalDateTime; import java.util.List; import java.util.Objects; +/** + * Service class for managing invoices. + * This class provides methods to perform CRUD operations on Invoice entities. + */ @Service public class InvoiceService extends AbstractService { private static final Logger logger = LoggerFactory.getLogger(InvoiceService.class); private final InvoiceRepository invoiceRepository; + /** + * Constructor for InvoiceService. + * + * @param invoiceRepository the repository for Invoice entities + */ public InvoiceService(InvoiceRepository invoiceRepository) { super(invoiceRepository); this.invoiceRepository = invoiceRepository; } + /** + * Saves a new invoice in the database. + * + * @param entity the invoice to save + * @return the saved invoice + * @throws IllegalArgumentException if the invoice is null + * @throws DuplicateEntityException if an invoice with the same ID already exists + */ @Override public Invoice save(Invoice entity) throws IllegalArgumentException, DuplicateEntityException { logger.info("Saving invoice: {}", entity); @@ -38,6 +55,15 @@ public class InvoiceService extends AbstractService { return super.save(entity); } + /** + * Updates an existing invoice in the database. + * + * @param entity the invoice to update + * @return the updated invoice + * @throws IllegalArgumentException if the invoice is null + * @throws InvalidDataException if the invoice data is invalid + * @throws EntityNotFoundException if the invoice does not exist + */ @Override public Invoice update(Invoice entity) throws IllegalArgumentException, InvalidDataException, EntityNotFoundException { logger.info("Updating invoice: {}", entity); @@ -45,12 +71,27 @@ public class InvoiceService extends AbstractService { return super.update(entity); } + /** + * Finds an invoice by its ID. + * + * @param id the ID of the entity to find + * @return the found invoice + * @throws InvalidDataException if the ID is null or invalid + * @throws EntityNotFoundException if the invoice does not exist + */ @Override public Invoice findById(Integer id) throws InvalidDataException, EntityNotFoundException { logger.info("Finding invoice by ID: {}", id); return super.findById(id); } + /** + * Deletes an invoice by its ID. + * + * @param id the ID of the invoice to delete + * @throws InvalidDataException if the ID is null or invalid + * @throws EntityNotFoundException if the invoice does not exist + */ @Override public void deleteById(Integer id) throws InvalidDataException, EntityNotFoundException { logger.info("Deleting invoice by ID: {}", id); @@ -61,24 +102,45 @@ public class InvoiceService extends AbstractService { super.deleteById(id); } + /** + * Retrieves all invoices. + * + * @return a list of all invoices + */ @Override public List findAll() { logger.info("Retrieving all invoices"); return super.findAll(); } + /** + * Checks if an invoice exists in the database. + * + * @param entity the invoice to check + * @return true if the invoice exists, false otherwise + */ @Override protected boolean exists(Invoice entity) { return entity != null && entity.getId() != null && invoiceRepository.existsById(entity.getId()); } + /** + * Gets the ID of the invoice entity. + * + * @param entity the invoice entity + * @return the ID of the invoice + */ @Override protected Integer getEntityId(Invoice entity) { return entity.getId(); } /** - * Obtiene todas las facturas de un usuario específico. + * Finds all invoices associated with a specific user ID. + * + * @param userId the ID of the user + * @return a list of invoices associated with the user + * @throws InvalidDataException if the user ID is null */ public List findAllInvoicesByUserId(Integer userId) throws InvalidDataException { if (userId == null) { @@ -91,7 +153,10 @@ public class InvoiceService extends AbstractService { /** - * Validates the invoice before saving/updating. + * Validates the invoice entity. + * + * @param invoice the invoice to validate + * @throws InvalidDataException if the invoice data is invalid */ private void validateInvoice(Invoice invoice) throws InvalidDataException { if (invoice.getUser() == null) { @@ -108,6 +173,13 @@ public class InvoiceService extends AbstractService { } } + /** + * Adds a line to an invoice. + * + * @param invoice the invoice to which the line will be added + * @param line the line to add + * @throws InvalidDataException if the invoice or line is null + */ @Transactional public void addLineToInvoice(Invoice invoice, InvoiceLine line) { if (invoice == null || line == null) { @@ -119,6 +191,13 @@ public class InvoiceService extends AbstractService { invoiceRepository.save(invoice); } + /** + * Removes a line from an invoice. + * + * @param invoice the invoice from which the line will be removed + * @param line the line to remove + * @throws InvalidDataException if the invoice or line is null + */ @Transactional public void removeLineFromInvoice(Invoice invoice, InvoiceLine line) { if (invoice == null || line == null) { @@ -130,6 +209,11 @@ public class InvoiceService extends AbstractService { invoiceRepository.save(invoice); } + /** + * Updates the total amount of an invoice based on its lines. + * + * @param invoice the invoice to update + */ public void updateInvoiceTotal(Invoice invoice) { BigDecimal total = BigDecimal.ZERO; @@ -152,13 +236,25 @@ public class InvoiceService extends AbstractService { invoice.setTotal(total); } - + /** + * Adds a line to an invoice by its ID. + * + * @param invoiceId the ID of the invoice to which the line will be added + * @param line the line to add + */ @Transactional public void addLineToInvoiceById(Integer invoiceId, InvoiceLine line) { Invoice invoice = findById(invoiceId); addLineToInvoice(invoice, line); } + /** + * Removes a line from an invoice by its ID. + * + * @param invoiceId the ID of the invoice from which the line will be removed + * @param lineId the ID of the line to remove + * @throws EntityNotFoundException if the line does not exist in the invoice + */ @Transactional public void removeLineFromInvoiceById(Integer invoiceId, Integer lineId) { Invoice invoice = findById(invoiceId); @@ -169,12 +265,21 @@ public class InvoiceService extends AbstractService { removeLineFromInvoice(invoice, line); } + /** + * Recalculates the total of an invoice and saves it. + * + * @param invoice the invoice to recalculate + */ public void recalculateTotal(Invoice invoice) { updateInvoiceTotal(invoice); invoiceRepository.save(invoice); } - - + + /** + * Clears all lines from an invoice and updates the total. + * + * @param invoice the invoice to clear lines from + */ @Transactional public void clearInvoiceLines(Invoice invoice) { invoice.getInvoiceLines().clear(); diff --git a/memberflow-data/src/main/java/com/denniseckerskorn/services/finance_services/PaymentService.java b/memberflow-data/src/main/java/com/denniseckerskorn/services/finance_services/PaymentService.java index 83b99ca..d70e8be 100644 --- a/memberflow-data/src/main/java/com/denniseckerskorn/services/finance_services/PaymentService.java +++ b/memberflow-data/src/main/java/com/denniseckerskorn/services/finance_services/PaymentService.java @@ -17,6 +17,10 @@ import java.math.BigDecimal; import java.time.LocalDateTime; import java.util.List; +/** + * Service class for managing Payment entities. + * This class provides methods to perform CRUD operations on Payment entities. + */ @Service public class PaymentService extends AbstractService { @@ -24,12 +28,27 @@ public class PaymentService extends AbstractService { private final PaymentRepository paymentRepository; private final InvoiceService invoiceService; + /** + * Constructor for PaymentService. + * + * @param paymentRepository the repository for Payment entities + * @param invoiceService the service for Invoice entities + */ public PaymentService(PaymentRepository paymentRepository, InvoiceService invoiceService) { super(paymentRepository); this.paymentRepository = paymentRepository; this.invoiceService = invoiceService; } + /** + * Saves a new Payment entity. + * + * @param payment the payment to save + * @return the saved payment + * @throws DuplicateEntityException if a payment already exists for the invoice + * @throws EntityNotFoundException if the associated invoice does not exist + * @throws InvalidDataException if the payment data is invalid + */ @Override @Transactional public Payment save(Payment payment) throws DuplicateEntityException { @@ -50,14 +69,20 @@ public class PaymentService extends AbstractService { Payment savedPayment = super.save(payment); - //invoice.setPayment(savedPayment); invoice.setStatus(StatusValues.PAID); invoiceService.update(invoice); return savedPayment; } - + /** + * Updates an existing Payment entity. + * + * @param payment the entity to update + * @return the updated payment + * @throws EntityNotFoundException if the payment does not exist + * @throws InvalidDataException if the payment data is invalid + */ @Override @Transactional public Payment update(Payment payment) throws EntityNotFoundException, InvalidDataException { @@ -82,22 +107,44 @@ public class PaymentService extends AbstractService { return super.update(payment); } + /** + * Verifies if a Payment entity exists in the database. + * + * @param entity the entity to check + * @return true if the entity exists, false otherwise + */ @Override protected boolean exists(Payment entity) { return entity != null && entity.getId() != null && paymentRepository.existsById(entity.getId()); } + /** + * Obtains the ID of a Payment entity. + * + * @param entity the entity from which to retrieve the ID + * @return the ID of the Payment entity + */ @Override protected Integer getEntityId(Payment entity) { return entity.getId(); } + /** + * Obtains all Payment entities. + * + * @return a list of all Payment entities + */ @Override public List findAll() { logger.info("Retrieving all payments"); return super.findAll(); } + /** + * Validates the Payment entity before saving or updating. + * + * @param payment the Payment to validate + */ private void validate(Payment payment) { if (payment.getInvoice() == null) { throw new InvalidDataException("Payment must be linked to an invoice"); @@ -116,6 +163,11 @@ public class PaymentService extends AbstractService { } } + /** + * Removes a Payment entity by its ID. + * + * @param paymentId the ID of the payment to remove + */ @Transactional public void removePayment(Integer paymentId) { Payment payment = findById(paymentId); @@ -131,10 +183,22 @@ public class PaymentService extends AbstractService { invoiceService.update(invoice); } + /** + * Finds all Payment entities associated with a specific user ID. + * + * @param userId the ID of the user + * @return a list of payments associated with the user + */ public List findAllByUserId(Integer userId) { return paymentRepository.findByInvoice_User_Id(userId); } + /** + * Retrieves an Invoice by its ID. + * + * @param id the ID of the invoice + * @return the Invoice entity + */ public Invoice getInvoiceById(Integer id) { return invoiceService.findById(id); } diff --git a/memberflow-data/src/main/java/com/denniseckerskorn/services/finance_services/ProductServiceService.java b/memberflow-data/src/main/java/com/denniseckerskorn/services/finance_services/ProductServiceService.java index 7bb320b..0fe0789 100644 --- a/memberflow-data/src/main/java/com/denniseckerskorn/services/finance_services/ProductServiceService.java +++ b/memberflow-data/src/main/java/com/denniseckerskorn/services/finance_services/ProductServiceService.java @@ -15,6 +15,10 @@ import org.springframework.stereotype.Service; import java.math.BigDecimal; import java.util.List; +/** + * Service class for managing ProductService entities. + * This class provides methods to perform CRUD operations on ProductService entities. + */ @Service public class ProductServiceService extends AbstractService { @@ -22,12 +26,26 @@ public class ProductServiceService extends AbstractService findAll() { logger.info("Retrieving all products/services"); return super.findAll(); } + /** + * Exists method to check if a ProductService entity exists in the repository. + * + * @param entity the entity to check + * @return true if the entity exists, false otherwise + */ @Override protected boolean exists(ProductService entity) { return entity != null && entity.getId() != null && productServiceRepository.existsById(entity.getId()); } + /** + * Gets the ID of a ProductService entity. + * + * @param entity the entity from which to retrieve the ID + * @return the ID of the ProductService entity + */ @Override protected Integer getEntityId(ProductService entity) { return entity.getId(); } + /** + * Validates the ProductService entity before saving or updating. + * + * @param product the ProductService to validate + */ private void validateProduct(ProductService product) { if (product.getName() == null || product.getName().isBlank()) { throw new InvalidDataException("Product name cannot be null or blank"); diff --git a/memberflow-data/src/main/java/com/denniseckerskorn/services/user_managment_services/NotificationService.java b/memberflow-data/src/main/java/com/denniseckerskorn/services/user_managment_services/NotificationService.java index 9536fa6..8ec5a92 100644 --- a/memberflow-data/src/main/java/com/denniseckerskorn/services/user_managment_services/NotificationService.java +++ b/memberflow-data/src/main/java/com/denniseckerskorn/services/user_managment_services/NotificationService.java @@ -67,6 +67,14 @@ public class NotificationService extends AbstractService return super.findById(id); } + /** + * Updates an existing notification. + * + * @param entity the notification to update + * @return the updated notification + * @throws EntityNotFoundException if the notification is not found + * @throws InvalidDataException if the entity data is invalid + */ @Transactional @Override public Notification update(Notification entity) throws EntityNotFoundException { diff --git a/memberflow-data/src/main/java/com/denniseckerskorn/services/user_managment_services/StudentService.java b/memberflow-data/src/main/java/com/denniseckerskorn/services/user_managment_services/StudentService.java index f8c7901..3e38ba3 100644 --- a/memberflow-data/src/main/java/com/denniseckerskorn/services/user_managment_services/StudentService.java +++ b/memberflow-data/src/main/java/com/denniseckerskorn/services/user_managment_services/StudentService.java @@ -34,7 +34,9 @@ public class StudentService extends AbstractService { /** * Constructor for StudentService. * - * @param studentRepository the student repository + * @param studentRepository the student repository + * @param userRepository the user repository + * @param assistanceRepository the assistance repository */ public StudentService(StudentRepository studentRepository, UserRepository userRepository, AssistanceRepository assistanceRepository) { super(studentRepository); diff --git a/memberflow-data/src/main/java/com/denniseckerskorn/services/user_managment_services/TeacherService.java b/memberflow-data/src/main/java/com/denniseckerskorn/services/user_managment_services/TeacherService.java index fbf47fa..c9e2e7a 100644 --- a/memberflow-data/src/main/java/com/denniseckerskorn/services/user_managment_services/TeacherService.java +++ b/memberflow-data/src/main/java/com/denniseckerskorn/services/user_managment_services/TeacherService.java @@ -33,6 +33,7 @@ public class TeacherService extends AbstractService { * Constructor for TeacherService. * * @param teacherRepository the teacher repository + * @param userRepository the user repository */ public TeacherService(TeacherRepository teacherRepository, UserRepository userRepository) { super(teacherRepository); diff --git a/memberflow-data/src/main/java/com/denniseckerskorn/services/user_managment_services/UserService.java b/memberflow-data/src/main/java/com/denniseckerskorn/services/user_managment_services/UserService.java index 2387fc8..0ca2179 100644 --- a/memberflow-data/src/main/java/com/denniseckerskorn/services/user_managment_services/UserService.java +++ b/memberflow-data/src/main/java/com/denniseckerskorn/services/user_managment_services/UserService.java @@ -156,6 +156,13 @@ public class UserService extends AbstractService { return userRepository.existsByEmail(email); } + /** + * Adds an invoice to a user. + * + * @param user the user to whom the invoice will be added + * @param invoice the invoice to add + * @throws InvalidDataException if the user or invoice is null + */ @Transactional public void addInvoiceToUser(User user, Invoice invoice) throws InvalidDataException { if (user == null || invoice == null) { @@ -167,6 +174,13 @@ public class UserService extends AbstractService { userRepository.save(user); } + /** + * Removes an invoice from a user. + * + * @param user the user from whom the invoice will be removed + * @param invoice the invoice to remove + * @throws InvalidDataException if the user or invoice is null + */ @Transactional public void removeInvoiceFromUser(User user, Invoice invoice) throws InvalidDataException { if (user == null || invoice == null) {