Skip to content

Commit

Permalink
chuvaki ya hochu sdohnut'
Browse files Browse the repository at this point in the history
  • Loading branch information
Busygind committed Jan 18, 2024
1 parent 4ae958e commit af008ed
Show file tree
Hide file tree
Showing 27 changed files with 277 additions and 81 deletions.
2 changes: 2 additions & 0 deletions build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,8 @@ dependencies {
implementation("com.fasterxml.jackson.module:jackson-module-kotlin")
implementation("org.springframework.boot:spring-boot-starter-oauth2-resource-server")

annotationProcessor("org.springframework.boot:spring-boot-configuration-processor")

runtimeOnly("org.postgresql:postgresql")

testImplementation("org.springframework.boot:spring-boot-starter-test")
Expand Down
6 changes: 5 additions & 1 deletion src/main/kotlin/ru/itmo/filmhub/FilmHubApplication.kt
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,14 @@ package ru.itmo.filmhub
import org.springframework.boot.autoconfigure.SpringBootApplication
import org.springframework.boot.context.properties.EnableConfigurationProperties
import org.springframework.boot.runApplication
import ru.itmo.filmhub.config.DefaultConfigurationProperties
import ru.itmo.filmhub.config.RsaKeyProperties

@SpringBootApplication
@EnableConfigurationProperties(RsaKeyProperties::class)
@EnableConfigurationProperties(
RsaKeyProperties::class,
DefaultConfigurationProperties::class
)
class FilmHubApplication

fun main(args: Array<String>) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package ru.itmo.filmhub.config

import org.springframework.boot.context.properties.ConfigurationProperties
import org.springframework.boot.context.properties.ConstructorBinding
import java.util.UUID

@ConstructorBinding
@ConfigurationProperties("default")
data class DefaultConfigurationProperties(
val defaultSubscriptionId: UUID,
)
2 changes: 1 addition & 1 deletion src/main/kotlin/ru/itmo/filmhub/config/SecurityConfig.kt
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ class SecurityConfig(val rsaKeys: RsaKeyProperties) : WebMvcConfigurer {
.csrf { obj: CsrfConfigurer<HttpSecurity> -> obj.disable() }
.authorizeRequests { auth ->
auth
.antMatchers("/register/**").permitAll()
.antMatchers("/user/register/**").permitAll()
.anyRequest().authenticated()
}
.headers { headers: HeadersConfigurer<HttpSecurity?> ->
Expand Down
Original file line number Diff line number Diff line change
@@ -1,30 +1,29 @@
package ru.itmo.filmhub.controller

import org.springframework.http.HttpStatus
//import org.springframework.security.core.Authentication
import org.springframework.http.ResponseEntity
import org.springframework.security.core.Authentication
import org.springframework.web.bind.annotation.PostMapping
import org.springframework.web.bind.annotation.RequestBody
import org.springframework.web.bind.annotation.RequestMapping
import org.springframework.web.bind.annotation.ResponseStatus
import org.springframework.web.bind.annotation.RestController
import ru.itmo.filmhub.model.request.UserRegisterRequest
import ru.itmo.filmhub.model.entity.User
import ru.itmo.filmhub.messages.UserRegisterRequest
import ru.itmo.filmhub.service.UserService
import ru.itmo.filmhub.service.TokenService

@RestController
@RequestMapping("/user")
class AuthenticationController {
class AuthenticationController(
private val userService: UserService,
private val tokenService: TokenService,
) {
@PostMapping("/register")
fun register(
@RequestBody userRegisterRequest: UserRegisterRequest,
): ResponseEntity<User> = ResponseEntity.status(200).body(userService.addUser(userRegisterRequest))

// @PostMapping("/register")
// @ResponseStatus(HttpStatus.NO_CONTENT)
// suspend fun register(
// @RequestBody userRegisterRequest: UserRegisterRequest,
// ) {
// throw NotImplementedError()
// }
//
// @PostMapping("/auth")
// suspend fun auth(
// authentication: Authentication,
// ): String {
// throw NotImplementedError()
// }
@PostMapping("/auth")
fun auth(
authentication: Authentication,
): ResponseEntity<String> = ResponseEntity.status(200).body(tokenService.generateToken(authentication))
}
3 changes: 2 additions & 1 deletion src/main/kotlin/ru/itmo/filmhub/controller/PingController.kt
Original file line number Diff line number Diff line change
@@ -1,13 +1,14 @@
package ru.itmo.filmhub.controller

import org.springframework.http.ResponseEntity
import org.springframework.security.core.Authentication
import org.springframework.web.bind.annotation.GetMapping
import org.springframework.web.bind.annotation.RestController

@RestController
class PingController {
@GetMapping("/ping")
fun ping(): ResponseEntity<String> {
fun ping(auth: Authentication): ResponseEntity<String> {
return ResponseEntity.status(200).body("pong")
}
}
29 changes: 29 additions & 0 deletions src/main/kotlin/ru/itmo/filmhub/controller/ReviewController.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package ru.itmo.filmhub.controller

import org.springframework.http.ResponseEntity
import org.springframework.security.core.Authentication
import org.springframework.web.bind.annotation.GetMapping
import org.springframework.web.bind.annotation.PathVariable
import org.springframework.web.bind.annotation.PostMapping
import org.springframework.web.bind.annotation.RequestBody
import org.springframework.web.bind.annotation.RestController
import ru.itmo.filmhub.messages.AddReviewRequest
import ru.itmo.filmhub.service.ReviewService
import java.util.*

@RestController("/reviews")
class ReviewController(
private val reviewService: ReviewService,
) {
@PostMapping("/{movie_id}")
fun addReview(
@RequestBody addReviewRequest: AddReviewRequest,
@PathVariable(name = "movie_id", required = true) movieId: UUID,
authentication: Authentication,
) = ResponseEntity.status(200).body(reviewService.addReviewToMovie(addReviewRequest, authentication.name, movieId))

@GetMapping("/{movie_id}")
fun findReviewsByMovieId(
@PathVariable(name = "movie_id", required = true) movieId: UUID,
) = ResponseEntity.status(200).body(reviewService.findReviewsByMovieId(movieId))
}
Original file line number Diff line number Diff line change
@@ -1,29 +1,32 @@
package ru.itmo.filmhub.controller

import org.springframework.http.ResponseEntity
import org.springframework.security.core.Authentication
import org.springframework.web.bind.annotation.*
import ru.itmo.filmhub.model.entity.Subscription
import ru.itmo.filmhub.model.entity.User
import ru.itmo.filmhub.service.SubscriptionService
import java.util.*

@RestController
@RequestMapping()
@RequestMapping("/subscriptions")
class SubscriptionController(
private val service: SubscriptionService,
) {

@PostMapping("/users/{user_id}/subscriptions/{subscription_id}")
@PostMapping("/{subscription_id}")
fun saveSubscriptionForUser(
@PathVariable(name = "user_id", required = true) userId: UUID,
@PathVariable(name = "subscription_id", required = true) subscriptionId: UUID,
): ResponseEntity<User> {
return ResponseEntity.status(200).body(service.saveSubscriptionForUser(userId, subscriptionId))
}
authentication: Authentication
): ResponseEntity<User> =
ResponseEntity.status(200).body(service.saveSubscriptionForUser(authentication.name, subscriptionId))

@GetMapping("/subscriptions")
fun getAllSubscriptions(): ResponseEntity<List<Subscription>> {
return ResponseEntity.status(200).body(service.getAllSubscriptions())
}
@GetMapping("/user")
fun getUserSubscription(
authentication: Authentication
) = ResponseEntity.status(200).body(service.getSubscriptionByUsername(authentication.name))

@GetMapping
fun getAllSubscriptions(): ResponseEntity<List<Subscription>> =
ResponseEntity.status(200).body(service.getAllSubscriptions())
}
4 changes: 2 additions & 2 deletions src/main/kotlin/ru/itmo/filmhub/messages/AddMovieRequest.kt
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,11 @@ import java.util.UUID
class AddMovieRequest(
val name: String,
@JsonProperty("director_id")
val directorId: UUID?,
val directorId: UUID,
@JsonProperty("release_date")
val releaseDate: Instant,
@JsonProperty("studio_id")
val studioId: UUID?,
val studioId: UUID,
@JsonProperty("imdb_rating")
val imdbRating: Int,
@JsonProperty("kinopoisk_id")
Expand Down
6 changes: 6 additions & 0 deletions src/main/kotlin/ru/itmo/filmhub/messages/AddReviewRequest.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package ru.itmo.filmhub.messages

data class AddReviewRequest(
val text: String,
val rating: Int,
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package ru.itmo.filmhub.messages

data class UserRegisterRequest(
val login: String,
val password: String,
)
4 changes: 2 additions & 2 deletions src/main/kotlin/ru/itmo/filmhub/model/entity/BaseEntity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,6 @@ import javax.persistence.MappedSuperclass
abstract class BaseEntity {
@Id
@Column(name = "id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
val id: UUID? = null
@GeneratedValue(strategy = GenerationType.AUTO)
val id: UUID = UUID.randomUUID()
}
10 changes: 7 additions & 3 deletions src/main/kotlin/ru/itmo/filmhub/model/entity/User.kt
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package ru.itmo.filmhub.model.entity

import com.fasterxml.jackson.annotation.JsonIgnore
import org.hibernate.annotations.OnDelete
import org.hibernate.annotations.OnDeleteAction
import javax.persistence.*
Expand All @@ -11,16 +12,19 @@ data class User(
@OnDelete(action = OnDeleteAction.NO_ACTION)
@JoinColumn(name = "subscription_id", referencedColumnName = "id")
var subscription: Subscription? = null,
@Column(nullable = false)
@Column
val name: String? = null,
@Column(nullable = false)
@Column
val email: String? = null,
@Column(nullable = false)
val username: String? = null,
@Column(nullable = false)
val password: String? = null,
@Column(nullable = false)
val enabled: Boolean? = null,
@Column(name = "phone_number")
@Column
val phoneNumber: String? = null,
@OneToMany(cascade = [CascadeType.ALL])
@JsonIgnore
val authorities: List<UserAuthority> = mutableListOf()
) : BaseEntity()
22 changes: 22 additions & 0 deletions src/main/kotlin/ru/itmo/filmhub/model/entity/UserAuthority.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package ru.itmo.filmhub.model.entity

import javax.persistence.Entity
import javax.persistence.GeneratedValue
import javax.persistence.GenerationType
import javax.persistence.Id
import javax.persistence.JoinColumn
import javax.persistence.ManyToOne
import javax.persistence.Table

@Table(name = "authorities")
@Entity
data class UserAuthority(
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
val id: Int? = null,

@ManyToOne
@JoinColumn(name = "username", referencedColumnName = "username")
val user: User? = null,
val authority: String? = null,
)

This file was deleted.

10 changes: 10 additions & 0 deletions src/main/kotlin/ru/itmo/filmhub/repository/ReviewRepository.kt
Original file line number Diff line number Diff line change
@@ -1,10 +1,20 @@
package ru.itmo.filmhub.repository

import org.springframework.data.jpa.repository.JpaRepository
import org.springframework.data.jpa.repository.Query
import org.springframework.stereotype.Repository
import ru.itmo.filmhub.model.entity.Review
import java.util.UUID

@Repository
interface ReviewRepository : JpaRepository<Review, UUID> {

@Query(
"""
SELECT * FROM reviews
WHERE movie_id = :movieId
""",
nativeQuery = true
)
fun findAllByMovieId(movieId: UUID): List<Review>
}
Original file line number Diff line number Diff line change
@@ -1,10 +1,21 @@
package ru.itmo.filmhub.repository

import org.springframework.data.jpa.repository.JpaRepository
import org.springframework.data.jpa.repository.Query
import org.springframework.stereotype.Repository
import ru.itmo.filmhub.model.entity.Subscription
import java.util.UUID

@Repository
interface SubscriptionRepository : JpaRepository<Subscription, UUID> {

@Query(
"""
SELECT * FROM subscriptions
RIGHT JOIN users u on subscriptions.id = u.subscription_id
WHERE u.username = :username
""",
nativeQuery = true
)
fun findByUsername(username: String): Subscription
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,5 +9,5 @@ import java.util.*
interface UserRepository : JpaRepository<User, UUID> {
fun existsByUsername(username: String?): Boolean

fun findByUsername(username: String?): User?
fun findByUsername(username: String?): Optional<User>
}
2 changes: 0 additions & 2 deletions src/main/kotlin/ru/itmo/filmhub/service/MovieService.kt
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,7 @@ import org.springframework.data.domain.PageRequest
import org.springframework.stereotype.Service
import ru.itmo.filmhub.messages.AddMovieRequest
import ru.itmo.filmhub.model.entity.Movie
import ru.itmo.filmhub.model.response.MovieId
import ru.itmo.filmhub.repository.MovieRepository
import java.awt.print.Pageable
import java.util.UUID

@Service
Expand Down
28 changes: 28 additions & 0 deletions src/main/kotlin/ru/itmo/filmhub/service/ReviewService.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package ru.itmo.filmhub.service

import org.springframework.stereotype.Service
import ru.itmo.filmhub.model.entity.Review
import ru.itmo.filmhub.messages.AddReviewRequest
import ru.itmo.filmhub.repository.ReviewRepository
import java.util.UUID

@Service
class ReviewService(
private val reviewRepository: ReviewRepository,
private val movieService: MovieService,
private val userService: UserService,
) {
fun findReviewsByMovieId(movieId: UUID): List<Review> =
reviewRepository.findAllByMovieId(movieId)

fun addReviewToMovie(addReviewRequest: AddReviewRequest, username: String, movieId: UUID): Review =
reviewRepository.save(
Review(
text = addReviewRequest.text,
movie = movieService.getMovieById(movieId),
rating = addReviewRequest.rating,
author = userService.findUserByUsername(username)
)
)

}
Loading

0 comments on commit af008ed

Please sign in to comment.