chore(repositories): refactored jdbc adapters and fixed security issues

This commit is contained in:
ITQ
2026-04-18 13:46:30 +03:00
parent ac9544e373
commit caabc59bf3
6 changed files with 208 additions and 239 deletions
@@ -1,88 +0,0 @@
package com.project.movienight.adapters.persistence
import com.project.movienight.domain.model.FilmLibrary
import org.springframework.jdbc.core.JdbcTemplate
import org.springframework.stereotype.Repository
import java.util.UUID
@Repository
class FilmLibraryRepository(private val jdbc: JdbcTemplate) {
fun findById(id: Int): FilmLibrary? =
jdbc.queryForObject(
"SELECT * FROM favorites WHERE id = ?",
{ rs, _ ->
FilmLibrary(
id = UUID.fromString(rs.getString("id")),
userId = UUID.fromString(rs.getString("userid")),
filmId = UUID.fromString(rs.getString("film_id")),
comment = rs.getString("comment"),
isViewed = rs.getBoolean("is_viewed"),
)
},
id
)
fun findAllByUserId(userId: Int): List<FilmLibrary> =
jdbc.query(
"SELECT * FROM favorites WHERE userid = ?",
{ rs, _ ->
FilmLibrary(
id = UUID.fromString(rs.getString("id")),
userId = UUID.fromString(rs.getString("userid")),
filmId = UUID.fromString(rs.getString("film_id")),
comment = rs.getString("comment"),
isViewed = rs.getBoolean("is_viewed"),
)
},
userId
)
fun findAll(): List<FilmLibrary> =
jdbc.query(
"SELECT * FROM favorites"
) { rs, _ ->
FilmLibrary(
id = UUID.fromString(rs.getString("id")),
userId = UUID.fromString(rs.getString("userid")),
filmId = UUID.fromString(rs.getString("film_id")),
comment = rs.getString("comment"),
isViewed = rs.getBoolean("is_viewed"),
)
}
fun findTopN(limit: Int, sortBy: String = "id"): List<FilmLibrary> =
jdbc.query(
"SELECT * FROM favorites ORDER BY $sortBy LIMIT ?",
{ rs, _ ->
FilmLibrary(
id = UUID.fromString(rs.getString("id")),
userId = UUID.fromString(rs.getString("userid")),
filmId = UUID.fromString(rs.getString("film_id")),
comment = rs.getString("comment"),
isViewed = rs.getBoolean("is_viewed"),
)
},
limit
)
fun save(library: FilmLibrary) {
jdbc.update(
"""
INSERT INTO favorites (userid, film_id, comment, is_viewed)
VALUES (?, ?, ?, ?)
ON CONFLICT (id) DO UPDATE
SET comment = ?, is_viewed = ?
""",
library.userId, library.filmId, library.comment, library.isViewed,
library.comment, library.isViewed
)
}
fun deleteById(id: Int) {
jdbc.update(
"DELETE FROM favorites WHERE id = ?",
id
)
}
}
@@ -1,68 +0,0 @@
package com.project.movienight.adapters.persistence
import com.project.movienight.domain.model.Film
import org.springframework.jdbc.core.JdbcTemplate
import org.springframework.stereotype.Repository
import java.time.LocalDate
import java.util.UUID
@Repository
class FilmRepository(private val jdbc: JdbcTemplate) {
fun findById(id: Int): Film? =
jdbc.queryForObject(
"SELECT * FROM films WHERE id = ?",
{ rs, _ ->
Film(
id = UUID.fromString(rs.getString("id")),
title = rs.getString("title"),
description = rs.getString("description"),
)
},
id
)
fun findAll(): List<Film> =
jdbc.query(
"SELECT * FROM films"
) { rs, _ ->
Film(
id = UUID.fromString(rs.getString("id")),
title = rs.getString("title"),
description = rs.getString("description"),
)
}
fun findTopN(limit: Int, sortBy: String = "title"): List<Film> =
jdbc.query(
"SELECT * FROM films ORDER BY $sortBy LIMIT ?",
{ rs, _ ->
Film(
id = UUID.fromString(rs.getString("id")),
title = rs.getString("title"),
description = rs.getString("description"),
)
},
limit
)
fun save(film: Film) {
jdbc.update(
"""
INSERT INTO films (title, genre_id, issue_date)
VALUES (?, ?, ?)
ON CONFLICT (id) DO UPDATE
SET title = ?, genre_id = ?, issue_date = ?
""",
film.title,
film.title,
)
}
fun deleteById(id: Int) {
jdbc.update(
"DELETE FROM films WHERE id = ?",
id
)
}
}
@@ -1,83 +0,0 @@
package com.project.movienight.adapters.persistence
import com.project.movienight.domain.model.Film
import com.project.movienight.domain.model.User
import org.springframework.jdbc.core.JdbcTemplate
import org.springframework.stereotype.Repository
import java.util.UUID
@Repository
class UserRepository(private val jdbc: JdbcTemplate) {
fun findById(id: UUID): User? =
jdbc.queryForObject(
"SELECT * FROM users WHERE id = ?",
{rs, _ ->
User(
id = UUID.fromString(rs.getString("id")),
name = rs.getString("name"),
email = rs.getString("email"),
library = null // брать библиотеку пользователя лучше отдельным запросом,
// который будет в FilmLibraryRepository
)
},
id.toString()
)
fun save(user: User) {
jdbc.update(
"""
INSERT INTO users(id, name, email, library)
VALUES (:id, :name, :email, :library)
ON CONFLICT (id)
DO UPDATE SET name = :name, email = :email, library = :library
""",
user.id.toString(), user.name, user.email, user.library,
user.name, user.email, user.library
)
}
fun deleteById(id: UUID) {
jdbc.update(
"DELETE FROM users WHERE id = ?",
id.toString()
)
}
fun findByEmail(email: String): User? =
jdbc.queryForObject(
"SELECT * FROM users WHERE email = ?",
{rs, _ ->
User(
id = UUID.fromString(rs.getString("id")),
name = rs.getString("name"),
email = rs.getString("email"),
library = null
)
},
)
fun findTopN(limit: Int, sortBy: String = "name"): List<User> =
jdbc.query(
"SELECT * FROM users ORDER BY $sortBy LIMIT ?",
{ rs, _ ->
User(
id = UUID.fromString(rs.getString("id")),
name = rs.getString("name"),
email = rs.getString("email"),
library = null
)
},
limit
)
fun existsByEmail(email: String): Boolean {
val count = jdbc.queryForObject(
"SELECT COUNT(*) FROM users WHERE email = ?",
Int::class.java,
email
) ?: 0
return count > 0
}
}
@@ -0,0 +1,73 @@
package com.project.movienight.adapters.persistence.jdbc
import com.project.movienight.application.ports.output.FilmLibraryRepositoryPort
import com.project.movienight.domain.model.FilmLibrary
import org.springframework.jdbc.core.JdbcTemplate
import org.springframework.stereotype.Repository
import java.sql.ResultSet
import java.util.UUID
@Repository
class FilmLibraryRepository(
private val jdbc: JdbcTemplate,
) : FilmLibraryRepositoryPort {
private val filmLibraryRowMapper = { rs: ResultSet, _: Int ->
FilmLibrary(
id = UUID.fromString(rs.getString("id")),
userId = UUID.fromString(rs.getString("user_id")),
filmId = UUID.fromString(rs.getString("film_id")),
comment = rs.getString("comment"),
isViewed = rs.getBoolean("is_viewed"),
)
}
override fun save(filmLibrary: FilmLibrary): FilmLibrary {
val updatedRows =
jdbc.update(
"""
UPDATE favorites
SET user_id = ?, film_id = ?, comment = ?, is_viewed = ?
WHERE id = ?
""".trimIndent(),
filmLibrary.userId,
filmLibrary.filmId,
filmLibrary.comment,
filmLibrary.isViewed,
filmLibrary.id,
)
if (updatedRows == 0) {
jdbc.update(
"""
INSERT INTO favorites (id, user_id, film_id, comment, is_viewed)
VALUES (?, ?, ?, ?, ?)
""".trimIndent(),
filmLibrary.id,
filmLibrary.userId,
filmLibrary.filmId,
filmLibrary.comment,
filmLibrary.isViewed,
)
}
return filmLibrary
}
override fun findById(id: UUID): FilmLibrary? {
val entries =
jdbc.query(
"SELECT id, user_id, film_id, comment, is_viewed FROM favorites WHERE id = ?",
filmLibraryRowMapper,
id,
)
return entries.firstOrNull()
}
override fun findAll(): List<FilmLibrary> =
jdbc.query(
"SELECT id, user_id, film_id, comment, is_viewed FROM favorites",
filmLibraryRowMapper,
)
override fun deleteById(id: UUID) {
jdbc.update("DELETE FROM favorites WHERE id = ?", id)
}
}
@@ -0,0 +1,67 @@
package com.project.movienight.adapters.persistence.jdbc
import com.project.movienight.application.ports.output.FilmRepositoryPort
import com.project.movienight.domain.model.Film
import org.springframework.jdbc.core.JdbcTemplate
import org.springframework.stereotype.Repository
import java.sql.ResultSet
import java.util.UUID
@Repository
class FilmRepository(
private val jdbc: JdbcTemplate,
) : FilmRepositoryPort {
private val filmRowMapper = { rs: ResultSet, _: Int ->
Film(
id = UUID.fromString(rs.getString("id")),
title = rs.getString("title"),
description = rs.getString("description"),
)
}
override fun save(film: Film): Film {
val updatedRows =
jdbc.update(
"""
UPDATE films
SET title = ?, description = ?
WHERE id = ?
""".trimIndent(),
film.title,
film.description,
film.id,
)
if (updatedRows == 0) {
jdbc.update(
"""
INSERT INTO films (id, title, description)
VALUES (?, ?, ?)
""".trimIndent(),
film.id,
film.title,
film.description,
)
}
return film
}
override fun findById(id: UUID): Film? {
val films =
jdbc.query(
"SELECT id, title, description FROM films WHERE id = ?",
filmRowMapper,
id,
)
return films.firstOrNull()
}
override fun findAll(): List<Film> =
jdbc.query(
"SELECT id, title, description FROM films",
filmRowMapper,
)
override fun deleteById(id: UUID) {
jdbc.update("DELETE FROM films WHERE id = ?", id)
}
}
@@ -0,0 +1,68 @@
package com.project.movienight.adapters.persistence.jdbc
import com.project.movienight.application.ports.output.UserRepositoryPort
import com.project.movienight.domain.model.User
import org.springframework.jdbc.core.JdbcTemplate
import org.springframework.stereotype.Repository
import java.sql.ResultSet
import java.util.UUID
@Repository
class UserRepository(
private val jdbc: JdbcTemplate,
) : UserRepositoryPort {
private val userRowMapper = { rs: ResultSet, _: Int ->
User(
id = UUID.fromString(rs.getString("id")),
name = rs.getString("name"),
email = rs.getString("email"),
library = null,
)
}
override fun save(user: User): User {
val updatedRows =
jdbc.update(
"""
UPDATE users
SET name = ?, email = ?
WHERE id = ?
""".trimIndent(),
user.name,
user.email,
user.id,
)
if (updatedRows == 0) {
jdbc.update(
"""
INSERT INTO users (id, name, email)
VALUES (?, ?, ?)
""".trimIndent(),
user.id,
user.name,
user.email,
)
}
return user
}
override fun findById(id: UUID): User? {
val users =
jdbc.query(
"SELECT id, name, email FROM users WHERE id = ?",
userRowMapper,
id,
)
return users.firstOrNull()
}
override fun findAll(): List<User> =
jdbc.query(
"SELECT id, name, email FROM users",
userRowMapper,
)
override fun deleteById(id: UUID) {
jdbc.update("DELETE FROM users WHERE id = ?", id)
}
}