From 5f4bc4405de3a9e3a1350078b1efc6d021e5040d Mon Sep 17 00:00:00 2001 From: Andrey Kassaev Date: Sat, 13 Jan 2024 14:58:15 +0400 Subject: [PATCH] note author specified --- .gitea/workflows/ci.yaml | 9 ---- .../notes/controller/note/NoteController.kt | 48 ++++++++++++++----- .../kotlin/com/kassaev/notes/model/Note.kt | 3 +- .../notes/repository/INoteRepository.kt | 15 ++++++ .../repository/IRefreshTokenRepository.kt | 5 +- .../notes/repository/IUserRepository.kt | 5 +- .../notes/service/AuthenticationService.kt | 2 +- .../notes/service/CustomUserDetailsService.kt | 2 +- .../com/kassaev/notes/service/NoteService.kt | 38 ++++++++++++--- .../com/kassaev/notes/service/UserService.kt | 2 +- 10 files changed, 91 insertions(+), 38 deletions(-) delete mode 100644 .gitea/workflows/ci.yaml diff --git a/.gitea/workflows/ci.yaml b/.gitea/workflows/ci.yaml deleted file mode 100644 index 5a29574..0000000 --- a/.gitea/workflows/ci.yaml +++ /dev/null @@ -1,9 +0,0 @@ -on: - pull_request: - branches: [ master ] - push: - branches: [ master ] - -jobs: - steps: - run: pwd \ No newline at end of file diff --git a/src/main/kotlin/com/kassaev/notes/controller/note/NoteController.kt b/src/main/kotlin/com/kassaev/notes/controller/note/NoteController.kt index cb6fa66..e61799f 100644 --- a/src/main/kotlin/com/kassaev/notes/controller/note/NoteController.kt +++ b/src/main/kotlin/com/kassaev/notes/controller/note/NoteController.kt @@ -3,7 +3,12 @@ package com.kassaev.notes.controller.note import com.kassaev.notes.model.Note import com.kassaev.notes.service.NoteService import lombok.AllArgsConstructor +import org.springframework.http.HttpStatus +import org.springframework.http.HttpStatusCode +import org.springframework.security.core.context.SecurityContextHolder import org.springframework.web.bind.annotation.* +import org.springframework.web.server.ResponseStatusException +import java.security.Principal import java.util.* @RestController @@ -12,27 +17,46 @@ import java.util.* class NoteController(val service: NoteService) { @GetMapping("/all") - fun getAllNotes(): List { - return service.getAllNotes() + fun getAllNotes(principal: Principal): List { +// val userEmail = SecurityContextHolder.getContext().authentication.name + return service.getAllNotes(principal.name) } @PostMapping("/create") - fun createNote(@RequestBody note: Note): Note { - return service.updateNote(note) + fun createNote(@RequestBody note: Note, principal: Principal): Note? { + return service.createNote( + note = note.copy(author = principal.name) + ) + } + @PutMapping("/update") + fun updateNote(@RequestBody note: Note, principal: Principal): HttpStatusCode { + val resCode = note.id?.let { + service.updateNote( + noteText = note.text, + author = principal.name, + noteId = it + ) + } + if (resCode == 1){ + return HttpStatus.OK + } + throw ResponseStatusException(HttpStatus.BAD_REQUEST, "Cannot update note.") } @GetMapping("/{id}") - fun getNoteById(@PathVariable id: Long): Optional { - return service.getNoteById(id) + fun getNoteById(@PathVariable id: Long, principal: Principal): Note? { + return service.getNoteByIdAndAuthor( + id = id, + author = principal.name + ) } - @PutMapping("/update") - fun updateNote(@RequestBody note: Note): Note { - return service.updateNote(note) - } @DeleteMapping("/remove/{id}") - fun deleteNote(@PathVariable id: Long){ - return service.deleteNote(id) + fun deleteNote(@PathVariable id: Long, principal: Principal): HttpStatus { + return service.deleteNote( + id = id, + author = principal.name + ) } } \ No newline at end of file diff --git a/src/main/kotlin/com/kassaev/notes/model/Note.kt b/src/main/kotlin/com/kassaev/notes/model/Note.kt index 7bc32a3..efbc52f 100644 --- a/src/main/kotlin/com/kassaev/notes/model/Note.kt +++ b/src/main/kotlin/com/kassaev/notes/model/Note.kt @@ -9,5 +9,6 @@ data class Note( @GeneratedValue(strategy = GenerationType.IDENTITY) val id: Long?, val text: String, - val dateCreated: String + val dateCreated: String, + val author: String ) \ No newline at end of file diff --git a/src/main/kotlin/com/kassaev/notes/repository/INoteRepository.kt b/src/main/kotlin/com/kassaev/notes/repository/INoteRepository.kt index 0e74184..c9f2137 100644 --- a/src/main/kotlin/com/kassaev/notes/repository/INoteRepository.kt +++ b/src/main/kotlin/com/kassaev/notes/repository/INoteRepository.kt @@ -1,8 +1,23 @@ package com.kassaev.notes.repository import com.kassaev.notes.model.Note +//import jakarta.transaction.Transactional import org.springframework.data.jpa.repository.JpaRepository +import org.springframework.data.jpa.repository.Modifying +import org.springframework.data.jpa.repository.Query +import org.springframework.data.repository.query.Param +import org.springframework.transaction.annotation.Transactional interface INoteRepository: JpaRepository { + @Query("SELECT * FROM notes WHERE author = :email", nativeQuery = true) + fun findAll(@Param("email") email: String): List + + fun findNotesByAuthor(author: String): List + @Modifying + @Transactional + @Query("UPDATE notes SET text=:noteText WHERE author = :author and id = :noteId", nativeQuery = true) + fun updateNote(noteText: String, author: String, noteId: Long): Int + + fun getNoteByIdAndAuthor(id: Long, author: String): Note? } \ No newline at end of file diff --git a/src/main/kotlin/com/kassaev/notes/repository/IRefreshTokenRepository.kt b/src/main/kotlin/com/kassaev/notes/repository/IRefreshTokenRepository.kt index 0ae8764..438466c 100644 --- a/src/main/kotlin/com/kassaev/notes/repository/IRefreshTokenRepository.kt +++ b/src/main/kotlin/com/kassaev/notes/repository/IRefreshTokenRepository.kt @@ -6,6 +6,7 @@ import org.springframework.data.jpa.repository.Query import org.springframework.data.repository.query.Param interface IRefreshTokenRepository: JpaRepository { - @Query("SELECT * FROM refresh_tokens WHERE email = :email", nativeQuery = true) - fun findByEmail(@Param("email") email: String): RefreshToken? + + fun getRefreshTokenByEmail(email: String): RefreshToken? + } \ No newline at end of file diff --git a/src/main/kotlin/com/kassaev/notes/repository/IUserRepository.kt b/src/main/kotlin/com/kassaev/notes/repository/IUserRepository.kt index ac54d3a..9fb2703 100644 --- a/src/main/kotlin/com/kassaev/notes/repository/IUserRepository.kt +++ b/src/main/kotlin/com/kassaev/notes/repository/IUserRepository.kt @@ -2,11 +2,8 @@ package com.kassaev.notes.repository import com.kassaev.notes.model.User import org.springframework.data.jpa.repository.JpaRepository -import org.springframework.data.jpa.repository.Query -import org.springframework.data.repository.query.Param interface IUserRepository: JpaRepository { - @Query("SELECT * FROM users WHERE email = :email", nativeQuery = true) - fun findByEmail(@Param("email") email: String): User? + fun getUserByEmail(email: String): User? } \ No newline at end of file diff --git a/src/main/kotlin/com/kassaev/notes/service/AuthenticationService.kt b/src/main/kotlin/com/kassaev/notes/service/AuthenticationService.kt index 2b24083..d04f505 100644 --- a/src/main/kotlin/com/kassaev/notes/service/AuthenticationService.kt +++ b/src/main/kotlin/com/kassaev/notes/service/AuthenticationService.kt @@ -61,7 +61,7 @@ class AuthenticationService( return extractedEmail?.let { email -> val currentUserDetails = userDetailsService.loadUserByUsername(email) - val refreshTokenInDB = refreshTokenRepository.findByEmail(currentUserDetails.username) + val refreshTokenInDB = refreshTokenRepository.getRefreshTokenByEmail(currentUserDetails.username) if (!tokenService.isExpired(token) && currentUserDetails.username == refreshTokenInDB?.email) generateAccessToken(currentUserDetails) diff --git a/src/main/kotlin/com/kassaev/notes/service/CustomUserDetailsService.kt b/src/main/kotlin/com/kassaev/notes/service/CustomUserDetailsService.kt index ca3db38..8c54599 100644 --- a/src/main/kotlin/com/kassaev/notes/service/CustomUserDetailsService.kt +++ b/src/main/kotlin/com/kassaev/notes/service/CustomUserDetailsService.kt @@ -13,7 +13,7 @@ class CustomUserDetailsService( private val userRepository: IUserRepository ): UserDetailsService { override fun loadUserByUsername(username: String): UserDetails = - userRepository.findByEmail(username) + userRepository.getUserByEmail(username) ?.mapToUserDetails() ?: throw UsernameNotFoundException("Not found!") diff --git a/src/main/kotlin/com/kassaev/notes/service/NoteService.kt b/src/main/kotlin/com/kassaev/notes/service/NoteService.kt index c2b93fe..dafd1c4 100644 --- a/src/main/kotlin/com/kassaev/notes/service/NoteService.kt +++ b/src/main/kotlin/com/kassaev/notes/service/NoteService.kt @@ -2,25 +2,49 @@ package com.kassaev.notes.service import com.kassaev.notes.model.Note import com.kassaev.notes.repository.INoteRepository +import org.springframework.http.HttpStatus +import org.springframework.http.HttpStatusCode import org.springframework.stereotype.Service +import org.springframework.web.server.ResponseStatusException import java.util.* @Service class NoteService(val repository: INoteRepository) { - fun getAllNotes(): List{ - return repository.findAll() + fun getAllNotes(email: String): List { + return repository.findNotesByAuthor(email) } - fun getNoteById(id: Long): Optional { - return repository.findById(id) + fun getNoteByIdAndAuthor(id: Long, author: String): Note? { + return repository.getNoteByIdAndAuthor( + id = id, + author = author + ) } - fun updateNote(note: Note): Note { + fun updateNote(noteText: String, author: String, noteId: Long): Int { + return repository.updateNote( + noteText = noteText, + author = author, + noteId = noteId + ) + } + + fun createNote(note: Note): Note { return repository.save(note) } - fun deleteNote(id: Long){ - repository.deleteById(id) + fun deleteNote(id: Long, author: String): HttpStatus { + val authorInDB = repository.getNoteByIdAndAuthor( + id = id, + author = author + )?.author + + if (authorInDB == author){ + repository.deleteById(id) + return HttpStatus.OK + }else{ + throw ResponseStatusException(HttpStatus.BAD_REQUEST, "Cannot update note.") + } } } \ No newline at end of file diff --git a/src/main/kotlin/com/kassaev/notes/service/UserService.kt b/src/main/kotlin/com/kassaev/notes/service/UserService.kt index 24997d0..9c06787 100644 --- a/src/main/kotlin/com/kassaev/notes/service/UserService.kt +++ b/src/main/kotlin/com/kassaev/notes/service/UserService.kt @@ -11,7 +11,7 @@ class UserService( private val userRepository: IUserRepository ) { fun createUser(user: User): User? { - val found = userRepository.findByEmail(user.email) + val found = userRepository.getUserByEmail(user.email) return if (found == null) { userRepository.save(user)