diff --git a/build.gradle.kts b/build.gradle.kts index 5b525c2..9d1c1fa 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -40,40 +40,16 @@ extra["springGrpcVersion"] = "1.0.1" dependencies { implementation("org.springframework.boot:spring-boot-starter-web") - implementation("org.springframework.boot:spring-boot-h2console") - implementation("org.springframework.boot:spring-boot-micrometer-tracing-brave") implementation("org.springframework.boot:spring-boot-starter-actuator") - implementation("org.springframework.boot:spring-boot-starter-cache") implementation("org.springframework.boot:spring-boot-starter-data-jdbc") - implementation("org.springframework.boot:spring-boot-starter-flyway") - implementation("org.springframework.boot:spring-boot-starter-security") implementation("org.springframework.boot:spring-boot-starter-validation") - implementation("io.grpc:grpc-services") - implementation("io.micrometer:micrometer-tracing-bridge-brave") - implementation("io.sentry:sentry-spring-boot-4-starter") - implementation("net.ttddyy.observation:datasource-micrometer-spring-boot:2.0.1") implementation("org.flywaydb:flyway-database-postgresql") implementation("org.jetbrains.kotlin:kotlin-reflect") - implementation("org.springframework.grpc:spring-grpc-spring-boot-starter") - implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3") - implementation(libs.emailverifier.kt) - compileOnly("org.projectlombok:lombok") developmentOnly("org.springframework.boot:spring-boot-devtools") - runtimeOnly("com.h2database:h2") - runtimeOnly("io.micrometer:micrometer-registry-prometheus") runtimeOnly("org.postgresql:postgresql") - annotationProcessor("org.projectlombok:lombok") - testImplementation("org.springframework.boot:spring-boot-micrometer-tracing-test") - testImplementation("org.springframework.boot:spring-boot-starter-actuator-test") - testImplementation("org.springframework.boot:spring-boot-starter-cache-test") - testImplementation("org.springframework.boot:spring-boot-starter-data-jdbc-test") - testImplementation("org.springframework.boot:spring-boot-starter-flyway-test") - testImplementation("org.springframework.boot:spring-boot-starter-security-test") - testImplementation("org.springframework.boot:spring-boot-starter-validation-test") testImplementation("org.jetbrains.kotlin:kotlin-test-junit5") - testImplementation("org.springframework.grpc:spring-grpc-test") testRuntimeOnly("org.junit.platform:junit-platform-launcher") } @@ -165,6 +141,8 @@ tasks.named("jar") { } + + /* detekt { buildUponDefaultConfig = true diff --git a/src/main/kotlin/com/project/movienight/adapters/web/FilmController.kt b/src/main/kotlin/com/project/movienight/adapters/web/FilmController.kt new file mode 100644 index 0000000..a0a24d8 --- /dev/null +++ b/src/main/kotlin/com/project/movienight/adapters/web/FilmController.kt @@ -0,0 +1,58 @@ +package com.project.movienight.adapters.web + +import com.project.movienight.application.ports.input.CreateFilmCommand +import com.project.movienight.application.ports.input.CreateFilmUseCase +import com.project.movienight.application.ports.input.DeleteFilmUseCase +import com.project.movienight.application.ports.input.EditFilmCommand +import com.project.movienight.application.ports.input.EditFilmUseCase +import com.project.movienight.domain.model.Film +import org.springframework.http.HttpStatus +import org.springframework.web.bind.annotation.* +import java.util.UUID + +@RestController +@RequestMapping("/api/films") +class FilmController( + private val createFilmUseCase: CreateFilmUseCase, + private val editFilmUseCase: EditFilmUseCase, + private val deleteFilmUseCase: DeleteFilmUseCase, +) { + + @PostMapping + @ResponseStatus(HttpStatus.CREATED) + fun create(@RequestBody request: CreateFilmRequest): Film = + createFilmUseCase.create( + CreateFilmCommand( + title = request.title, + description = request.description, + ) + ) + + @PatchMapping("/{id}") + fun edit( + @PathVariable id: UUID, + @RequestBody request: EditFilmRequest, + ): Film = + editFilmUseCase.edit( + id = id, + command = EditFilmCommand( + title = request.title, + description = request.description, + ) + ) + + @DeleteMapping("/{id}") + @ResponseStatus(HttpStatus.NO_CONTENT) + fun delete(@PathVariable id: UUID) = + deleteFilmUseCase.delete(id) +} + +data class CreateFilmRequest( + val title: String, + val description: String, +) + +data class EditFilmRequest( + val title: String, + val description: String, +) diff --git a/src/main/kotlin/com/project/movienight/adapters/web/FilmLibraryController.kt b/src/main/kotlin/com/project/movienight/adapters/web/FilmLibraryController.kt new file mode 100644 index 0000000..9c908db --- /dev/null +++ b/src/main/kotlin/com/project/movienight/adapters/web/FilmLibraryController.kt @@ -0,0 +1,72 @@ +package com.project.movienight.adapters.web + +import com.project.movienight.application.ports.input.AddFilmToLibraryCommand +import com.project.movienight.application.ports.input.AddFilmToLibraryUseCase +import com.project.movienight.application.ports.input.CreateFilmLibraryCommand +import com.project.movienight.application.ports.input.CreateFilmLibraryUseCase +import com.project.movienight.application.ports.input.GetFilmLibraryQuery +import com.project.movienight.application.ports.input.GetFilmLibraryUseCase +import com.project.movienight.application.ports.input.RemoveFilmFromLibraryCommand +import com.project.movienight.application.ports.input.RemoveFilmFromLibraryUseCase +import com.project.movienight.domain.model.FilmLibrary +import org.springframework.http.HttpStatus +import org.springframework.web.bind.annotation.* +import java.util.UUID + +@RestController +@RequestMapping("/api/users/{userId}/library") +class FilmLibraryController( + private val createFilmLibraryUseCase: CreateFilmLibraryUseCase, + private val addFilmToLibraryUseCase: AddFilmToLibraryUseCase, + private val removeFilmFromLibraryUseCase: RemoveFilmFromLibraryUseCase, + private val getFilmLibraryUseCase: GetFilmLibraryUseCase, +) { + + @PostMapping + @ResponseStatus(HttpStatus.CREATED) + fun create( + @PathVariable userId: UUID, + @RequestBody request: CreateFilmLibraryRequest, + ): FilmLibrary = + createFilmLibraryUseCase.create( + CreateFilmLibraryCommand( + userId = userId, + name = request.name, + ) + ) + + @GetMapping + fun get(@PathVariable userId: UUID): FilmLibrary = + getFilmLibraryUseCase.getLibrary( + GetFilmLibraryQuery(userId = userId) + ) + + @PostMapping("/films/{filmId}") + @ResponseStatus(HttpStatus.CREATED) + fun addFilm( + @PathVariable userId: UUID, + @PathVariable filmId: UUID, + ): FilmLibrary = + addFilmToLibraryUseCase.addFilm( + AddFilmToLibraryCommand( + userId = userId, + filmId = filmId, + ) + ) + + @DeleteMapping("/films/{filmId}") + @ResponseStatus(HttpStatus.NO_CONTENT) + fun removeFilm( + @PathVariable userId: UUID, + @PathVariable filmId: UUID, + ) = removeFilmFromLibraryUseCase.removeFilm( + RemoveFilmFromLibraryCommand( + userId = userId, + filmId = filmId, + ) + ) +} + +data class CreateFilmLibraryRequest( + val name: String = "Мои фильмы", +) diff --git a/src/main/kotlin/com/project/movienight/adapters/web/UserController.kt b/src/main/kotlin/com/project/movienight/adapters/web/UserController.kt new file mode 100644 index 0000000..7fc8d2a --- /dev/null +++ b/src/main/kotlin/com/project/movienight/adapters/web/UserController.kt @@ -0,0 +1,56 @@ +package com.project.movienight.adapters.web + +import com.project.movienight.application.ports.input.CreateUserCommand +import com.project.movienight.application.ports.input.CreateUserUseCase +import com.project.movienight.application.ports.input.DeleteUserUseCase +import com.project.movienight.application.ports.input.EditUserCommand +import com.project.movienight.application.ports.input.EditUserUseCase +import com.project.movienight.domain.model.User +import org.springframework.http.HttpStatus +import org.springframework.web.bind.annotation.* +import java.util.UUID + +@RestController +@RequestMapping("/api/users") +class UserController( + private val createUserUseCase: CreateUserUseCase, + private val editUserUseCase: EditUserUseCase, + private val deleteUserUseCase: DeleteUserUseCase, +) { + + @PostMapping + @ResponseStatus(HttpStatus.CREATED) + fun create(@RequestBody request: CreateUserRequest): User = + createUserUseCase.create( + CreateUserCommand( + name = request.name, + email = request.email, + ) + ) + + @PatchMapping("/{id}") + fun edit( + @PathVariable id: UUID, + @RequestBody request: EditUserRequest, + ): User = + editUserUseCase.edit( + id = id, + command = EditUserCommand( + name = request.name, + ) + ) + + @DeleteMapping("/{id}") + @ResponseStatus(HttpStatus.NO_CONTENT) + fun delete(@PathVariable id: UUID) = + deleteUserUseCase.delete(id) +} + +data class CreateUserRequest( + val name: String, + val email: String, +) + +data class EditUserRequest( + val name: String, +)