feat: update course entity & refactor package

This commit is contained in:
2026-08-21 22:17:02 +07:00
parent 31f53a1d52
commit 941bf322e5
14 changed files with 3 additions and 326 deletions
@@ -1,40 +0,0 @@
package aplp.backend.lms.api.common.exception;
import aplp.backend.core.common.exception.ResourceNotFoundException;
import aplp.backend.core.common.response.ErrorResponse;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import java.time.LocalDateTime;
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(ResourceNotFoundException.class)
public ResponseEntity<ErrorResponse> handleNotFound(
ResourceNotFoundException ex
) {
return ResponseEntity
.status(HttpStatus.NOT_FOUND)
.body(new ErrorResponse(
HttpStatus.NOT_FOUND.value(),
ex.getMessage(),
LocalDateTime.now()
));
}
@ExceptionHandler(Exception.class)
public ResponseEntity<ErrorResponse> handleException(
Exception ex
) {
return ResponseEntity
.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse(
HttpStatus.INTERNAL_SERVER_ERROR.value(),
"Internal server error",
LocalDateTime.now()
));
}
}
@@ -1,48 +0,0 @@
package aplp.backend.lms.api.controllers;
import aplp.backend.lms.application.dtos.CourseReqDto;
import aplp.backend.lms.application.dtos.CourseResDto;
import aplp.backend.lms.application.services.CourseService;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/api/courses")
@RequiredArgsConstructor
public class CourseController {
private final CourseService courseService;
@GetMapping
public List<CourseResDto> getAll() {
return courseService.getAll();
}
@GetMapping("/{id}")
public CourseResDto getById(@PathVariable Long id) {
return courseService.getById(id);
}
@PostMapping
@ResponseStatus(HttpStatus.CREATED)
public CourseResDto create(@Valid @RequestBody CourseReqDto request) {
return courseService.create(request);
}
@PutMapping("/{id}")
public CourseResDto update(
@PathVariable Long id,
@RequestBody CourseReqDto request) {
return courseService.update(id, request);
}
@DeleteMapping("/{id}")
@ResponseStatus(HttpStatus.NO_CONTENT)
public void delete(@PathVariable Long id) {
courseService.delete(id);
}
}
@@ -1,6 +0,0 @@
package aplp.backend.lms.application.dtos;
public record CourseReqDto(
String title,
String description
) {}
@@ -1,17 +0,0 @@
package aplp.backend.lms.application.dtos;
import aplp.backend.lms.domain.entities.Course;
public record CourseResDto(
Long id,
String title,
String description
) {
public static CourseResDto from(Course course) {
return new CourseResDto(
course.getId(),
course.getTitle(),
course.getDescription()
);
}
}
@@ -1,20 +0,0 @@
package aplp.backend.lms.application.mappers;
import aplp.backend.lms.application.dtos.CourseReqDto;
import aplp.backend.lms.application.dtos.CourseResDto;
import aplp.backend.lms.domain.entities.Course;
import org.mapstruct.Mapper;
import org.mapstruct.MappingTarget;
@Mapper(componentModel = "spring")
public interface CourseMapper {
CourseResDto toResponse(Course course);
Course toEntity(CourseReqDto request);
void updateEntity(
CourseReqDto request,
@MappingTarget Course course
);
}
@@ -1,52 +0,0 @@
package aplp.backend.lms.application.services;
import aplp.backend.core.common.exception.ResourceNotFoundException;
import aplp.backend.lms.application.dtos.CourseReqDto;
import aplp.backend.lms.application.dtos.CourseResDto;
import aplp.backend.lms.application.mappers.CourseMapper;
import aplp.backend.lms.domain.entities.Course;
import aplp.backend.lms.domain.repositories.CourseRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
@RequiredArgsConstructor
public class CourseService {
private final CourseRepository courseRepository;
private final CourseMapper courseMapper;
public List<CourseResDto> getAll() {
return courseRepository.findAll()
.stream()
.map(CourseResDto::from)
.toList();
}
public CourseResDto getById(Long id) {
Course course = courseRepository.findById(id)
.orElseThrow(() -> new ResourceNotFoundException("Course not found"));
return CourseResDto.from(course);
}
public CourseResDto create(CourseReqDto request) {
Course course = courseMapper.toEntity(request);
return courseMapper.toResponse(courseRepository.save(course));
}
public CourseResDto update(Long id, CourseReqDto request) {
Course course = courseRepository.findById(id)
.orElseThrow(() -> new ResourceNotFoundException("Course not found"));
courseMapper.updateEntity(request, course);
return courseMapper.toResponse(courseRepository.save(course));
}
public void delete(Long id) {
courseRepository.deleteById(id);
}
}
@@ -1,24 +0,0 @@
package aplp.backend.lms.domain.entities;
import jakarta.persistence.*;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
@Entity
@Table(name = "courses")
@Getter
@Setter
@NoArgsConstructor
public class Course {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false, length = 200)
private String title;
@Column(length = 1000)
private String description;
}
@@ -1,19 +0,0 @@
package aplp.backend.lms.domain.repositories;
import aplp.backend.lms.domain.entities.Course;
import org.springframework.stereotype.Repository;
import java.util.List;
import java.util.Optional;
@Repository
public interface CourseRepository {
Optional<Course> findById(Long id);
List<Course> findAll();
Course save(Course course);
void deleteById(Long id);
}
@@ -1,28 +0,0 @@
package aplp.backend.lms.infrastructure.config;
import io.swagger.v3.oas.annotations.OpenAPIDefinition;
import io.swagger.v3.oas.annotations.enums.SecuritySchemeType;
import io.swagger.v3.oas.annotations.info.Info;
import io.swagger.v3.oas.annotations.security.SecurityRequirement;
import io.swagger.v3.oas.annotations.security.SecurityScheme;
import org.springframework.context.annotation.Configuration;
@Configuration
@OpenAPIDefinition(
info = @Info(
title = "APLP LMS API",
version = "v1",
description = "APLP Learning Management System API"
),
security = {
@SecurityRequirement(name = "bearerAuth")
}
)
@SecurityScheme(
name = "bearerAuth",
type = SecuritySchemeType.HTTP,
bearerFormat = "JWT",
scheme = "bearer"
)
public class OpenApiConfig {
}
@@ -1,25 +0,0 @@
package aplp.backend.lms.infrastructure.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer;
import org.springframework.security.web.SecurityFilterChain;
@Configuration
public class SecurityConfig {
@Bean
public SecurityFilterChain securityFilterChain(
HttpSecurity http
) throws Exception {
http
.csrf(AbstractHttpConfigurer::disable)
.authorizeHttpRequests(auth -> auth
.anyRequest().permitAll()
);
return http.build();
}
}
@@ -1,9 +0,0 @@
package aplp.backend.lms.infrastructure.persistence.repositories;
import aplp.backend.lms.domain.entities.Course;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface CourseJpaRepository extends JpaRepository<Course, Long> {
}
@@ -1,35 +0,0 @@
package aplp.backend.lms.infrastructure.persistence.repositories;
import aplp.backend.lms.domain.entities.Course;
import aplp.backend.lms.domain.repositories.CourseRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Repository;
import java.util.List;
import java.util.Optional;
@Repository
@RequiredArgsConstructor
public class CourseRepositoryImpl implements CourseRepository {
private final CourseJpaRepository repository;
@Override
public Optional<Course> findById(Long id) {
return repository.findById(id);
}
@Override
public List<Course> findAll() {
return repository.findAll();
}
@Override
public Course save(Course course) {
return repository.save(course);
}
@Override
public void deleteById(Long id) {
repository.deleteById(id);
}
}
+3 -3
View File
@@ -3,13 +3,13 @@ spring:
name: lms name: lms
datasource: datasource:
url: jdbc:postgresql://localhost:5432/aplp url: jdbc:postgresql://192.168.2.100:5432/aplp
username: postgres username: postgres
password: Pa55w0rd password: Pa55w0rd
jpa: jpa:
hibernate: hibernate:
ddl-auto: validate ddl-auto: update
properties: properties:
hibernate: hibernate:
default_schema: lms default_schema: lms
@@ -17,7 +17,7 @@ spring:
show-sql: true show-sql: true
flyway: flyway:
enabled: true enabled: false
default-schema: lms default-schema: lms
schemas: lms schemas: lms
locations: classpath:db/migration locations: classpath:db/migration