Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions api/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ plugins {

dependencies {
implementation(project(":core"))
implementation(libs.kotlin.logging)
implementation(libs.spring.web)
implementation(libs.spring.security)
implementation(libs.spring.validation)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,14 @@ package com.retoday.api.domain.auth.dto.request

import com.fasterxml.jackson.annotation.JsonProperty
import com.retoday.core.domain.auth.dto.command.LoginCommand
import com.retoday.core.domain.user.entity.Provider
import com.retoday.core.domain.user.entity.SocialProvider
import jakarta.validation.constraints.NotBlank

data class LoginRequest(
@field:NotBlank
@get:JsonProperty("oAuthToken")
val oAuthToken: String,
val provider: Provider
val provider: SocialProvider
) {
fun toCommand(): LoginCommand =
LoginCommand(
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package com.retoday.api.global.security

import com.retoday.core.domain.user.entity.Role
import com.retoday.core.domain.user.entity.User
import com.retoday.core.global.jwt.JwtProvider
import org.springframework.security.core.Authentication
import org.springframework.security.core.GrantedAuthority
import org.springframework.security.core.authority.SimpleGrantedAuthority
Expand All @@ -16,9 +16,9 @@ data class RetodayAuthentication(
fun from(payload: Map<String, *>): RetodayAuthentication =
with(payload) {
RetodayAuthentication(
id = (get(User::id.name) as String).toLong(),
id = (get(JwtProvider.USER_ID_CLAIM) as String).toLong(),
roles =
(get(User::roles.name) as String)
(get(JwtProvider.USER_ROLES_CLAIM) as String)
.split(',')
.map { Role.valueOf(it) }
.toSet()
Expand Down
2 changes: 2 additions & 0 deletions api/src/main/resources/application.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,8 @@ server:
port: ${LOCAL_PORT:8080}
web:
uris: http://localhost:3000
extension:
uris: http://sdadaa
---
spring:
config:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@ package com.retoday.api.fixture
import com.retoday.api.domain.auth.dto.request.LoginRequest
import com.retoday.api.domain.auth.dto.request.RefreshRequest
import com.retoday.api.global.security.RetodayAuthentication
import com.retoday.core.domain.user.entity.Provider
import com.retoday.core.domain.user.entity.Role
import com.retoday.core.domain.user.entity.SocialProvider
import com.retoday.core.fixture.ID
import com.retoday.core.fixture.PROVIDER
import com.retoday.core.fixture.ROLES
Expand All @@ -21,7 +21,7 @@ fun createRetodayAuthentication(

fun createLoginRequest(
oAuthToken: String = TOKEN,
provider: Provider = PROVIDER
provider: SocialProvider = PROVIDER
): LoginRequest =
LoginRequest(
oAuthToken = oAuthToken,
Expand Down
4 changes: 1 addition & 3 deletions build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ plugins {
alias(libs.plugins.kotlin.spring) apply false
alias(libs.plugins.kotlin.lint) apply false
alias(libs.plugins.spring.boot) apply false
alias(libs.plugins.spring.dependency.management)
alias(libs.plugins.spring.dependency.management) apply false
}

allprojects {
Expand Down Expand Up @@ -51,8 +51,6 @@ subprojects {
}

dependencies {
implementation(rootProject.libs.kotlin.logging)
implementation(rootProject.libs.kotlin.reflect)
testImplementation(rootProject.libs.bundles.test)
}

Expand Down
23 changes: 8 additions & 15 deletions core/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,32 +1,25 @@
plugins {
alias(libs.plugins.kotlin.jpa)
}

allOpen {
annotation("jakarta.persistence.Entity")
annotation("jakarta.persistence.MappedSuperclass")
annotation("jakarta.persistence.Embeddable")
alias(libs.plugins.flyway)
}

dependencies {
implementation(libs.spring.web)
implementation(libs.spring.data.jpa)
implementation(libs.spring.data.jdbc)
implementation(libs.spring.data.redis)
implementation(libs.spring.log4j2)
implementation(libs.hypersistence.utils)
implementation(libs.kotlin.logging)
implementation(libs.flyway.core)
implementation(libs.google.gemini)
implementation(libs.jackson.kotlin)
implementation(libs.bundles.jdsl)
implementation(libs.bundles.jwt)
runtimeOnly(libs.mysql.connector)
runtimeOnly(libs.mysql.driver)
runtimeOnly(libs.flyway.mysql)

testImplementation(libs.spring.test)
testImplementation(libs.h2)
testFixturesImplementation(libs.spring.data.jpa)
testFixturesImplementation(libs.jdsl.jpa)
testFixturesImplementation(libs.spring.data.jdbc)
testFixturesImplementation(libs.bundles.test)
testFixturesImplementation(libs.bundles.spring.test)
testFixturesImplementation(libs.bundles.test.containers)
testFixturesImplementation(libs.bundles.testcontainers)
}

tasks {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ package com.retoday.core.domain.auth.client

import com.retoday.core.domain.auth.dto.response.GetOAuthUserResponse
import com.retoday.core.domain.auth.exception.InvalidOAuthTokenException
import com.retoday.core.domain.user.entity.Provider
import com.retoday.core.domain.user.entity.SocialProvider
import com.retoday.core.global.annotation.Client
import org.springframework.http.HttpHeaders
import org.springframework.http.HttpStatus
Expand All @@ -12,7 +12,7 @@ import org.springframework.web.client.requiredBody
@Client
class GoogleClient(
private val restClient: RestClient
) : OAuthClient(provider = Provider.GOOGLE) {
) : OAuthClient(provider = SocialProvider.GOOGLE) {
private companion object {
const val USERINFO_ENDPOINT = "https://openidconnect.googleapis.com/v1/userinfo"
const val ID_FIELD = "sub"
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
package com.retoday.core.domain.auth.client

import com.retoday.core.domain.auth.dto.response.GetOAuthUserResponse
import com.retoday.core.domain.user.entity.Provider
import com.retoday.core.domain.user.entity.SocialProvider

abstract class OAuthClient(
val provider: Provider
val provider: SocialProvider
) {
protected companion object {
const val AUTHORIZATION_HEADER_PREFIX = "Bearer "
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
package com.retoday.core.domain.auth.dto.command

import com.retoday.core.domain.user.entity.Provider
import com.retoday.core.domain.user.entity.SocialProvider

data class LoginCommand(
val oAuthToken: String,
val provider: Provider
val provider: SocialProvider
)
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
package com.retoday.core.domain.auth.dto.response

import com.retoday.core.domain.user.entity.Provider
import com.retoday.core.domain.user.entity.SocialProvider

data class GetOAuthUserResponse(
val id: String,
val provider: Provider,
val provider: SocialProvider,
val email: String,
val firstName: String,
val lastName: String,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,11 +50,11 @@ class AuthService(
}.let { userRepository.save(it) }

profileRepository
.findByUserId(user.id!!)
.findByUserId(user.id)
?.apply { synchronizeOAuthUser(getOAuthUserResponse) }
.orElse {
Profile(
userId = user.id!!,
userId = user.id,
firstName = getOAuthUserResponse.firstName,
lastName = getOAuthUserResponse.lastName,
imageUrl = getOAuthUserResponse.imageUrl
Expand Down Expand Up @@ -106,7 +106,7 @@ class AuthService(
.also {
refreshTokenRepository.save(
RefreshToken(
userId = id!!,
userId = id,
content = it,
expiration = jwtProperties.refreshTokenExpiration.seconds
)
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,23 +1,11 @@
package com.retoday.core.domain.history.entity

import com.retoday.core.global.entity.BaseEntity
import io.hypersistence.utils.hibernate.id.Tsid
import jakarta.persistence.Entity
import jakarta.persistence.Id
import jakarta.persistence.Index
import jakarta.persistence.Table
import org.springframework.data.relational.core.mapping.Table
import java.time.Instant

@Entity
@Table(
indexes = [
Index(name = "idx_user_id_visited_at", columnList = "user_id, visited_at")
]
)
class History(
@Id
@Tsid
val id: Long? = null,
@Table("history")
data class History(
val userId: Long,
val websiteId: Long,
val pageId: Long,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,21 +1,13 @@
package com.retoday.core.domain.history.entity

import com.retoday.core.global.entity.BaseEntity
import io.hypersistence.utils.hibernate.id.Tsid
import jakarta.persistence.Column
import jakarta.persistence.Entity
import jakarta.persistence.Id
import org.springframework.data.relational.core.mapping.Table
import java.time.Instant

@Entity
class Page(
@Id
@Tsid
val id: Long? = null,
@Table("page")
data class Page(
val websiteId: Long,
@Column(nullable = false, length = 768, unique = true)
val url: String,
@Column(length = 500)
var title: String? = null,
@Column(columnDefinition = "TEXT")
var description: String? = null
val title: String? = null,
val description: String? = null
) : BaseEntity()
Original file line number Diff line number Diff line change
@@ -1,27 +1,19 @@
package com.retoday.core.domain.history.entity

import com.retoday.core.global.entity.BaseEntity
import io.hypersistence.utils.hibernate.id.Tsid
import jakarta.persistence.Column
import jakarta.persistence.Entity
import jakarta.persistence.Id
import org.springframework.data.relational.core.mapping.Table

@Entity
class Website(
@Id
@Tsid
val id: Long? = null,
@Column(nullable = false, unique = true)
@Table("website")
data class Website(
val domain: String,
var categoryId: Long? = null,
@Column(length = 500)
var faviconUrl: String? = null
) : BaseEntity() {
fun updateCategory(newCategoryId: Long?) {
this.categoryId = newCategoryId
fun updateCategory(categoryId: Long?) {
this.categoryId = categoryId
}

fun updateFaviconUrl(newFaviconUrl: String) {
this.faviconUrl = newFaviconUrl
fun updateFaviconUrl(faviconUrl: String) {
this.faviconUrl = faviconUrl
}
}
Original file line number Diff line number Diff line change
@@ -1,21 +1,10 @@
package com.retoday.core.domain.history.entity

import com.retoday.core.global.entity.BaseEntity
import io.hypersistence.utils.hibernate.id.Tsid
import jakarta.persistence.Column
import jakarta.persistence.Entity
import jakarta.persistence.EnumType
import jakarta.persistence.Enumerated
import jakarta.persistence.Id
import org.springframework.data.relational.core.mapping.Table

@Entity
class WebsiteCategory(
@Id
@Tsid
val id: Long? = null,
@Enumerated(EnumType.STRING)
@Column(nullable = false, length = 30, unique = true)
@Table("website_category")
data class WebsiteCategory(
val code: WebsiteCategoryCode,
@Column(nullable = false, length = 50, unique = true)
val name: String
) : BaseEntity()
Original file line number Diff line number Diff line change
Expand Up @@ -15,5 +15,11 @@ enum class WebsiteCategoryCode(
DESIGN("디자인"),
DEVELOPMENT("개발"),
AI("AI"),
OTHER("기타")
ETC("기타");

companion object {
private val byLabel: Map<String, WebsiteCategoryCode> = entries.associateBy { it.defaultName }

fun fromLabel(label: String?): WebsiteCategoryCode? = label?.trim()?.let { byLabel[it] }
}
}
Loading
Loading