diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index e6441136..1b33c55b 100644 Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 8937ed68..841ad098 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ # -# Copyright (C) 2023-2025 RollW +# Copyright (C) 2023-2026 RollW # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -16,7 +16,7 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.2-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.4-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/gradlew b/gradlew index 7fd7b6f6..70874212 100644 --- a/gradlew +++ b/gradlew @@ -1,7 +1,7 @@ #!/bin/sh # -# Copyright (C) 2023-2025 RollW +# Copyright (C) 2023-2026 RollW # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -84,7 +84,7 @@ done # shellcheck disable=SC2034 APP_BASE_NAME=${0##*/} # Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) -APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit +APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s\n' "$PWD" ) || exit # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD=maximum @@ -112,7 +112,7 @@ case "$( uname )" in #( NONSTOP* ) nonstop=true ;; esac -CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar +CLASSPATH="\\\"\\\"" # Determine the Java command to use to start the JVM. @@ -203,7 +203,7 @@ fi DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' # Collect all arguments for the java command: -# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, # and any embedded shellness will be escaped. # * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be # treated as '${Hostname}' itself on the command line. @@ -211,7 +211,7 @@ DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' set -- \ "-Dorg.gradle.appname=$APP_BASE_NAME" \ -classpath "$CLASSPATH" \ - org.gradle.wrapper.GradleWrapperMain \ + -jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \ "$@" # Stop when "xargs" is not available. diff --git a/gradlew.bat b/gradlew.bat index 25da30db..db3a6ac2 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -13,6 +13,8 @@ @rem See the License for the specific language governing permissions and @rem limitations under the License. @rem +@rem SPDX-License-Identifier: Apache-2.0 +@rem @if "%DEBUG%"=="" @echo off @rem ########################################################################## @@ -68,11 +70,11 @@ goto fail :execute @rem Setup the command line -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar +set CLASSPATH= @rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* :end @rem End local scope for the variables with windows NT shell diff --git a/lampray-content/article-service/src/main/java/tech/lamprism/lampray/content/article/Article.java b/lampray-content/article-service/src/main/java/tech/lamprism/lampray/content/article/Article.java index 4cecd985..00561ec4 100644 --- a/lampray-content/article-service/src/main/java/tech/lamprism/lampray/content/article/Article.java +++ b/lampray-content/article-service/src/main/java/tech/lamprism/lampray/content/article/Article.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2023 RollW + * Copyright (C) 2023-2026 RollW * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -19,7 +19,7 @@ import space.lingu.NonNull; import space.lingu.Nullable; import tech.lamprism.lampray.DataEntity; -import tech.lamprism.lampray.LongEntityBuilder; +import tech.lamprism.lampray.EntityBuilder; import tech.lamprism.lampray.content.ContentDetails; import tech.lamprism.lampray.content.ContentDetailsMetadata; import tech.lamprism.lampray.content.ContentType; @@ -30,8 +30,9 @@ /** * @author RollW */ -public class Article implements DataEntity, ContentDetails { +public class Article implements DataEntity, ContentDetails { private final Long id; + private final String resourceId; private final long userId; private final String title; private final String cover; @@ -39,9 +40,10 @@ public class Article implements DataEntity, ContentDetails { private final OffsetDateTime createTime; private final OffsetDateTime updateTime; - public Article(Long id, long userId, String title, String cover, + public Article(Long id, String resourceId, long userId, String title, String cover, StructuralText content, OffsetDateTime createTime, OffsetDateTime updateTime) { this.id = id; + this.resourceId = resourceId; this.userId = userId; this.title = title; this.cover = cover; @@ -55,14 +57,14 @@ public Long getId() { } @Override - public Long getEntityId() { - return id; + public String getEntityId() { + return resourceId; } @Override @NonNull - public Long getResourceId() { - return DataEntity.super.getResourceId(); + public String getResourceId() { + return resourceId; } @Override @@ -103,8 +105,8 @@ public String getCover() { return cover; } - public Article fork(Long id) { - return new Article(id, userId, title, cover, + public Article fork(Long id, String resourceId) { + return new Article(id, resourceId, userId, title, cover, content, createTime, updateTime ); } @@ -118,7 +120,7 @@ public static Builder builder() { } @Override - public long getContentId() { + public String getContentId() { return getEntityId(); } @@ -128,8 +130,9 @@ public ContentType getContentType() { return ContentType.ARTICLE; } - public final static class Builder implements LongEntityBuilder
{ + public final static class Builder implements EntityBuilder { private Long id; + private String resourceId; private long userId; private String title; private String cover; @@ -143,6 +146,7 @@ public Builder() { public Builder(Article article) { this.id = article.id; + this.resourceId = article.resourceId; this.userId = article.userId; this.title = article.title; this.cover = article.cover; @@ -152,11 +156,20 @@ public Builder(Article article) { } @Override - public Builder setEntityId(Long id) { + public Builder setEntityId(String id) { + return setResourceId(id); + } + + public Builder setId(Long id) { this.id = id; return this; } + public Builder setResourceId(String resourceId) { + this.resourceId = resourceId; + return this; + } + public Builder setUserId(long userId) { this.userId = userId; return this; @@ -189,7 +202,7 @@ public Builder setCover(String cover) { @Override public Article build() { - return new Article(id, userId, title, cover, content, + return new Article(id, resourceId, userId, title, cover, content, createTime, updateTime); } } diff --git a/lampray-content/article-service/src/main/java/tech/lamprism/lampray/content/article/persistence/ArticleDao.kt b/lampray-content/article-service/src/main/java/tech/lamprism/lampray/content/article/persistence/ArticleDao.kt index 0e200491..2e124bef 100644 --- a/lampray-content/article-service/src/main/java/tech/lamprism/lampray/content/article/persistence/ArticleDao.kt +++ b/lampray-content/article-service/src/main/java/tech/lamprism/lampray/content/article/persistence/ArticleDao.kt @@ -1,5 +1,5 @@ /* - * Copyright (C) 2023 RollW + * Copyright (C) 2023-2026 RollW * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,8 +16,6 @@ package tech.lamprism.lampray.content.article.persistence -import org.springframework.data.jpa.repository.Query -import org.springframework.data.repository.query.Param import tech.lamprism.lampray.common.data.CommonDao import tech.lamprism.lampray.common.data.Dao @@ -25,7 +23,4 @@ import tech.lamprism.lampray.common.data.Dao * @author RollW */ @Dao -interface ArticleDao : CommonDao { - @Query("FROM ArticleDo a WHERE a.userId = :userId") - fun findAllByUserId(@Param("userId") userId: Long): List -} \ No newline at end of file +interface ArticleDao : CommonDao diff --git a/lampray-content/article-service/src/main/java/tech/lamprism/lampray/content/article/persistence/ArticleDo.kt b/lampray-content/article-service/src/main/java/tech/lamprism/lampray/content/article/persistence/ArticleEntity.kt similarity index 72% rename from lampray-content/article-service/src/main/java/tech/lamprism/lampray/content/article/persistence/ArticleDo.kt rename to lampray-content/article-service/src/main/java/tech/lamprism/lampray/content/article/persistence/ArticleEntity.kt index 13e2e889..7f401344 100644 --- a/lampray-content/article-service/src/main/java/tech/lamprism/lampray/content/article/persistence/ArticleDo.kt +++ b/lampray-content/article-service/src/main/java/tech/lamprism/lampray/content/article/persistence/ArticleEntity.kt @@ -1,5 +1,5 @@ /* - * Copyright (C) 2023 RollW + * Copyright (C) 2023-2026 RollW * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,13 +18,13 @@ package tech.lamprism.lampray.content.article.persistence import jakarta.persistence.Column import jakarta.persistence.Entity -import jakarta.persistence.GeneratedValue -import jakarta.persistence.GenerationType import jakarta.persistence.Id import jakarta.persistence.Lob import jakarta.persistence.Table import jakarta.persistence.Temporal import jakarta.persistence.TemporalType +import org.hibernate.annotations.Generated +import org.hibernate.generator.EventType import tech.lamprism.lampray.DataEntity import tech.lamprism.lampray.content.ContentDetails import tech.lamprism.lampray.content.ContentDetailsMetadata @@ -39,12 +39,15 @@ import java.time.OffsetDateTime */ @Entity @Table(name = "article") -class ArticleDo( - @Column(name = "id", nullable = false) - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) +class ArticleEntity( + @Column(name = "id", nullable = false, insertable = false, updatable = false) + @Generated(event = [EventType.INSERT]) var id: Long? = null, + @Id + @Column(name = "resource_id", nullable = false, length = 64, unique = true) + private var persistedResourceId: String, + @Column(name = "user_id", nullable = false) private var userId: Long = 0, @@ -59,16 +62,16 @@ class ArticleDo( private var content: StructuralText = StructuralText.EMPTY, @Temporal(TemporalType.TIMESTAMP) - @Column(name = "createTime", nullable = false) + @Column(name = "create_time", nullable = false) private var createTime: OffsetDateTime = OffsetDateTime.now(), @Temporal(TemporalType.TIMESTAMP) @Column(name = "update_time", nullable = false) private var updateTime: OffsetDateTime = OffsetDateTime.now() -) : DataEntity, ContentDetails { - override fun getEntityId(): Long? = id +) : DataEntity, ContentDetails { + override fun getEntityId(): String = persistedResourceId - override fun getResourceId(): Long = id!! + override fun getResourceId(): String = persistedResourceId override fun getCreateTime(): OffsetDateTime = createTime @@ -82,7 +85,7 @@ class ArticleDo( this.updateTime = updateTime } - override fun getContentId(): Long = id!! + override fun getContentId(): String = persistedResourceId override fun getContentType(): ContentType = ContentType.ARTICLE @@ -108,14 +111,15 @@ class ArticleDo( ArticleDetailsMetadata(cover) fun lock(): Article = Article( - id!!, userId, title, cover, content, createTime, updateTime + id, persistedResourceId, userId, title, cover, content, createTime, updateTime ) fun toBuilder(): Builder = Builder(this) override fun toString(): String { - return "ArticleDo(" + + return "ArticleEntity(" + "id=$id, " + + "resourceId='$persistedResourceId', " + "userId=$userId, " + "title='$title', " + "cover='$cover', " + @@ -127,6 +131,7 @@ class ArticleDo( class Builder { private var id: Long? = null + private var resourceId: String? = null private var userId: Long = 0 private var title: String? = null private var cover: String = "" @@ -136,8 +141,9 @@ class ArticleDo( constructor() - constructor(other: ArticleDo) { + constructor(other: ArticleEntity) { this.id = other.id + this.resourceId = other.getResourceId() this.userId = other.userId this.title = other.title this.cover = other.cover @@ -150,6 +156,10 @@ class ArticleDo( this.id = id } + fun setResourceId(resourceId: String) = apply { + this.resourceId = resourceId + } + fun setUserId(userId: Long) = apply { this.userId = userId } @@ -174,20 +184,32 @@ class ArticleDo( this.updateTime = updateTime } - fun build(): ArticleDo { - return ArticleDo( - id, userId, title!!, cover, - content!!, createTime!!, updateTime!! + fun build(): ArticleEntity { + return ArticleEntity( + id = id, + persistedResourceId = resourceId!!, + userId = userId, + title = title!!, + cover = cover, + content = content!!, + createTime = createTime!!, + updateTime = updateTime!! ) } } companion object { @JvmStatic - fun Article.toDo(): ArticleDo { - return ArticleDo( - entityId, userId, title, cover, content, - createTime, updateTime + fun Article.toEntity(): ArticleEntity { + return ArticleEntity( + id = id, + persistedResourceId = resourceId, + userId = userId, + title = title, + cover = cover, + content = content, + createTime = createTime, + updateTime = updateTime ) } @@ -196,4 +218,4 @@ class ArticleDo( return Builder() } } -} \ No newline at end of file +} diff --git a/lampray-content/article-service/src/main/java/tech/lamprism/lampray/content/article/persistence/ArticleRepository.kt b/lampray-content/article-service/src/main/java/tech/lamprism/lampray/content/article/persistence/ArticleRepository.kt index 541fb283..b865d2e7 100644 --- a/lampray-content/article-service/src/main/java/tech/lamprism/lampray/content/article/persistence/ArticleRepository.kt +++ b/lampray-content/article-service/src/main/java/tech/lamprism/lampray/content/article/persistence/ArticleRepository.kt @@ -1,5 +1,5 @@ /* - * Copyright (C) 2023 RollW + * Copyright (C) 2023-2026 RollW * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -26,25 +26,35 @@ import java.util.Optional */ @Repository class ArticleRepository( - private val articleDao: ArticleDao -) : CommonRepository(articleDao) { - fun findAllByUserId(userId: Long): List { - return articleDao.findAllByUserId(userId) + articleDao: ArticleDao +) : CommonRepository(articleDao) { + override fun save(entity: S): S { + return saveAndFlush(entity) } - fun findByTitle(title: String, userId: Long): Optional { - return articleDao.findOne(createTitleSpecification(title, userId)) + override fun saveAll(entities: Iterable): List { + return saveAllAndFlush(entities) + } + + fun findAllByUserId(userId: Long): List { + return findAll { root, _, builder -> + builder.equal(root.get(ArticleEntity_.userId), userId) + } + } + + fun findByTitle(title: String, userId: Long): Optional { + return findOne(createTitleSpecification(title, userId)) } private fun createTitleSpecification( title: String, userId: Long - ): Specification { - return Specification { root, query, criteriaBuilder -> + ): Specification { + return Specification { root, _, criteriaBuilder -> criteriaBuilder.and( - criteriaBuilder.equal(root.get(ArticleDo_.title), title), - criteriaBuilder.equal(root.get(ArticleDo_.userId), userId) + criteriaBuilder.equal(root.get(ArticleEntity_.title), title), + criteriaBuilder.equal(root.get(ArticleEntity_.userId), userId) ) } } -} \ No newline at end of file +} diff --git a/lampray-content/article-service/src/main/java/tech/lamprism/lampray/content/article/service/ArticleContentProvider.kt b/lampray-content/article-service/src/main/java/tech/lamprism/lampray/content/article/service/ArticleContentProvider.kt index 02e3f1a3..c2f729fd 100644 --- a/lampray-content/article-service/src/main/java/tech/lamprism/lampray/content/article/service/ArticleContentProvider.kt +++ b/lampray-content/article-service/src/main/java/tech/lamprism/lampray/content/article/service/ArticleContentProvider.kt @@ -1,5 +1,5 @@ /* - * Copyright (C) 2023-2025 RollW + * Copyright (C) 2023-2026 RollW * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -23,7 +23,7 @@ import tech.lamprism.lampray.content.ContentProvider import tech.lamprism.lampray.content.ContentTrait import tech.lamprism.lampray.content.ContentType import tech.lamprism.lampray.content.article.Article -import tech.lamprism.lampray.content.article.persistence.ArticleDo.Companion.toDo +import tech.lamprism.lampray.content.article.persistence.ArticleEntity.Companion.toEntity import tech.lamprism.lampray.content.article.persistence.ArticleRepository import tech.lamprism.lampray.content.common.ContentErrorCode import tech.lamprism.lampray.content.common.ContentException @@ -69,6 +69,6 @@ class ArticleContentProvider( } override fun updateArticle(article: Article) { - articleRepository.save(article.toDo()) + articleRepository.save(article.toEntity()) } } diff --git a/lampray-content/article-service/src/main/java/tech/lamprism/lampray/content/article/service/ArticleService.java b/lampray-content/article-service/src/main/java/tech/lamprism/lampray/content/article/service/ArticleService.java index eecff3fe..cdaf053c 100644 --- a/lampray-content/article-service/src/main/java/tech/lamprism/lampray/content/article/service/ArticleService.java +++ b/lampray-content/article-service/src/main/java/tech/lamprism/lampray/content/article/service/ArticleService.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2023-2025 RollW + * Copyright (C) 2023-2026 RollW * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -21,12 +21,13 @@ import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; import space.lingu.NonNull; +import tech.lamprism.lampray.common.data.ResourceIdGenerator; import tech.lamprism.lampray.content.ContentDetails; import tech.lamprism.lampray.content.ContentPublisher; import tech.lamprism.lampray.content.ContentType; import tech.lamprism.lampray.content.UncreatedContent; import tech.lamprism.lampray.content.article.Article; -import tech.lamprism.lampray.content.article.persistence.ArticleDo; +import tech.lamprism.lampray.content.article.persistence.ArticleEntity; import tech.lamprism.lampray.content.article.persistence.ArticleRepository; import tech.lamprism.lampray.content.collection.ContentCollectionIdentity; import tech.lamprism.lampray.content.collection.ContentCollectionProvider; @@ -47,9 +48,12 @@ public class ArticleService implements ContentPublisher, ContentCollectionProvid private static final Logger logger = LoggerFactory.getLogger(ArticleService.class); private final ArticleRepository articleRepository; + private final ResourceIdGenerator resourceIdGenerator; - public ArticleService(ArticleRepository articleRepository) { + public ArticleService(ArticleRepository articleRepository, + ResourceIdGenerator resourceIdGenerator) { this.articleRepository = articleRepository; + this.resourceIdGenerator = resourceIdGenerator; } @Override @@ -69,7 +73,8 @@ public ContentDetails publish(@NonNull UncreatedContent uncreatedContent, throw new ContentException(ContentErrorCode.ERROR_CONTENT_EXISTED); } - ArticleDo article = ArticleDo.builder() + ArticleEntity article = ArticleEntity.builder() + .setResourceId(resourceIdGenerator.nextId(ContentType.ARTICLE.getSystemResourceKind())) .setUserId(userId) .setTitle(title) .setContent(content) @@ -77,9 +82,9 @@ public ContentDetails publish(@NonNull UncreatedContent uncreatedContent, .setCreateTime(timestamp) .setUpdateTime(timestamp) .build(); - ArticleDo created = articleRepository.save(article); + ArticleEntity created = articleRepository.save(article); logger.trace("Article({}) title={} created by user({})", - created.getEntityId(), created.getTitle(), created.getUserId()); + created.getResourceId(), created.getTitle(), created.getUserId()); return created; } @@ -91,14 +96,14 @@ public boolean supports(@NonNull ContentType contentType) { private List
getUserArticles(long id) { return articleRepository.findAllByUserId(id) .stream() - .map(ArticleDo::lock) + .map(ArticleEntity::lock) .toList(); } private List
getArticles() { return articleRepository.findAll() .stream() - .map(ArticleDo::lock) + .map(ArticleEntity::lock) .toList(); } @@ -117,7 +122,7 @@ public List getContents( return switch (contentCollectionIdentity.getContentCollectionType()) { case ARTICLES -> getArticles(); case USER_ARTICLES -> getUserArticles( - contentCollectionIdentity.getContentCollectionId() + Long.parseLong(contentCollectionIdentity.getContentCollectionId()) ); default -> throw new UnsupportedOperationException("Unsupported collection type: " + contentCollectionIdentity.getContentCollectionType()); diff --git a/lampray-content/comment-service/src/main/java/tech/lamprism/lampray/content/comment/Comment.java b/lampray-content/comment-service/src/main/java/tech/lamprism/lampray/content/comment/Comment.java index 688b6052..8201073c 100644 --- a/lampray-content/comment-service/src/main/java/tech/lamprism/lampray/content/comment/Comment.java +++ b/lampray-content/comment-service/src/main/java/tech/lamprism/lampray/content/comment/Comment.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2023 RollW + * Copyright (C) 2023-2026 RollW * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -19,7 +19,7 @@ import space.lingu.NonNull; import space.lingu.Nullable; import tech.lamprism.lampray.DataEntity; -import tech.lamprism.lampray.LongEntityBuilder; +import tech.lamprism.lampray.EntityBuilder; import tech.lamprism.lampray.content.ContentAssociated; import tech.lamprism.lampray.content.ContentDetails; import tech.lamprism.lampray.content.ContentDetailsMetadata; @@ -33,18 +33,19 @@ /** * @author RollW */ -public class Comment implements DataEntity, ContentDetails, ContentAssociated { - public static final int COMMENT_ROOT_ID = 0; +public class Comment implements DataEntity, ContentDetails, ContentAssociated { + public static final String COMMENT_ROOT_ID = ""; private final Long id; + private final String resourceId; private final long userId; /** * Parent comment id. *

* If the comment is a top-level comment, - * the parent id is 0. + * the parent id is an empty string. */ - private final long parentId; + private final String parentId; private final StructuralText content; private final OffsetDateTime createTime; private final OffsetDateTime updateTime; @@ -53,7 +54,7 @@ public class Comment implements DataEntity, ContentDetails, ContentAssocia * Comment on which type of content. */ private final ContentType commentOnType; - private final long commentOnId; + private final String commentOnId; @NonNull private final CommentStatus commentStatus; @@ -61,11 +62,12 @@ public class Comment implements DataEntity, ContentDetails, ContentAssocia private final ContentIdentity associatedContent; private final CommentDetailsMetadata commentDetailsMetadata; - public Comment(Long id, long userId, long parentId, StructuralText content, + public Comment(Long id, String resourceId, long userId, String parentId, StructuralText content, OffsetDateTime createTime, OffsetDateTime updateTime, - ContentType commentOnType, long commentOnId, + ContentType commentOnType, String commentOnId, @NonNull CommentStatus commentStatus) { this.id = id; + this.resourceId = resourceId; this.userId = userId; this.commentOnId = commentOnId; this.parentId = parentId; @@ -79,19 +81,19 @@ public Comment(Long id, long userId, long parentId, StructuralText content, } @Override - public Long getEntityId() { - return id; + public String getEntityId() { + return resourceId; } - @NonNull @Override - public Long getResourceId() { - return id; + @NonNull + public String getResourceId() { + return resourceId; } @Override - public long getContentId() { - return id; + public String getContentId() { + return resourceId; } @NonNull @@ -117,11 +119,11 @@ public StructuralText getContent() { return content; } - public long getParentId() { + public String getParentId() { return parentId; } - public long getCommentOnId() { + public String getCommentOnId() { return commentOnId; } @@ -171,11 +173,12 @@ public SystemResourceKind getSystemResourceKind() { return CommentResourceKind.INSTANCE; } - public static class Builder implements LongEntityBuilder { + public static class Builder implements EntityBuilder { private Long id; + private String resourceId; private long userId; - private long commentOn; - private long parentId; + private String commentOn; + private String parentId = COMMENT_ROOT_ID; private StructuralText content; private OffsetDateTime createTime; private OffsetDateTime updateTime; @@ -185,6 +188,7 @@ public static class Builder implements LongEntityBuilder { public Builder(Comment comment) { this.id = comment.id; + this.resourceId = comment.resourceId; this.userId = comment.userId; this.commentOn = comment.commentOnId; this.parentId = comment.parentId; @@ -200,22 +204,31 @@ public Builder() { } @Override - public Builder setEntityId(Long id) { + public Builder setEntityId(String id) { + return setResourceId(id); + } + + public Builder setId(Long id) { this.id = id; return this; } + public Builder setResourceId(String resourceId) { + this.resourceId = resourceId; + return this; + } + public Builder setUserId(long userId) { this.userId = userId; return this; } - public Builder setCommentOn(long commentOn) { + public Builder setCommentOn(String commentOn) { this.commentOn = commentOn; return this; } - public Builder setParentId(long parentId) { + public Builder setParentId(String parentId) { this.parentId = parentId; return this; } @@ -248,7 +261,7 @@ public Builder setCommentStatus(@NonNull CommentStatus commentStatus) { @Override public Comment build() { return new Comment( - id, userId, parentId, + id, resourceId, userId, parentId, content, createTime, updateTime, type, commentOn, commentStatus diff --git a/lampray-content/comment-service/src/main/java/tech/lamprism/lampray/content/comment/CommentDetailsMetadata.java b/lampray-content/comment-service/src/main/java/tech/lamprism/lampray/content/comment/CommentDetailsMetadata.java index 6a96d6b0..6435a2bb 100644 --- a/lampray-content/comment-service/src/main/java/tech/lamprism/lampray/content/comment/CommentDetailsMetadata.java +++ b/lampray-content/comment-service/src/main/java/tech/lamprism/lampray/content/comment/CommentDetailsMetadata.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2023 RollW + * Copyright (C) 2023-2026 RollW * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -26,10 +26,10 @@ */ public record CommentDetailsMetadata( ContentType contentType, - long contentId, + String contentId, @Nullable - Long parentId + String parentId ) implements ContentDetailsMetadata { public ContentIdentity getCommentOn() { return ContentIdentity.of(contentId, contentType); diff --git a/lampray-content/comment-service/src/main/java/tech/lamprism/lampray/content/comment/persistence/CommentDao.kt b/lampray-content/comment-service/src/main/java/tech/lamprism/lampray/content/comment/persistence/CommentDao.kt index c77d33e9..48b1cb5c 100644 --- a/lampray-content/comment-service/src/main/java/tech/lamprism/lampray/content/comment/persistence/CommentDao.kt +++ b/lampray-content/comment-service/src/main/java/tech/lamprism/lampray/content/comment/persistence/CommentDao.kt @@ -1,5 +1,5 @@ /* - * Copyright (C) 2023 RollW + * Copyright (C) 2023-2026 RollW * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -23,5 +23,4 @@ import tech.lamprism.lampray.common.data.Dao * @author RollW */ @Dao -interface CommentDao : CommonDao { -} \ No newline at end of file +interface CommentDao : CommonDao diff --git a/lampray-content/comment-service/src/main/java/tech/lamprism/lampray/content/comment/persistence/CommentDo.kt b/lampray-content/comment-service/src/main/java/tech/lamprism/lampray/content/comment/persistence/CommentEntity.kt similarity index 71% rename from lampray-content/comment-service/src/main/java/tech/lamprism/lampray/content/comment/persistence/CommentDo.kt rename to lampray-content/comment-service/src/main/java/tech/lamprism/lampray/content/comment/persistence/CommentEntity.kt index 672c279b..7beacdb3 100644 --- a/lampray-content/comment-service/src/main/java/tech/lamprism/lampray/content/comment/persistence/CommentDo.kt +++ b/lampray-content/comment-service/src/main/java/tech/lamprism/lampray/content/comment/persistence/CommentEntity.kt @@ -1,5 +1,5 @@ /* - * Copyright (C) 2023 RollW + * Copyright (C) 2023-2026 RollW * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,12 +20,12 @@ import jakarta.persistence.Column import jakarta.persistence.Entity import jakarta.persistence.EnumType import jakarta.persistence.Enumerated -import jakarta.persistence.GeneratedValue -import jakarta.persistence.GenerationType import jakarta.persistence.Id import jakarta.persistence.Lob import jakarta.persistence.Table +import org.hibernate.annotations.Generated import org.hibernate.annotations.JdbcTypeCode +import org.hibernate.generator.EventType import org.hibernate.type.SqlTypes import tech.lamprism.lampray.DataEntity import tech.lamprism.lampray.content.ContentAssociated @@ -45,17 +45,20 @@ import java.time.OffsetDateTime */ @Entity @Table(name = "comment") -class CommentDo( - @Id - @Column(name = "id", nullable = false) - @GeneratedValue(strategy = GenerationType.IDENTITY) +class CommentEntity( + @Column(name = "id", nullable = false, insertable = false, updatable = false) + @Generated(event = [EventType.INSERT]) private var id: Long? = null, + @Id + @Column(name = "resource_id", nullable = false, length = 64, unique = true) + private var persistedResourceId: String, + @Column(name = "user_id", nullable = false) private var userId: Long = 0, @Column(name = "parent_id", nullable = false) - var parentId: Long = 0, + var parentId: String = Comment.COMMENT_ROOT_ID, @Lob @Column(name = "content", nullable = false, length = 1000000) @@ -72,22 +75,22 @@ class CommentDo( @JdbcTypeCode(SqlTypes.VARCHAR) var commentOnType: ContentType = ContentType.COMMENT, - @Column(name = "comment_on_id", nullable = false) - var commentOnId: Long = 0, + @Column(name = "comment_on_id", nullable = false, length = 64) + var commentOnId: String = "", @Column(name = "comment_status", nullable = false, length = 40) @Enumerated(EnumType.STRING) @JdbcTypeCode(SqlTypes.VARCHAR) var commentStatus: CommentStatus = CommentStatus.NONE -) : DataEntity, ContentDetails, ContentAssociated { - override fun getEntityId(): Long? = id +) : DataEntity, ContentDetails, ContentAssociated { + override fun getEntityId(): String = persistedResourceId + + override fun getResourceId(): String = persistedResourceId - fun setId(id: Long) { + fun setId(id: Long?) { this.id = id } - override fun getResourceId(): Long = id!! - override fun getCreateTime(): OffsetDateTime = createTime fun setCreateTime(createTime: OffsetDateTime) { @@ -100,7 +103,7 @@ class CommentDo( this.updateTime = updateTime } - override fun getContentId(): Long = id!! + override fun getContentId(): String = persistedResourceId override fun getContentType(): ContentType = ContentType.COMMENT @@ -132,13 +135,14 @@ class CommentDo( } fun lock(): Comment = Comment( - id!!, userId, parentId, content, createTime, + id, persistedResourceId, userId, parentId, content, createTime, updateTime, commentOnType, commentOnId, commentStatus ) override fun toString(): String { - return "CommentDo(" + + return "CommentEntity(" + "id=$id, " + + "resourceId='$persistedResourceId', " + "userId=$userId, " + "parentId=$parentId, " + "content='$content', " + @@ -152,19 +156,21 @@ class CommentDo( class Builder { private var id: Long? = null + private var resourceId: String? = null private var userId: Long = 0 - private var parentId: Long = 0 + private var parentId: String = Comment.COMMENT_ROOT_ID private var content: StructuralText? = null private var createTime: OffsetDateTime? = null private var updateTime: OffsetDateTime? = null private var commentOnType: ContentType? = null - private var commentOnId: Long = 0 + private var commentOnId: String = "" private var commentStatus: CommentStatus? = null constructor() - constructor(other: CommentDo) { + constructor(other: CommentEntity) { this.id = other.id + this.resourceId = other.getResourceId() this.userId = other.userId this.parentId = other.parentId this.content = other.content @@ -179,11 +185,15 @@ class CommentDo( this.id = id } + fun setResourceId(resourceId: String) = apply { + this.resourceId = resourceId + } + fun setUserId(userId: Long) = apply { this.userId = userId } - fun setParentId(parentId: Long) = apply { + fun setParentId(parentId: String) = apply { this.parentId = parentId } @@ -203,7 +213,7 @@ class CommentDo( this.commentOnType = commentOnType } - fun setCommentOnId(commentOnId: Long) = apply { + fun setCommentOnId(commentOnId: String) = apply { this.commentOnId = commentOnId } @@ -211,17 +221,18 @@ class CommentDo( this.commentStatus = commentStatus } - fun build(): CommentDo { - return CommentDo( - id, - userId, - parentId, - content!!, - createTime!!, - updateTime!!, - commentOnType!!, - commentOnId, - commentStatus!! + fun build(): CommentEntity { + return CommentEntity( + id = id, + persistedResourceId = resourceId!!, + userId = userId, + parentId = parentId, + content = content!!, + createTime = createTime!!, + updateTime = updateTime!!, + commentOnType = commentOnType!!, + commentOnId = commentOnId, + commentStatus = commentStatus!! ) } } @@ -231,12 +242,19 @@ class CommentDo( fun builder(): Builder = Builder() @JvmStatic - fun Comment.toDo(): CommentDo { - return CommentDo( - entityId, userId, parentId, content, - createTime, updateTime, - commentOnType, commentOnId, commentStatus + fun Comment.toEntity(): CommentEntity { + return CommentEntity( + id = null, + persistedResourceId = resourceId, + userId = userId, + parentId = parentId, + content = content, + createTime = createTime, + updateTime = updateTime, + commentOnType = commentOnType, + commentOnId = commentOnId, + commentStatus = commentStatus ) } } -} \ No newline at end of file +} diff --git a/lampray-content/comment-service/src/main/java/tech/lamprism/lampray/content/comment/persistence/CommentRepository.kt b/lampray-content/comment-service/src/main/java/tech/lamprism/lampray/content/comment/persistence/CommentRepository.kt index 773c9bce..fb60c57e 100644 --- a/lampray-content/comment-service/src/main/java/tech/lamprism/lampray/content/comment/persistence/CommentRepository.kt +++ b/lampray-content/comment-service/src/main/java/tech/lamprism/lampray/content/comment/persistence/CommentRepository.kt @@ -1,5 +1,5 @@ /* - * Copyright (C) 2023 RollW + * Copyright (C) 2023-2026 RollW * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -26,22 +26,36 @@ import tech.lamprism.lampray.content.ContentType */ @Repository class CommentRepository( - private val commentDao: CommentDao -) : CommonRepository(commentDao) { + commentDao: CommentDao +) : CommonRepository(commentDao) { + override fun save(entity: S): S { + return saveAndFlush(entity) + } + + override fun saveAll(entities: Iterable): List { + return saveAllAndFlush(entities) + } + + fun findAllByUserId(userId: Long): List { + return findAll { root, _, builder -> + builder.equal(root.get(CommentEntity_.userId), userId) + } + } + fun findByContent( - contentId: Long, + contentId: String, contentType: ContentType - ): List { + ): List { return findAll(createContentSpecification(contentId, contentType)) } private fun createContentSpecification( - contentId: Long, + contentId: String, contentType: ContentType - ): Specification = Specification { root, query, criteriaBuilder -> + ): Specification = Specification { root, query, criteriaBuilder -> criteriaBuilder.and( - criteriaBuilder.equal(root.get(CommentDo_.commentOnId), contentId), - criteriaBuilder.equal(root.get(CommentDo_.commentOnType), contentType) + criteriaBuilder.equal(root.get(CommentEntity_.commentOnId), contentId), + criteriaBuilder.equal(root.get(CommentEntity_.commentOnType), contentType) ) } -} \ No newline at end of file +} diff --git a/lampray-content/comment-service/src/main/java/tech/lamprism/lampray/content/comment/service/CommentContentProvider.kt b/lampray-content/comment-service/src/main/java/tech/lamprism/lampray/content/comment/service/CommentContentProvider.kt index 06205416..1453fb3e 100644 --- a/lampray-content/comment-service/src/main/java/tech/lamprism/lampray/content/comment/service/CommentContentProvider.kt +++ b/lampray-content/comment-service/src/main/java/tech/lamprism/lampray/content/comment/service/CommentContentProvider.kt @@ -1,5 +1,5 @@ /* - * Copyright (C) 2023-2025 RollW + * Copyright (C) 2023-2026 RollW * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -23,7 +23,7 @@ import tech.lamprism.lampray.content.ContentProvider import tech.lamprism.lampray.content.ContentTrait import tech.lamprism.lampray.content.ContentType import tech.lamprism.lampray.content.comment.Comment -import tech.lamprism.lampray.content.comment.persistence.CommentDo.Companion.toDo +import tech.lamprism.lampray.content.comment.persistence.CommentEntity.Companion.toEntity import tech.lamprism.lampray.content.comment.persistence.CommentRepository import tech.lamprism.lampray.content.common.ContentErrorCode import tech.lamprism.lampray.content.common.ContentException @@ -65,6 +65,6 @@ class CommentContentProvider( } override fun updateComment(comment: Comment) { - commentRepository.save(comment.toDo()) + commentRepository.save(comment.toEntity()) } -} \ No newline at end of file +} diff --git a/lampray-content/comment-service/src/main/java/tech/lamprism/lampray/content/comment/service/CommentService.java b/lampray-content/comment-service/src/main/java/tech/lamprism/lampray/content/comment/service/CommentService.java index 3d445f58..16ccecd9 100644 --- a/lampray-content/comment-service/src/main/java/tech/lamprism/lampray/content/comment/service/CommentService.java +++ b/lampray-content/comment-service/src/main/java/tech/lamprism/lampray/content/comment/service/CommentService.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2023-2025 RollW + * Copyright (C) 2023-2026 RollW * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,7 +18,8 @@ import org.springframework.stereotype.Service; import space.lingu.NonNull; -import tech.lamprism.lampray.content.Content; +import space.lingu.Nullable; +import tech.lamprism.lampray.common.data.ResourceIdGenerator; import tech.lamprism.lampray.content.ContentDetails; import tech.lamprism.lampray.content.ContentDetailsMetadata; import tech.lamprism.lampray.content.ContentIdentity; @@ -34,7 +35,7 @@ import tech.lamprism.lampray.content.comment.Comment; import tech.lamprism.lampray.content.comment.CommentDetailsMetadata; import tech.lamprism.lampray.content.comment.CommentStatus; -import tech.lamprism.lampray.content.comment.persistence.CommentDo; +import tech.lamprism.lampray.content.comment.persistence.CommentEntity; import tech.lamprism.lampray.content.comment.persistence.CommentRepository; import tech.lamprism.lampray.content.common.ContentErrorCode; import tech.lamprism.lampray.content.common.ContentException; @@ -51,11 +52,14 @@ public class CommentService implements ContentPublisher, ContentCollectionProvider { private final CommentRepository commentRepository; private final ContentMetadataService contentMetadataService; + private final ResourceIdGenerator resourceIdGenerator; public CommentService(CommentRepository commentRepository, - ContentMetadataService contentMetadataService) { + ContentMetadataService contentMetadataService, + ResourceIdGenerator resourceIdGenerator) { this.commentRepository = commentRepository; this.contentMetadataService = contentMetadataService; + this.resourceIdGenerator = resourceIdGenerator; } @Override @@ -74,10 +78,11 @@ public ContentDetails publish(@NonNull UncreatedContent uncreatedContent, commentDetailsMetadata.contentType() ); checkCommentOnContent(commentOn, operator); - long parentId = checkParentId(commentDetailsMetadata.parentId(), operator); + String parentId = checkParentId(commentDetailsMetadata.parentId(), operator); - CommentDo comment = CommentDo + CommentEntity comment = CommentEntity .builder() + .setResourceId(resourceIdGenerator.nextId(ContentType.COMMENT.getSystemResourceKind())) .setUserId(operator.getUserId()) .setParentId(parentId) .setContent(uncreatedContent.getContent()) @@ -107,26 +112,22 @@ private void checkCommentOnContent( throw new ContentException(ContentErrorCode.ERROR_CONTENT_NOT_FOUND); } - private long checkParentId(Long parentId, UserIdentity operator) { - if (parentId == null || parentId == Comment.COMMENT_ROOT_ID) { + private String checkParentId(@Nullable String parentId, UserIdentity operator) { + if (parentId == null || Comment.COMMENT_ROOT_ID.equals(parentId)) { return Comment.COMMENT_ROOT_ID; } - if (parentId < 0) { - throw new IllegalArgumentException("Parent id must be greater than 0"); - } - CommentDo comment = commentRepository.findById(parentId).orElseThrow( + commentRepository.findById(parentId).orElseThrow( () -> new ContentException(ContentErrorCode.ERROR_CONTENT_NOT_FOUND) ); ContentMetadata metadata = contentMetadataService.getMetadata( new SimpleContentIdentity(parentId, ContentType.COMMENT)); - if (!checkCanCommentOn(comment, metadata, operator)) { + if (!checkCanCommentOn(metadata, operator)) { throw new ContentException(ContentErrorCode.ERROR_CONTENT_NOT_FOUND); } return parentId; } private boolean checkCanCommentOn( - Content content, ContentMetadata contentMetadata, UserIdentity operator) { if (contentMetadata.getContentStatus() != ContentStatus.PUBLISHED) { @@ -149,12 +150,12 @@ public List getContents( ContentCollectionIdentity contentCollectionIdentity) { return getCommentsBy(contentCollectionIdentity) .stream() - .map(CommentDo::lock) + .map(CommentEntity::lock) .toList(); } @NonNull - public List getCommentsBy( + public List getCommentsBy( ContentCollectionIdentity contentCollectionIdentity) { return switch (contentCollectionIdentity.getContentCollectionType()) { case COMMENTS -> commentRepository.findAll(); @@ -162,6 +163,9 @@ public List getCommentsBy( contentCollectionIdentity.getContentCollectionId(), ContentType.ARTICLE ); + case USER_COMMENTS -> commentRepository.findAllByUserId( + Long.parseLong(contentCollectionIdentity.getContentCollectionId()) + ); default -> throw new UnsupportedOperationException("Unsupported collection type: " + contentCollectionIdentity.getContentCollectionType()); }; @@ -170,7 +174,7 @@ public List getCommentsBy( @Override public boolean supportsCollection(@NonNull ContentCollectionType contentCollectionType) { return switch (contentCollectionType) { - case COMMENTS, ARTICLE_COMMENTS -> true; + case COMMENTS, ARTICLE_COMMENTS, USER_COMMENTS -> true; default -> false; }; } diff --git a/lampray-content/content-api/src/main/java/tech/lamprism/lampray/content/Content.java b/lampray-content/content-api/src/main/java/tech/lamprism/lampray/content/Content.java index c0779ec6..049a6597 100644 --- a/lampray-content/content-api/src/main/java/tech/lamprism/lampray/content/Content.java +++ b/lampray-content/content-api/src/main/java/tech/lamprism/lampray/content/Content.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2023 RollW + * Copyright (C) 2023-2026 RollW * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -37,7 +37,7 @@ public interface Content extends ContentIdentity { * @return content id */ @Override - long getContentId(); + String getContentId(); /** * Get the type of the content. @@ -48,7 +48,7 @@ public interface Content extends ContentIdentity { @Override ContentType getContentType(); - static Content of(long userId, long contentId, + static Content of(long userId, @NonNull String contentId, @NonNull ContentType contentType) { return new SimpleContentInfo(userId, contentId, contentType); } diff --git a/lampray-content/content-api/src/main/java/tech/lamprism/lampray/content/ContentDetails.java b/lampray-content/content-api/src/main/java/tech/lamprism/lampray/content/ContentDetails.java index 35696115..97823dbf 100644 --- a/lampray-content/content-api/src/main/java/tech/lamprism/lampray/content/ContentDetails.java +++ b/lampray-content/content-api/src/main/java/tech/lamprism/lampray/content/ContentDetails.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2023 RollW + * Copyright (C) 2023-2026 RollW * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -31,7 +31,7 @@ public interface ContentDetails extends Content, TimeAttributed { * @inheritDoc */ @Override - long getContentId(); + String getContentId(); /** * @inheritDoc diff --git a/lampray-content/content-api/src/main/java/tech/lamprism/lampray/content/ContentIdentity.java b/lampray-content/content-api/src/main/java/tech/lamprism/lampray/content/ContentIdentity.java index ff043a93..ab1f03f4 100644 --- a/lampray-content/content-api/src/main/java/tech/lamprism/lampray/content/ContentIdentity.java +++ b/lampray-content/content-api/src/main/java/tech/lamprism/lampray/content/ContentIdentity.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2023 RollW + * Copyright (C) 2023-2026 RollW * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -25,16 +25,16 @@ /** * @author RollW */ -public interface ContentIdentity extends ContentTrait, SystemResource, Serializable { +public interface ContentIdentity extends ContentTrait, SystemResource, Serializable { @Override - long getContentId(); + String getContentId(); @Override ContentType getContentType(); @Override @NonNull - default Long getResourceId() { + default String getResourceId() { return getContentId(); } @@ -44,7 +44,7 @@ default SystemResourceKind getSystemResourceKind() { return getContentType().getSystemResourceKind(); } - static ContentIdentity of(long contentId, @NonNull ContentType contentType) { + static ContentIdentity of(@NonNull String contentId, @NonNull ContentType contentType) { return new SimpleContentIdentity(contentId, contentType); } } diff --git a/lampray-content/content-api/src/main/java/tech/lamprism/lampray/content/ContentMetadata.java b/lampray-content/content-api/src/main/java/tech/lamprism/lampray/content/ContentMetadata.java index cb98f800..01f63034 100644 --- a/lampray-content/content-api/src/main/java/tech/lamprism/lampray/content/ContentMetadata.java +++ b/lampray-content/content-api/src/main/java/tech/lamprism/lampray/content/ContentMetadata.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2023 RollW + * Copyright (C) 2023-2026 RollW * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,7 +18,7 @@ import space.lingu.NonNull; import tech.lamprism.lampray.DataEntity; -import tech.lamprism.lampray.LongEntityBuilder; +import tech.lamprism.lampray.EntityBuilder; import tech.rollw.common.web.system.SystemResourceKind; import java.time.OffsetDateTime; @@ -28,10 +28,9 @@ */ @SuppressWarnings({"ClassCanBeRecord"}) public class ContentMetadata implements DataEntity, ContentTrait { - // only maintains the metadata of the content. private final Long id; private final long userId; - private final long contentId; + private final String contentId; @NonNull private final ContentType contentType; @@ -43,7 +42,7 @@ public class ContentMetadata implements DataEntity, ContentTrait { private final ContentAccessAuthType contentAccessAuthType; public ContentMetadata(Long id, long userId, - long contentId, + @NonNull String contentId, @NonNull ContentType contentType, @NonNull ContentStatus contentStatus, @NonNull ContentAccessAuthType contentAccessAuthType) { @@ -58,6 +57,9 @@ public ContentMetadata(Long id, long userId, @SuppressWarnings("all") private void checkForNull() { + if (contentId == null) { + throw new NullPointerException("contentId is null"); + } if (contentType == null) { throw new NullPointerException("contentType is null"); } @@ -69,27 +71,21 @@ private void checkForNull() { } } + public Long getId() { + return id; + } + @Override public Long getEntityId() { return id; } - /** - * ContentMetadata does not have create time. - * - * @return {@code NONE_TIME} only. - */ @NonNull @Override public OffsetDateTime getCreateTime() { return NONE_TIME; } - /** - * ContentMetadata does not have update time. - * - * @return {@code NONE_TIME} only. - */ @NonNull @Override public OffsetDateTime getUpdateTime() { @@ -101,7 +97,7 @@ public long getUserId() { } @Override - public long getContentId() { + public String getContentId() { return contentId; } @@ -135,10 +131,10 @@ public SystemResourceKind getSystemResourceKind() { return ContentMetadataResourceKind.INSTANCE; } - public static class Builder implements LongEntityBuilder { + public static class Builder implements EntityBuilder { private Long id; private long userId; - private long contentId; + private String contentId; private ContentType contentType; private ContentStatus contentStatus; private ContentAccessAuthType contentAccessAuthType; @@ -157,6 +153,10 @@ public Builder(ContentMetadata contentMetadata) { @Override public Builder setEntityId(Long id) { + return setId(id); + } + + public Builder setId(Long id) { this.id = id; return this; } @@ -166,7 +166,7 @@ public Builder setUserId(long userId) { return this; } - public Builder setContentId(long contentId) { + public Builder setContentId(@NonNull String contentId) { this.contentId = contentId; return this; } diff --git a/lampray-content/content-api/src/main/java/tech/lamprism/lampray/content/ContentMetadataDetails.java b/lampray-content/content-api/src/main/java/tech/lamprism/lampray/content/ContentMetadataDetails.java index a2e87359..f339038b 100644 --- a/lampray-content/content-api/src/main/java/tech/lamprism/lampray/content/ContentMetadataDetails.java +++ b/lampray-content/content-api/src/main/java/tech/lamprism/lampray/content/ContentMetadataDetails.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2023 RollW + * Copyright (C) 2023-2026 RollW * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -53,7 +53,7 @@ public long getUserId() { } @Override - public long getContentId() { + public String getContentId() { return contentMetadata.getContentId(); } diff --git a/lampray-content/content-api/src/main/java/tech/lamprism/lampray/content/ContentOperator.java b/lampray-content/content-api/src/main/java/tech/lamprism/lampray/content/ContentOperator.java index ce8a4bbb..2c45a390 100644 --- a/lampray-content/content-api/src/main/java/tech/lamprism/lampray/content/ContentOperator.java +++ b/lampray-content/content-api/src/main/java/tech/lamprism/lampray/content/ContentOperator.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2023 RollW + * Copyright (C) 2023-2026 RollW * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -25,7 +25,7 @@ /** * @author RollW */ -public interface ContentOperator extends SystemResourceOperator, ContentDetails { +public interface ContentOperator extends SystemResourceOperator, ContentDetails { @Override ContentOperator update() throws CommonRuntimeException; @@ -68,7 +68,7 @@ default ContentOperator getSystemResource() { @NonNull @Override - default Long getResourceId() { + default String getResourceId() { return getContentId(); } diff --git a/lampray-content/content-api/src/main/java/tech/lamprism/lampray/content/ContentTrait.java b/lampray-content/content-api/src/main/java/tech/lamprism/lampray/content/ContentTrait.java index 57ed1631..8a2519b7 100644 --- a/lampray-content/content-api/src/main/java/tech/lamprism/lampray/content/ContentTrait.java +++ b/lampray-content/content-api/src/main/java/tech/lamprism/lampray/content/ContentTrait.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2023 RollW + * Copyright (C) 2023-2026 RollW * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -22,7 +22,7 @@ * @author RollW */ public interface ContentTrait { - long getContentId(); + String getContentId(); ContentType getContentType(); } diff --git a/lampray-content/content-api/src/main/java/tech/lamprism/lampray/content/SimpleContentDetails.java b/lampray-content/content-api/src/main/java/tech/lamprism/lampray/content/SimpleContentDetails.java index 881640b2..74455839 100644 --- a/lampray-content/content-api/src/main/java/tech/lamprism/lampray/content/SimpleContentDetails.java +++ b/lampray-content/content-api/src/main/java/tech/lamprism/lampray/content/SimpleContentDetails.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2023 RollW + * Copyright (C) 2023-2026 RollW * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -26,7 +26,7 @@ * @author RollW */ public record SimpleContentDetails( - long contentId, + @NonNull String contentId, @NonNull ContentType contentType, long userId, @Nullable String title, @@ -36,7 +36,7 @@ public record SimpleContentDetails( @Nullable ContentDetailsMetadata contentDetailsMetadata ) implements ContentDetails { @Override - public long getContentId() { + public String getContentId() { return contentId; } diff --git a/lampray-content/content-api/src/main/java/tech/lamprism/lampray/content/SimpleContentIdentity.java b/lampray-content/content-api/src/main/java/tech/lamprism/lampray/content/SimpleContentIdentity.java index b5a799eb..05e247e3 100644 --- a/lampray-content/content-api/src/main/java/tech/lamprism/lampray/content/SimpleContentIdentity.java +++ b/lampray-content/content-api/src/main/java/tech/lamprism/lampray/content/SimpleContentIdentity.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2023 RollW + * Copyright (C) 2023-2026 RollW * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -22,11 +22,11 @@ * @author RollW */ public record SimpleContentIdentity( - long contentId, + @NonNull String contentId, @NonNull ContentType contentType ) implements ContentIdentity { @Override - public long getContentId() { + public String getContentId() { return contentId; } diff --git a/lampray-content/content-api/src/main/java/tech/lamprism/lampray/content/SimpleContentInfo.java b/lampray-content/content-api/src/main/java/tech/lamprism/lampray/content/SimpleContentInfo.java index 72556f6e..8535609d 100644 --- a/lampray-content/content-api/src/main/java/tech/lamprism/lampray/content/SimpleContentInfo.java +++ b/lampray-content/content-api/src/main/java/tech/lamprism/lampray/content/SimpleContentInfo.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2023 RollW + * Copyright (C) 2023-2026 RollW * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -23,7 +23,7 @@ */ public record SimpleContentInfo( long userId, - long contentId, + @NonNull String contentId, ContentType contentType ) implements Content { @@ -39,7 +39,7 @@ public long getUserId() { } @Override - public long getContentId() { + public String getContentId() { return contentId; } diff --git a/lampray-content/content-api/src/main/java/tech/lamprism/lampray/content/collection/ContentCollection.java b/lampray-content/content-api/src/main/java/tech/lamprism/lampray/content/collection/ContentCollection.java index f72f6649..f21fc84d 100644 --- a/lampray-content/content-api/src/main/java/tech/lamprism/lampray/content/collection/ContentCollection.java +++ b/lampray-content/content-api/src/main/java/tech/lamprism/lampray/content/collection/ContentCollection.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2023 RollW + * Copyright (C) 2023-2026 RollW * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -24,7 +24,7 @@ public interface ContentCollection extends ContentCollectionIdentity { long getUserId(); - long getContentCollectionId(); + String getContentCollectionId(); ContentCollectionType getContentCollectionType(); } diff --git a/lampray-content/content-api/src/main/java/tech/lamprism/lampray/content/collection/ContentCollectionDetails.java b/lampray-content/content-api/src/main/java/tech/lamprism/lampray/content/collection/ContentCollectionDetails.java index 12028171..de4ee444 100644 --- a/lampray-content/content-api/src/main/java/tech/lamprism/lampray/content/collection/ContentCollectionDetails.java +++ b/lampray-content/content-api/src/main/java/tech/lamprism/lampray/content/collection/ContentCollectionDetails.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2023 RollW + * Copyright (C) 2023-2026 RollW * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -69,7 +69,7 @@ public long getUserId() { } @Override - public long getContentId() { + public String getContentId() { return contentMetadata.getContentId(); } diff --git a/lampray-content/content-api/src/main/java/tech/lamprism/lampray/content/collection/ContentCollectionIdentity.java b/lampray-content/content-api/src/main/java/tech/lamprism/lampray/content/collection/ContentCollectionIdentity.java index cb32efa8..c3264fec 100644 --- a/lampray-content/content-api/src/main/java/tech/lamprism/lampray/content/collection/ContentCollectionIdentity.java +++ b/lampray-content/content-api/src/main/java/tech/lamprism/lampray/content/collection/ContentCollectionIdentity.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2023 RollW + * Copyright (C) 2023-2026 RollW * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,12 +20,12 @@ * @author RollW */ public interface ContentCollectionIdentity { - long getContentCollectionId(); + String getContentCollectionId(); ContentCollectionType getContentCollectionType(); static ContentCollectionIdentity of( - long contentCollectionId, + String contentCollectionId, ContentCollectionType contentCollectionType) { return SimpleContentCollectionIdentity.of( contentCollectionId, diff --git a/lampray-content/content-api/src/main/java/tech/lamprism/lampray/content/collection/ContentCollectionMetadata.java b/lampray-content/content-api/src/main/java/tech/lamprism/lampray/content/collection/ContentCollectionMetadata.java index 92cfe5cd..6542468c 100644 --- a/lampray-content/content-api/src/main/java/tech/lamprism/lampray/content/collection/ContentCollectionMetadata.java +++ b/lampray-content/content-api/src/main/java/tech/lamprism/lampray/content/collection/ContentCollectionMetadata.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2023 RollW + * Copyright (C) 2023-2026 RollW * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -43,7 +43,7 @@ public class ContentCollectionMetadata implements DataEntity { private final ContentCollectionType type; - private final long contentId; + private final String contentId; @Nullable private final ContentType contentType; @@ -54,7 +54,7 @@ public class ContentCollectionMetadata implements DataEntity { public ContentCollectionMetadata(@Nullable Long id, long collectionId, ContentCollectionType type, - long contentId, + String contentId, @Nullable ContentType contentType, @Nullable Integer order) { this.id = id; @@ -91,7 +91,7 @@ public ContentCollectionType getType() { return type; } - public long getContentId() { + public String getContentId() { return contentId; } @@ -144,7 +144,7 @@ public static final class Builder implements LongEntityBuilder { +public class FavoriteGroup implements DataEntity { private final Long id; + private final String resourceId; private final String name; private final long userId; private final FavoriteGroupType type; - private final boolean isPublic; // add 'is' to avoid conflict with keyword + private final boolean isPublic; private final String description; private final String icon; private final OffsetDateTime createTime; private final OffsetDateTime updateTime; private final boolean deleted; - public FavoriteGroup(Long id, String name, long userId, FavoriteGroupType type, + public FavoriteGroup(Long id, String resourceId, String name, long userId, FavoriteGroupType type, boolean isPublic, String description, String icon, OffsetDateTime createTime, OffsetDateTime updateTime, boolean deleted) { this.id = id; + this.resourceId = resourceId; this.name = name; this.userId = userId; this.type = type; @@ -54,11 +56,15 @@ public FavoriteGroup(Long id, String name, long userId, FavoriteGroupType type, this.deleted = deleted; } - @Override - public Long getEntityId() { + public Long getId() { return id; } + @Override + public String getEntityId() { + return resourceId; + } + public String getName() { return name; } @@ -113,8 +119,9 @@ public static Builder builder() { return new Builder(); } - public final static class Builder implements LongEntityBuilder { + public static final class Builder implements EntityBuilder { private Long id; + private String resourceId; private String name; private long userId; private FavoriteGroupType type; @@ -130,6 +137,7 @@ public Builder() { public Builder(FavoriteGroup favoriteGroup) { this.id = favoriteGroup.id; + this.resourceId = favoriteGroup.resourceId; this.name = favoriteGroup.name; this.userId = favoriteGroup.userId; this.type = favoriteGroup.type; @@ -142,11 +150,20 @@ public Builder(FavoriteGroup favoriteGroup) { } @Override - public Builder setEntityId(Long id) { + public Builder setEntityId(String id) { + return setResourceId(id); + } + + public Builder setId(Long id) { this.id = id; return this; } + public Builder setResourceId(String resourceId) { + this.resourceId = resourceId; + return this; + } + public Builder setName(String name) { this.name = name; return this; @@ -194,7 +211,7 @@ public Builder setDeleted(boolean deleted) { @Override public FavoriteGroup build() { - return new FavoriteGroup(id, name, userId, type, isPublic, description, + return new FavoriteGroup(id, resourceId, name, userId, type, isPublic, description, icon, createTime, updateTime, deleted); } } diff --git a/lampray-content/content-api/src/main/java/tech/lamprism/lampray/content/favorite/FavoriteGroupOperator.java b/lampray-content/content-api/src/main/java/tech/lamprism/lampray/content/favorite/FavoriteGroupOperator.java index 5b1adbc6..8799c965 100644 --- a/lampray-content/content-api/src/main/java/tech/lamprism/lampray/content/favorite/FavoriteGroupOperator.java +++ b/lampray-content/content-api/src/main/java/tech/lamprism/lampray/content/favorite/FavoriteGroupOperator.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2023-2025 RollW + * Copyright (C) 2023-2026 RollW * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -26,7 +26,7 @@ /** * @author RollW */ -public interface FavoriteGroupOperator extends SystemResourceOperator, SystemResource { +public interface FavoriteGroupOperator extends SystemResourceOperator, SystemResource { @Override void setCheckDeleted(boolean checkDeleted); @@ -56,7 +56,7 @@ public interface FavoriteGroupOperator extends SystemResourceOperator, Sys FavoriteGroup getFavoriteGroup(); @Override - default Long getResourceId() { + default String getResourceId() { return getFavoriteGroup().getEntityId(); } diff --git a/lampray-content/content-api/src/main/java/tech/lamprism/lampray/content/favorite/FavoriteItem.java b/lampray-content/content-api/src/main/java/tech/lamprism/lampray/content/favorite/FavoriteItem.java index 4624f659..d66e4f44 100644 --- a/lampray-content/content-api/src/main/java/tech/lamprism/lampray/content/favorite/FavoriteItem.java +++ b/lampray-content/content-api/src/main/java/tech/lamprism/lampray/content/favorite/FavoriteItem.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2023-2025 RollW + * Copyright (C) 2023-2026 RollW * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,7 +18,7 @@ import space.lingu.NonNull; import tech.lamprism.lampray.DataEntity; -import tech.lamprism.lampray.LongEntityBuilder; +import tech.lamprism.lampray.EntityBuilder; import tech.lamprism.lampray.content.ContentAssociated; import tech.lamprism.lampray.content.ContentIdentity; import tech.lamprism.lampray.content.ContentType; @@ -29,22 +29,24 @@ /** * @author RollW */ -public class FavoriteItem implements DataEntity, ContentAssociated { +public class FavoriteItem implements DataEntity, ContentAssociated { private final Long id; - private final long groupId; + private final String resourceId; + private final String groupId; private final long userId; - private final long contentId; + private final String contentId; private final ContentType contentType; private final OffsetDateTime createTime; private final OffsetDateTime updateTime; private final boolean deleted; private final ContentIdentity associatedContent; - public FavoriteItem(Long id, long groupId, long userId, - long contentId, ContentType contentType, + public FavoriteItem(Long id, String resourceId, String groupId, long userId, + String contentId, ContentType contentType, OffsetDateTime createTime, OffsetDateTime updateTime, boolean deleted) { this.id = id; + this.resourceId = resourceId; this.groupId = groupId; this.userId = userId; this.contentId = contentId; @@ -55,12 +57,16 @@ public FavoriteItem(Long id, long groupId, long userId, this.associatedContent = ContentIdentity.of(contentId, contentType); } - @Override - public Long getEntityId() { + public Long getId() { return id; } - public long getGroupId() { + @Override + public String getEntityId() { + return resourceId; + } + + public String getGroupId() { return groupId; } @@ -68,7 +74,7 @@ public long getUserId() { return userId; } - public long getContentId() { + public String getContentId() { return contentId; } @@ -111,11 +117,12 @@ public static Builder builder() { return new Builder(); } - public static final class Builder implements LongEntityBuilder { + public static final class Builder implements EntityBuilder { private Long id; - private long groupId; + private String resourceId; + private String groupId; private long userId; - private long contentId; + private String contentId; private ContentType contentType; private OffsetDateTime createTime; private OffsetDateTime updateTime; @@ -124,24 +131,34 @@ public static final class Builder implements LongEntityBuilder { private Builder() { } - private Builder(FavoriteItem favoriteitem) { - this.id = favoriteitem.id; - this.groupId = favoriteitem.groupId; - this.userId = favoriteitem.userId; - this.contentId = favoriteitem.contentId; - this.contentType = favoriteitem.contentType; - this.createTime = favoriteitem.createTime; - this.updateTime = favoriteitem.updateTime; - this.deleted = favoriteitem.deleted; + private Builder(FavoriteItem favoriteItem) { + this.id = favoriteItem.id; + this.resourceId = favoriteItem.resourceId; + this.groupId = favoriteItem.groupId; + this.userId = favoriteItem.userId; + this.contentId = favoriteItem.contentId; + this.contentType = favoriteItem.contentType; + this.createTime = favoriteItem.createTime; + this.updateTime = favoriteItem.updateTime; + this.deleted = favoriteItem.deleted; } @Override - public Builder setEntityId(Long id) { + public Builder setEntityId(String id) { + return setResourceId(id); + } + + public Builder setId(Long id) { this.id = id; return this; } - public Builder setGroupId(long groupId) { + public Builder setResourceId(String resourceId) { + this.resourceId = resourceId; + return this; + } + + public Builder setGroupId(String groupId) { this.groupId = groupId; return this; } @@ -151,7 +168,7 @@ public Builder setUserId(long userId) { return this; } - public Builder setContentId(long contentId) { + public Builder setContentId(String contentId) { this.contentId = contentId; return this; } @@ -176,9 +193,10 @@ public Builder setDeleted(boolean deleted) { return this; } + @Override public FavoriteItem build() { - return new FavoriteItem(id, groupId, userId, contentId, + return new FavoriteItem(id, resourceId, groupId, userId, contentId, contentType, createTime, updateTime, deleted); } } -} \ No newline at end of file +} diff --git a/lampray-content/content-api/src/main/java/tech/lamprism/lampray/content/favorite/FavoriteProvider.java b/lampray-content/content-api/src/main/java/tech/lamprism/lampray/content/favorite/FavoriteProvider.java index 9ffc71ed..6bb82adf 100644 --- a/lampray-content/content-api/src/main/java/tech/lamprism/lampray/content/favorite/FavoriteProvider.java +++ b/lampray-content/content-api/src/main/java/tech/lamprism/lampray/content/favorite/FavoriteProvider.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2023-2025 RollW + * Copyright (C) 2023-2026 RollW * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -28,9 +28,9 @@ public interface FavoriteProvider { List getFavoriteGroups(UserIdentity userIdentity); - List getFavoriteItems(long favoriteGroupId); + List getFavoriteItems(String favoriteGroupId); - FavoriteGroup getFavoriteGroup(long favoriteGroupId); + FavoriteGroup getFavoriteGroup(String favoriteGroupId); - FavoriteItem getFavoriteItem(long favoriteItemId); + FavoriteItem getFavoriteItem(String favoriteItemId); } diff --git a/lampray-content/content-api/src/main/java/tech/lamprism/lampray/content/service/AbstractContentOperator.java b/lampray-content/content-api/src/main/java/tech/lamprism/lampray/content/service/AbstractContentOperator.java index ffab1d55..b9bb075a 100644 --- a/lampray-content/content-api/src/main/java/tech/lamprism/lampray/content/service/AbstractContentOperator.java +++ b/lampray-content/content-api/src/main/java/tech/lamprism/lampray/content/service/AbstractContentOperator.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2023 RollW + * Copyright (C) 2023-2026 RollW * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -67,7 +67,7 @@ public final OffsetDateTime getUpdateTime() { } @Override - public final long getContentId() { + public final String getContentId() { return content.getContentId(); } diff --git a/lampray-content/content-api/src/main/java/tech/lamprism/lampray/content/service/ContentProvideService.java b/lampray-content/content-api/src/main/java/tech/lamprism/lampray/content/service/ContentProvideService.java index 360af7f0..d294116b 100644 --- a/lampray-content/content-api/src/main/java/tech/lamprism/lampray/content/service/ContentProvideService.java +++ b/lampray-content/content-api/src/main/java/tech/lamprism/lampray/content/service/ContentProvideService.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2023 RollW + * Copyright (C) 2023-2026 RollW * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -37,8 +37,8 @@ * @author RollW */ @Service -public class ContentProvideService implements SystemResourceProvider, - SystemResourceOperatorFactory, ContentProviderFactory { +public class ContentProvideService implements SystemResourceProvider, + SystemResourceOperatorFactory, ContentProviderFactory { private final List contentProviders; public ContentProvideService(List contentProviders) { @@ -52,8 +52,8 @@ public boolean supports(@NonNull SystemResourceKind systemResourceKind) { @NonNull @Override - public SystemResourceOperator createResourceOperator( - SystemResource systemResource, + public SystemResourceOperator createResourceOperator( + SystemResource systemResource, boolean checkDelete) { ContentType contentType = ContentType.from(systemResource.getSystemResourceKind()); if (contentType == null) { @@ -67,7 +67,7 @@ public SystemResourceOperator createResourceOperator( @NonNull @Override - public ContentDetails provide(@NonNull Long resourceId, + public ContentDetails provide(@NonNull String resourceId, @NonNull SystemResourceKind systemResourceKind) throws CommonRuntimeException, UnsupportedKindException { ContentType contentType = ContentType.from(systemResourceKind); @@ -82,7 +82,7 @@ public ContentDetails provide(@NonNull Long resourceId, @NonNull @Override - public ContentDetails provide(@NonNull SystemResource rawSystemResource) + public ContentDetails provide(@NonNull SystemResource rawSystemResource) throws CommonRuntimeException, UnsupportedKindException { if (rawSystemResource instanceof ContentDetails contentDetails) { return contentDetails; diff --git a/lampray-content/content-service/src/main/java/tech/lamprism/lampray/content/favorite/persistence/FavoriteGroupDao.kt b/lampray-content/content-service/src/main/java/tech/lamprism/lampray/content/favorite/persistence/FavoriteGroupDao.kt index a968ab62..043d68cc 100644 --- a/lampray-content/content-service/src/main/java/tech/lamprism/lampray/content/favorite/persistence/FavoriteGroupDao.kt +++ b/lampray-content/content-service/src/main/java/tech/lamprism/lampray/content/favorite/persistence/FavoriteGroupDao.kt @@ -1,5 +1,5 @@ /* - * Copyright (C) 2023-2025 RollW + * Copyright (C) 2023-2026 RollW * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -23,5 +23,5 @@ import tech.lamprism.lampray.common.data.Dao * @author RollW */ @Dao -interface FavoriteGroupDao : CommonDao { -} \ No newline at end of file +interface FavoriteGroupDao : CommonDao { +} diff --git a/lampray-content/content-service/src/main/java/tech/lamprism/lampray/content/favorite/persistence/FavoriteGroupDo.kt b/lampray-content/content-service/src/main/java/tech/lamprism/lampray/content/favorite/persistence/FavoriteGroupEntity.kt similarity index 72% rename from lampray-content/content-service/src/main/java/tech/lamprism/lampray/content/favorite/persistence/FavoriteGroupDo.kt rename to lampray-content/content-service/src/main/java/tech/lamprism/lampray/content/favorite/persistence/FavoriteGroupEntity.kt index 4c076e04..66cccf7b 100644 --- a/lampray-content/content-service/src/main/java/tech/lamprism/lampray/content/favorite/persistence/FavoriteGroupDo.kt +++ b/lampray-content/content-service/src/main/java/tech/lamprism/lampray/content/favorite/persistence/FavoriteGroupEntity.kt @@ -1,5 +1,5 @@ /* - * Copyright (C) 2023-2025 RollW + * Copyright (C) 2023-2026 RollW * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,15 +20,12 @@ import jakarta.persistence.Column import jakarta.persistence.Entity import jakarta.persistence.EnumType import jakarta.persistence.Enumerated -import jakarta.persistence.GeneratedValue -import jakarta.persistence.GenerationType import jakarta.persistence.Id import jakarta.persistence.Lob import jakarta.persistence.Table -import jakarta.persistence.Temporal -import jakarta.persistence.TemporalType +import org.hibernate.annotations.Generated import org.hibernate.annotations.JdbcTypeCode -import org.hibernate.proxy.HibernateProxy +import org.hibernate.generator.EventType import org.hibernate.type.SqlTypes import tech.lamprism.lampray.DataEntity import tech.lamprism.lampray.content.favorite.FavoriteGroup @@ -41,12 +38,15 @@ import java.time.OffsetDateTime */ @Entity @Table(name = "favorite_group") -class FavoriteGroupDo( - @Id - @Column(name = "id", nullable = false) - @GeneratedValue(strategy = GenerationType.IDENTITY) +class FavoriteGroupEntity( + @Column(name = "id", nullable = false, insertable = false, updatable = false) + @Generated(event = [EventType.INSERT]) private var id: Long? = null, + @Id + @Column(name = "resource_id", nullable = false, length = 64, unique = true) + private var resourceId: String, + @Column(name = "name", nullable = false) var name: String = "", @@ -68,18 +68,18 @@ class FavoriteGroupDo( @Column(name = "icon", nullable = false) private var icon: String = "", - @Temporal(TemporalType.TIMESTAMP) @Column(name = "create_time", nullable = false) private var createTime: OffsetDateTime = OffsetDateTime.now(), - @Temporal(TemporalType.TIMESTAMP) @Column(name = "update_time", nullable = false) private var updateTime: OffsetDateTime = OffsetDateTime.now(), @Column(name = "deleted", nullable = false) var deleted: Boolean = false -) : DataEntity { - override fun getEntityId(): Long = id!! +) : DataEntity { + override fun getEntityId(): String = resourceId + + fun getId(): Long? = id override fun getSystemResourceKind() = FavoriteGroupResourceKind @@ -87,13 +87,10 @@ class FavoriteGroupDo( override fun getUpdateTime(): OffsetDateTime = updateTime - fun setId(id: Long) { - this.id = id - } - fun lock(): FavoriteGroup = FavoriteGroup( id, + resourceId, name, userId, type, @@ -109,6 +106,7 @@ class FavoriteGroupDo( class Builder { private var id: Long? = null + private var resourceId: String? = null private var name: String = "" private var userId: Long = 0L private var type: FavoriteGroupType = FavoriteGroupType.USER @@ -121,8 +119,9 @@ class FavoriteGroupDo( constructor() - constructor(favoriteGroup: FavoriteGroupDo) { + constructor(favoriteGroup: FavoriteGroupEntity) { this.id = favoriteGroup.id + this.resourceId = favoriteGroup.resourceId this.name = favoriteGroup.name this.userId = favoriteGroup.userId this.type = favoriteGroup.type @@ -138,6 +137,10 @@ class FavoriteGroupDo( this.id = id } + fun setResourceId(resourceId: String) = apply { + this.resourceId = resourceId + } + fun setName(name: String) = apply { this.name = name } @@ -174,17 +177,18 @@ class FavoriteGroupDo( this.deleted = deleted } - fun build() = FavoriteGroupDo( - id, - name, - userId, - type, - isPublic, - description, - icon, - createTime, - updateTime, - deleted + fun build() = FavoriteGroupEntity( + id = id, + resourceId = resourceId!!, + name = name, + userId = userId, + type = type, + isPublic = isPublic, + description = description, + icon = icon, + createTime = createTime, + updateTime = updateTime, + deleted = deleted ) } @@ -193,33 +197,18 @@ class FavoriteGroupDo( fun builder() = Builder() @JvmStatic - fun FavoriteGroup.toDo() = FavoriteGroupDo( - entityId, - name, - userId, - type, - isPublic, - description, - icon, - createTime, - updateTime, - isDeleted + fun FavoriteGroup.toEntity() = FavoriteGroupEntity( + id = id, + resourceId = entityId, + name = name, + userId = userId, + type = type, + isPublic = isPublic, + description = description, + icon = icon, + createTime = createTime, + updateTime = updateTime, + deleted = isDeleted ) } - - final override fun equals(other: Any?): Boolean { - if (this === other) return true - if (other == null) return false - val oEffectiveClass = - if (other is HibernateProxy) other.hibernateLazyInitializer.persistentClass else other.javaClass - val thisEffectiveClass = - if (this is HibernateProxy) this.hibernateLazyInitializer.persistentClass else this.javaClass - if (thisEffectiveClass != oEffectiveClass) return false - other as FavoriteGroupDo - - return id != null && id == other.id - } - - final override fun hashCode(): Int = - if (this is HibernateProxy) this.hibernateLazyInitializer.persistentClass.hashCode() else javaClass.hashCode() } diff --git a/lampray-content/content-service/src/main/java/tech/lamprism/lampray/content/favorite/persistence/FavoriteGroupRepository.kt b/lampray-content/content-service/src/main/java/tech/lamprism/lampray/content/favorite/persistence/FavoriteGroupRepository.kt index 16f20df2..4f228b92 100644 --- a/lampray-content/content-service/src/main/java/tech/lamprism/lampray/content/favorite/persistence/FavoriteGroupRepository.kt +++ b/lampray-content/content-service/src/main/java/tech/lamprism/lampray/content/favorite/persistence/FavoriteGroupRepository.kt @@ -1,5 +1,5 @@ /* - * Copyright (C) 2023-2025 RollW + * Copyright (C) 2023-2026 RollW * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -26,20 +26,28 @@ import java.util.Optional */ @Repository class FavoriteGroupRepository( - private val favoriteGroupDao: FavoriteGroupDao -) : CommonRepository(favoriteGroupDao) { - fun findByName(name: String, operator: Operator): Optional = + favoriteGroupDao: FavoriteGroupDao +) : CommonRepository(favoriteGroupDao) { + override fun save(entity: S): S { + return saveAndFlush(entity) + } + + override fun saveAll(entities: Iterable): List { + return saveAllAndFlush(entities) + } + + fun findByName(name: String, operator: Operator): Optional = findOne { root, _, builder -> builder.and( - builder.equal(root.get(FavoriteGroupDo_.name), name), - builder.equal(root.get(FavoriteGroupDo_.userId), operator.operatorId) + builder.equal(root.get(FavoriteGroupEntity_.name), name), + builder.equal(root.get(FavoriteGroupEntity_.userId), operator.operatorId) ) } - fun findByUser(userId: Long): List = + fun findByUser(userId: Long): List = findAll { root, _, criteriaBuilder -> criteriaBuilder.and( - criteriaBuilder.equal(root.get(FavoriteGroupDo_.userId), userId) + criteriaBuilder.equal(root.get(FavoriteGroupEntity_.userId), userId) ) } -} \ No newline at end of file +} diff --git a/lampray-content/content-service/src/main/java/tech/lamprism/lampray/content/favorite/persistence/FavoriteItemDao.kt b/lampray-content/content-service/src/main/java/tech/lamprism/lampray/content/favorite/persistence/FavoriteItemDao.kt index 415325f8..9cd6ddbb 100644 --- a/lampray-content/content-service/src/main/java/tech/lamprism/lampray/content/favorite/persistence/FavoriteItemDao.kt +++ b/lampray-content/content-service/src/main/java/tech/lamprism/lampray/content/favorite/persistence/FavoriteItemDao.kt @@ -1,5 +1,5 @@ /* - * Copyright (C) 2023-2025 RollW + * Copyright (C) 2023-2026 RollW * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -23,5 +23,5 @@ import tech.lamprism.lampray.common.data.Dao * @author RollW */ @Dao -interface FavoriteItemDao : CommonDao { -} \ No newline at end of file +interface FavoriteItemDao : CommonDao { +} diff --git a/lampray-content/content-service/src/main/java/tech/lamprism/lampray/content/favorite/persistence/FavoriteItemDo.kt b/lampray-content/content-service/src/main/java/tech/lamprism/lampray/content/favorite/persistence/FavoriteItemEntity.kt similarity index 67% rename from lampray-content/content-service/src/main/java/tech/lamprism/lampray/content/favorite/persistence/FavoriteItemDo.kt rename to lampray-content/content-service/src/main/java/tech/lamprism/lampray/content/favorite/persistence/FavoriteItemEntity.kt index 874aefe7..64ebab5c 100644 --- a/lampray-content/content-service/src/main/java/tech/lamprism/lampray/content/favorite/persistence/FavoriteItemDo.kt +++ b/lampray-content/content-service/src/main/java/tech/lamprism/lampray/content/favorite/persistence/FavoriteItemEntity.kt @@ -1,5 +1,5 @@ /* - * Copyright (C) 2023-2025 RollW + * Copyright (C) 2023-2026 RollW * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,13 +20,11 @@ import jakarta.persistence.Column import jakarta.persistence.Entity import jakarta.persistence.EnumType import jakarta.persistence.Enumerated -import jakarta.persistence.GeneratedValue -import jakarta.persistence.GenerationType import jakarta.persistence.Id import jakarta.persistence.Table -import jakarta.persistence.Temporal -import jakarta.persistence.TemporalType +import org.hibernate.annotations.Generated import org.hibernate.annotations.JdbcTypeCode +import org.hibernate.generator.EventType import org.hibernate.type.SqlTypes import tech.lamprism.lampray.DataEntity import tech.lamprism.lampray.content.ContentType @@ -39,42 +37,41 @@ import java.time.OffsetDateTime */ @Entity @Table(name = "favorite_item") -class FavoriteItemDo( - @Id - @Column(name = "id", nullable = false) - @GeneratedValue(strategy = GenerationType.IDENTITY) +class FavoriteItemEntity( + @Column(name = "id", nullable = false, insertable = false, updatable = false) + @Generated(event = [EventType.INSERT]) private var id: Long? = null, + @Id + @Column(name = "resource_id", nullable = false, length = 64, unique = true) + private var resourceId: String, + @Column(name = "user_id", nullable = false) var userId: Long, - @Column(name = "group_id", nullable = false) - var groupId: Long, + @Column(name = "group_id", nullable = false, length = 64) + var groupId: String, - @Column(name = "content_id", nullable = false) - var contentId: Long = 0, + @Column(name = "content_id", nullable = false, length = 64) + var contentId: String = "", @Column(name = "content_type", nullable = false, length = 40) @Enumerated(EnumType.STRING) @JdbcTypeCode(SqlTypes.VARCHAR) var contentType: ContentType = ContentType.ARTICLE, - @Temporal(TemporalType.TIMESTAMP) @Column(name = "create_time", nullable = false) private var createTime: OffsetDateTime = OffsetDateTime.now(), - @Temporal(TemporalType.TIMESTAMP) @Column(name = "update_time", nullable = false) private var updateTime: OffsetDateTime = OffsetDateTime.now(), @Column(name = "deleted", nullable = false) var deleted: Boolean = false -) : DataEntity { - override fun getEntityId(): Long = id!! +) : DataEntity { + override fun getEntityId(): String = resourceId - fun setId(id: Long) { - this.id = id - } + fun getId(): Long? = id override fun getSystemResourceKind() = FavoriteItemResourceKind @@ -85,6 +82,7 @@ class FavoriteItemDo( fun lock(): FavoriteItem = FavoriteItem( id, + resourceId, groupId, userId, contentId, @@ -98,9 +96,10 @@ class FavoriteItemDo( class Builder { private var id: Long? = null + private var resourceId: String? = null private var userId: Long = 0 - private var groupId: Long = 0 - private var contentId: Long = 0 + private var groupId: String = "" + private var contentId: String = "" private var contentType: ContentType = ContentType.ARTICLE private var createTime: OffsetDateTime = OffsetDateTime.now() private var updateTime: OffsetDateTime = OffsetDateTime.now() @@ -108,8 +107,9 @@ class FavoriteItemDo( constructor() - constructor(favoriteItem: FavoriteItemDo) { + constructor(favoriteItem: FavoriteItemEntity) { this.id = favoriteItem.id + this.resourceId = favoriteItem.resourceId this.userId = favoriteItem.userId this.groupId = favoriteItem.groupId this.contentId = favoriteItem.contentId @@ -123,15 +123,19 @@ class FavoriteItemDo( this.id = id } + fun setResourceId(resourceId: String) = apply { + this.resourceId = resourceId + } + fun setUserId(userId: Long) = apply { this.userId = userId } - fun setGroupId(groupId: Long) = apply { + fun setGroupId(groupId: String) = apply { this.groupId = groupId } - fun setContentId(contentId: Long) = apply { + fun setContentId(contentId: String) = apply { this.contentId = contentId } @@ -151,34 +155,36 @@ class FavoriteItemDo( this.deleted = deleted } - fun build(): FavoriteItemDo { - return FavoriteItemDo( - id, - userId, - groupId, - contentId, - contentType, - createTime, - updateTime, - deleted + fun build(): FavoriteItemEntity { + return FavoriteItemEntity( + id = id, + resourceId = resourceId!!, + userId = userId, + groupId = groupId, + contentId = contentId, + contentType = contentType, + createTime = createTime, + updateTime = updateTime, + deleted = deleted ) } } companion object { @JvmStatic - fun FavoriteItem.toDo() = FavoriteItemDo( - entityId, - userId, - groupId, - contentId, - contentType, - createTime, - updateTime, - isDeleted + fun FavoriteItem.toEntity() = FavoriteItemEntity( + id = id, + resourceId = entityId, + userId = userId, + groupId = groupId, + contentId = contentId, + contentType = contentType, + createTime = createTime, + updateTime = updateTime, + deleted = isDeleted ) @JvmStatic fun builder(): Builder = Builder() } -} \ No newline at end of file +} diff --git a/lampray-content/content-service/src/main/java/tech/lamprism/lampray/content/favorite/persistence/FavoriteItemRepository.kt b/lampray-content/content-service/src/main/java/tech/lamprism/lampray/content/favorite/persistence/FavoriteItemRepository.kt index e5e8cb0d..62101df4 100644 --- a/lampray-content/content-service/src/main/java/tech/lamprism/lampray/content/favorite/persistence/FavoriteItemRepository.kt +++ b/lampray-content/content-service/src/main/java/tech/lamprism/lampray/content/favorite/persistence/FavoriteItemRepository.kt @@ -1,5 +1,5 @@ /* - * Copyright (C) 2023-2025 RollW + * Copyright (C) 2023-2026 RollW * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -24,6 +24,13 @@ import tech.lamprism.lampray.common.data.CommonRepository */ @Repository class FavoriteItemRepository( - private val favoriteItemDao: FavoriteItemDao -) : CommonRepository(favoriteItemDao) { -} \ No newline at end of file + favoriteItemDao: FavoriteItemDao +) : CommonRepository(favoriteItemDao) { + override fun save(entity: S): S { + return saveAndFlush(entity) + } + + override fun saveAll(entities: Iterable): List { + return saveAllAndFlush(entities) + } +} diff --git a/lampray-content/content-service/src/main/java/tech/lamprism/lampray/content/persistence/ContentMetadataDao.kt b/lampray-content/content-service/src/main/java/tech/lamprism/lampray/content/persistence/ContentMetadataDao.kt index ce099e37..5e3c2e01 100644 --- a/lampray-content/content-service/src/main/java/tech/lamprism/lampray/content/persistence/ContentMetadataDao.kt +++ b/lampray-content/content-service/src/main/java/tech/lamprism/lampray/content/persistence/ContentMetadataDao.kt @@ -1,5 +1,5 @@ /* - * Copyright (C) 2023-2025 RollW + * Copyright (C) 2023-2026 RollW * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -23,4 +23,4 @@ import tech.lamprism.lampray.common.data.Dao * @author RollW */ @Dao -interface ContentMetadataDao : CommonDao \ No newline at end of file +interface ContentMetadataDao : CommonDao diff --git a/lampray-content/content-service/src/main/java/tech/lamprism/lampray/content/persistence/ContentMetadataDo.kt b/lampray-content/content-service/src/main/java/tech/lamprism/lampray/content/persistence/ContentMetadataEntity.kt similarity index 76% rename from lampray-content/content-service/src/main/java/tech/lamprism/lampray/content/persistence/ContentMetadataDo.kt rename to lampray-content/content-service/src/main/java/tech/lamprism/lampray/content/persistence/ContentMetadataEntity.kt index c2c3d24a..36fad8b0 100644 --- a/lampray-content/content-service/src/main/java/tech/lamprism/lampray/content/persistence/ContentMetadataDo.kt +++ b/lampray-content/content-service/src/main/java/tech/lamprism/lampray/content/persistence/ContentMetadataEntity.kt @@ -1,5 +1,5 @@ /* - * Copyright (C) 2023 RollW + * Copyright (C) 2023-2026 RollW * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -47,17 +47,17 @@ import java.time.OffsetDateTime UniqueConstraint(columnNames = ["content_id", "type"], name = "index__content_id_type") ] ) -class ContentMetadataDo( - @Column(name = "id") +class ContentMetadataEntity( @Id + @Column(name = "id", nullable = false, insertable = false, updatable = false) @GeneratedValue(strategy = GenerationType.IDENTITY) private var id: Long? = null, @Column(name = "user_id", nullable = false) var userId: Long = 0, - @Column(name = "content_id", nullable = false) - private var contentId: Long = 0, + @Column(name = "content_id", nullable = false, length = 64) + private var contentId: String = "", @Column(name = "type", nullable = false, length = 40) @Enumerated(EnumType.STRING) @@ -74,11 +74,9 @@ class ContentMetadataDo( @JdbcTypeCode(SqlTypes.VARCHAR) var contentAccessAuthType: ContentAccessAuthType = ContentAccessAuthType.PUBLIC ) : DataEntity, ContentTrait { - override fun getEntityId(): Long? = id + override fun getEntityId(): Long = id!! - fun setId(id: Long?) { - this.id = id - } + fun getId(): Long? = id override fun getCreateTime(): OffsetDateTime = TimeAttributed.NONE_TIME @@ -87,9 +85,9 @@ class ContentMetadataDo( override fun getSystemResourceKind(): SystemResourceKind = ContentMetadataResourceKind - override fun getContentId(): Long = contentId + override fun getContentId(): String = contentId - fun setContentId(contentId: Long) { + fun setContentId(contentId: String) { this.contentId = contentId } @@ -112,29 +110,32 @@ class ContentMetadataDo( fun builder(): Builder = Builder() @JvmStatic - fun ContentMetadata.toDo() = - ContentMetadataDo( - entityId, userId, contentId, contentType, - contentStatus, contentAccessAuthType + fun ContentMetadata.toEntity() = + ContentMetadataEntity( + id = id, + userId = userId, + contentId = contentId, + contentType = contentType, + contentStatus = contentStatus, + contentAccessAuthType = contentAccessAuthType ) - } class Builder { private var id: Long? = null private var userId: Long = 0 - private var contentId: Long = 0 + private var contentId: String = "" private var contentType: ContentType? = null private var contentStatus: ContentStatus? = null private var contentAccessAuthType: ContentAccessAuthType? = null constructor() - constructor(other: ContentMetadataDo) { - this.id = other.getEntityId() + constructor(other: ContentMetadataEntity) { + this.id = other.id this.userId = other.userId - this.contentId = other.getContentId() - this.contentType = other.getContentType() + this.contentId = other.contentId + this.contentType = other.contentType this.contentStatus = other.contentStatus this.contentAccessAuthType = other.contentAccessAuthType } @@ -147,7 +148,7 @@ class ContentMetadataDo( this.userId = userId } - fun setContentId(contentId: Long) = apply { + fun setContentId(contentId: String) = apply { this.contentId = contentId } @@ -163,13 +164,15 @@ class ContentMetadataDo( this.contentAccessAuthType = contentAccessAuthType } - fun build(): ContentMetadataDo { - return ContentMetadataDo( - id, userId, - contentId, - contentType!!, contentStatus!!, - contentAccessAuthType!! + fun build(): ContentMetadataEntity { + return ContentMetadataEntity( + id = id, + userId = userId, + contentId = contentId, + contentType = contentType!!, + contentStatus = contentStatus!!, + contentAccessAuthType = contentAccessAuthType!! ) } } -} \ No newline at end of file +} diff --git a/lampray-content/content-service/src/main/java/tech/lamprism/lampray/content/persistence/ContentMetadataRepository.kt b/lampray-content/content-service/src/main/java/tech/lamprism/lampray/content/persistence/ContentMetadataRepository.kt index 4fd5beda..7da5dda7 100644 --- a/lampray-content/content-service/src/main/java/tech/lamprism/lampray/content/persistence/ContentMetadataRepository.kt +++ b/lampray-content/content-service/src/main/java/tech/lamprism/lampray/content/persistence/ContentMetadataRepository.kt @@ -1,5 +1,5 @@ /* - * Copyright (C) 2023 RollW + * Copyright (C) 2023-2026 RollW * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -26,29 +26,30 @@ import java.util.Optional */ @Repository class ContentMetadataRepository( - private val contentMetadataDao: ContentMetadataDao -) : CommonRepository(contentMetadataDao) { - fun findByContent(content: ContentTrait): Optional { - return findOne { root, query, criteriaBuilder -> + contentMetadataDao: ContentMetadataDao +) : CommonRepository(contentMetadataDao) { + + fun findByContent(content: ContentTrait): Optional { + return findOne { root, _, criteriaBuilder -> criteriaBuilder.and( - criteriaBuilder.equal(root.get(ContentMetadataDo_.contentId), content.contentId), - criteriaBuilder.equal(root.get(ContentMetadataDo_.contentType), content.contentType) + criteriaBuilder.equal(root.get(ContentMetadataEntity_.contentId), content.contentId), + criteriaBuilder.equal(root.get(ContentMetadataEntity_.contentType), content.contentType) ) } } - fun findByContents(contents: List): List { + fun findByContents(contents: List): List { if (contents.isEmpty()) { return emptyList() } return findAll { root, _, builder -> val predicates = contents.map { builder.and( - builder.equal(root.get(ContentMetadataDo_.contentId), it.contentId), - builder.equal(root.get(ContentMetadataDo_.contentType), it.contentType) + builder.equal(root.get(ContentMetadataEntity_.contentId), it.contentId), + builder.equal(root.get(ContentMetadataEntity_.contentType), it.contentType) ) } builder.or(*predicates.toTypedArray()) } } -} \ No newline at end of file +} diff --git a/lampray-content/content-service/src/main/java/tech/lamprism/lampray/content/service/ContentMetadataServiceImpl.kt b/lampray-content/content-service/src/main/java/tech/lamprism/lampray/content/service/ContentMetadataServiceImpl.kt index 31562495..7bbffdec 100644 --- a/lampray-content/content-service/src/main/java/tech/lamprism/lampray/content/service/ContentMetadataServiceImpl.kt +++ b/lampray-content/content-service/src/main/java/tech/lamprism/lampray/content/service/ContentMetadataServiceImpl.kt @@ -1,5 +1,5 @@ /* - * Copyright (C) 2023 RollW + * Copyright (C) 2023-2026 RollW * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -21,7 +21,7 @@ import tech.lamprism.lampray.content.ContentMetadata import tech.lamprism.lampray.content.ContentTrait import tech.lamprism.lampray.content.common.ContentErrorCode import tech.lamprism.lampray.content.common.ContentException -import tech.lamprism.lampray.content.persistence.ContentMetadataDo.Companion.toDo +import tech.lamprism.lampray.content.persistence.ContentMetadataEntity.Companion.toEntity import tech.lamprism.lampray.content.persistence.ContentMetadataRepository /** @@ -44,13 +44,13 @@ class ContentMetadataServiceImpl( } fun createMetadata(metadata: ContentMetadata) { - contentMetadataRepository.save(metadata.toDo()) + contentMetadataRepository.save(metadata.toEntity()) } override fun updateMetadata(metadata: ContentMetadata) { - contentMetadataRepository.save(metadata.toDo()) + contentMetadataRepository.save(metadata.toEntity()) } fun deleteMetadata(contentTrait: ContentTrait) { } -} \ No newline at end of file +} diff --git a/lampray-content/content-service/src/main/java/tech/lamprism/lampray/content/service/ContentService.java b/lampray-content/content-service/src/main/java/tech/lamprism/lampray/content/service/ContentService.java index 0aff6c62..611ac39b 100644 --- a/lampray-content/content-service/src/main/java/tech/lamprism/lampray/content/service/ContentService.java +++ b/lampray-content/content-service/src/main/java/tech/lamprism/lampray/content/service/ContentService.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2023-2025 RollW + * Copyright (C) 2023-2026 RollW * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -44,7 +44,7 @@ import tech.lamprism.lampray.content.common.ContentException; import tech.lamprism.lampray.content.permit.ContentPermitChecker; import tech.lamprism.lampray.content.permit.ContentPermitResult; -import tech.lamprism.lampray.content.persistence.ContentMetadataDo; +import tech.lamprism.lampray.content.persistence.ContentMetadataEntity; import tech.lamprism.lampray.content.persistence.ContentMetadataRepository; import tech.lamprism.lampray.content.publish.ContentPublishListener; import tech.rollw.common.web.CommonErrorCode; @@ -95,7 +95,7 @@ public ContentService(List contentPublishers, @Override public ContentDetails openContent(ContentTrait contentTrait, ContentAccessCredentials contentAccessCredentials) throws ContentException { - ContentMetadataDo metadata = contentMetadataRepository + ContentMetadataEntity metadata = contentMetadataRepository .findByContent(contentTrait) .orElseThrow(() -> new ContentException(ContentErrorCode.ERROR_CONTENT_NOT_FOUND)); ErrorCode errorCode = fromContentStatus(metadata.getContentStatus()); @@ -129,7 +129,7 @@ public ContentDetails getContentDetails(ContentTrait contentTrait) @Override public ContentMetadataDetails getContentMetadataDetails(ContentTrait contentTrait) throws ContentException { - ContentMetadataDo metadata = contentMetadataRepository + ContentMetadataEntity metadata = contentMetadataRepository .findByContent(contentTrait) .orElse(null); if (metadata == null) { @@ -147,7 +147,7 @@ public ContentMetadataDetails getContentMetadataDetails(ContentTrait contentT */ public ContentStatus getContentStatus(ContentTrait contentTrait) throws ContentException { - ContentMetadataDo metadata = contentMetadataRepository + ContentMetadataEntity metadata = contentMetadataRepository .findByContent(contentTrait) .orElse(null); if (metadata == null) { @@ -187,7 +187,7 @@ public ContentDetails publishContent(UncreatedContent uncreatedContent) throws C uncreatedContent, timestamp ); - ContentMetadataDo.Builder contentMetadataBuilder = ContentMetadataDo + ContentMetadataEntity.Builder contentMetadataBuilder = ContentMetadataEntity .builder() .setContentId(contentDetails.getContentId()) .setContentType(contentDetails.getContentType()) @@ -210,7 +210,7 @@ private List> pairWith( List contentMetadata) { return contentDetails.stream().map(details -> { ContentMetadata metadata = contentMetadata.stream() - .filter(m -> m.getContentId() == details.getContentId()) + .filter(m -> m.getContentId().equals(details.getContentId())) .findFirst() .orElseThrow(() -> new ContentException(ContentErrorCode.ERROR_CONTENT_NOT_FOUND)); return new ContentMetadataDetails<>(details, metadata); @@ -246,7 +246,7 @@ public List> getContents( List contentMetadatas = contentMetadataRepository .findByContents(contents) .stream() - .map(ContentMetadataDo::lock) + .map(ContentMetadataEntity::lock) .toList(); return pairWith(contents, contentMetadatas); } diff --git a/lampray-content/review-service/src/main/java/tech/lamprism/lampray/content/review/ReviewJob.java b/lampray-content/review-service/src/main/java/tech/lamprism/lampray/content/review/ReviewJob.java index 03aef15c..edcdd007 100644 --- a/lampray-content/review-service/src/main/java/tech/lamprism/lampray/content/review/ReviewJob.java +++ b/lampray-content/review-service/src/main/java/tech/lamprism/lampray/content/review/ReviewJob.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2023-2025 RollW + * Copyright (C) 2023-2026 RollW * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -35,7 +35,7 @@ public class ReviewJob implements DataEntity, ContentAssociated, ReviewJobSummary { private final Long id; private final String jobId; - private final long reviewContentId; + private final String reviewContentId; private final ContentType reviewContentType; private final ReviewStatus status; @@ -44,7 +44,7 @@ public class ReviewJob implements DataEntity, ContentAssociated, ReviewJ private final ReviewMark reviewMark; private final ContentIdentity associatedContent; - public ReviewJob(Long id, String jobId, long reviewContentId, + public ReviewJob(Long id, String jobId, String reviewContentId, ContentType reviewContentType, ReviewStatus status, OffsetDateTime createTime, OffsetDateTime updateTime, @@ -73,7 +73,7 @@ public long getId() { return id; } - public long getReviewContentId() { + public String getReviewContentId() { return reviewContentId; } @@ -161,7 +161,7 @@ public String getJobId() { public final static class Builder implements EntityBuilder { private Long id = null; private String jobId; - private long reviewContentId; + private String reviewContentId; private ReviewStatus status; private ContentType reviewContentType; private OffsetDateTime assignedTime; @@ -196,7 +196,7 @@ public Builder setJobId(String jobId) { return this; } - public Builder setReviewContentId(long reviewContentId) { + public Builder setReviewContentId(String reviewContentId) { this.reviewContentId = reviewContentId; return this; } diff --git a/lampray-content/review-service/src/main/java/tech/lamprism/lampray/content/review/feedback/ReviewCategory.kt b/lampray-content/review-service/src/main/java/tech/lamprism/lampray/content/review/feedback/ReviewCategory.kt index 15a9e003..cf53e252 100644 --- a/lampray-content/review-service/src/main/java/tech/lamprism/lampray/content/review/feedback/ReviewCategory.kt +++ b/lampray-content/review-service/src/main/java/tech/lamprism/lampray/content/review/feedback/ReviewCategory.kt @@ -1,5 +1,5 @@ /* - * Copyright (C) 2023-2025 RollW + * Copyright (C) 2023-2026 RollW * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -21,21 +21,6 @@ package tech.lamprism.lampray.content.review.feedback * @author RollW */ enum class ReviewCategory { - /** - * Content quality issues. - */ - CONTENT_QUALITY, - - /** - * Grammar or spelling issues. - */ - GRAMMAR, - - /** - * Formatting or structure issues. - */ - FORMAT, - /** * Policy or guideline violations. */ @@ -51,11 +36,6 @@ enum class ReviewCategory { */ COPYRIGHT, - /** - * Technical or implementation issues. - */ - TECHNICAL, - /** * Other unclassified issues. */ diff --git a/lampray-content/review-service/src/main/java/tech/lamprism/lampray/content/review/persistence/ReviewJobEntity.kt b/lampray-content/review-service/src/main/java/tech/lamprism/lampray/content/review/persistence/ReviewJobEntity.kt index 557e8ede..579bc523 100644 --- a/lampray-content/review-service/src/main/java/tech/lamprism/lampray/content/review/persistence/ReviewJobEntity.kt +++ b/lampray-content/review-service/src/main/java/tech/lamprism/lampray/content/review/persistence/ReviewJobEntity.kt @@ -1,5 +1,5 @@ /* - * Copyright (C) 2023-2025 RollW + * Copyright (C) 2023-2026 RollW * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -55,8 +55,8 @@ class ReviewJobEntity( @Column(name = "resource_id", nullable = false, length = 64, unique = true) var resourceId: String = "", - @Column(name = "content_id", nullable = false) - var reviewContentId: Long = 0, + @Column(name = "content_id", nullable = false, length = 64) + var reviewContentId: String = "", @Column(name = "content_type", nullable = false, length = 40) @Enumerated(EnumType.STRING) @@ -123,7 +123,7 @@ class ReviewJobEntity( class Builder { private var id: Long? = null private var resourceId: String? = null - private var reviewContentId: Long = 0 + private var reviewContentId: String = "" private var reviewContentType: ContentType = ContentType.ARTICLE private var status: ReviewStatus = ReviewStatus.PENDING private var createTime: OffsetDateTime = OffsetDateTime.now() @@ -151,7 +151,7 @@ class ReviewJobEntity( this.resourceId = resourceId } - fun setReviewContentId(reviewContentId: Long) = apply { + fun setReviewContentId(reviewContentId: String) = apply { this.reviewContentId = reviewContentId } @@ -191,7 +191,7 @@ class ReviewJobEntity( companion object { @JvmStatic - fun ReviewJob.toDo(): ReviewJobEntity = ReviewJobEntity( + fun ReviewJob.toEntity(): ReviewJobEntity = ReviewJobEntity( id, jobId, reviewContentId = reviewContentId, reviewContentType = reviewContentType, @@ -204,4 +204,4 @@ class ReviewJobEntity( @JvmStatic fun builder(): Builder = Builder() } -} \ No newline at end of file +} diff --git a/lampray-content/review-service/src/main/java/tech/lamprism/lampray/content/review/persistence/ReviewJobRepository.kt b/lampray-content/review-service/src/main/java/tech/lamprism/lampray/content/review/persistence/ReviewJobRepository.kt index 7a9f3ff3..dbf5d51b 100644 --- a/lampray-content/review-service/src/main/java/tech/lamprism/lampray/content/review/persistence/ReviewJobRepository.kt +++ b/lampray-content/review-service/src/main/java/tech/lamprism/lampray/content/review/persistence/ReviewJobRepository.kt @@ -1,5 +1,5 @@ /* - * Copyright (C) 2023-2025 RollW + * Copyright (C) 2023-2026 RollW * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -26,18 +26,18 @@ import tech.lamprism.lampray.content.review.ReviewStatus */ @Repository class ReviewJobRepository( - private val reviewJobDao: ReviewJobDao + reviewJobDao: ReviewJobDao ) : CommonRepository(reviewJobDao) { override fun save(entity: S): S { - return reviewJobDao.saveAndFlush(entity) + return saveAndFlush(entity) } override fun saveAll(entities: Iterable): List { - return reviewJobDao.saveAllAndFlush(entities) + return saveAllAndFlush(entities) } fun findByContent( - contentId: Long, + contentId: String, contentType: ContentType, ): List = findAll { root, _, criteriaBuilder -> criteriaBuilder.and( @@ -47,7 +47,7 @@ class ReviewJobRepository( } fun findByContentAndStatus( - contentId: Long, + contentId: String, contentType: ContentType, reviewStatus: ReviewStatus ): List = findAll { root, _, criteriaBuilder -> @@ -111,4 +111,4 @@ class ReviewJobRepository( jobPredicate ) } -} \ No newline at end of file +} diff --git a/lampray-content/review-service/src/main/java/tech/lamprism/lampray/content/review/persistence/ReviewTaskEntity.kt b/lampray-content/review-service/src/main/java/tech/lamprism/lampray/content/review/persistence/ReviewTaskEntity.kt index 7c26cdf1..97b4db79 100644 --- a/lampray-content/review-service/src/main/java/tech/lamprism/lampray/content/review/persistence/ReviewTaskEntity.kt +++ b/lampray-content/review-service/src/main/java/tech/lamprism/lampray/content/review/persistence/ReviewTaskEntity.kt @@ -1,5 +1,5 @@ /* - * Copyright (C) 2023-2025 RollW + * Copyright (C) 2023-2026 RollW * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -221,7 +221,7 @@ class ReviewTaskEntity( * Converts immutable [ReviewTask] to mutable entity. */ @JvmStatic - fun ReviewTask.toDo(): ReviewTaskEntity = ReviewTaskEntity( + fun ReviewTask.toEntity(): ReviewTaskEntity = ReviewTaskEntity( id, resourceId = taskId, reviewJobId = reviewJobId, @@ -249,7 +249,10 @@ class ReviewTaskEntity( return resourceId == other.resourceId } - final override fun hashCode(): Int = - if (this is HibernateProxy) this.hibernateLazyInitializer.persistentClass.hashCode() else javaClass.hashCode() + final override fun hashCode(): Int { + val effectiveClass = + if (this is HibernateProxy) this.hibernateLazyInitializer.persistentClass else javaClass + return 31 * effectiveClass.hashCode() + resourceId.hashCode() + } } diff --git a/lampray-content/review-service/src/main/java/tech/lamprism/lampray/content/review/persistence/ReviewTaskRepository.kt b/lampray-content/review-service/src/main/java/tech/lamprism/lampray/content/review/persistence/ReviewTaskRepository.kt index ea147225..59b9b12d 100644 --- a/lampray-content/review-service/src/main/java/tech/lamprism/lampray/content/review/persistence/ReviewTaskRepository.kt +++ b/lampray-content/review-service/src/main/java/tech/lamprism/lampray/content/review/persistence/ReviewTaskRepository.kt @@ -1,5 +1,5 @@ /* - * Copyright (C) 2023-2025 RollW + * Copyright (C) 2023-2026 RollW * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -26,14 +26,14 @@ import tech.lamprism.lampray.content.review.ReviewTaskStatus */ @Repository class ReviewTaskRepository( - private val reviewTaskDao: ReviewTaskDao + reviewTaskDao: ReviewTaskDao ) : CommonRepository(reviewTaskDao) { override fun save(entity: S): S { - return reviewTaskDao.saveAndFlush(entity) + return saveAndFlush(entity) } override fun saveAll(entities: Iterable): List { - return reviewTaskDao.saveAllAndFlush(entities) + return saveAllAndFlush(entities) } fun findByJobId(jobId: String): List { diff --git a/lampray-iam/authentication-service/src/main/java/tech/lamprism/lampray/security/authentication/registration/RegisterVerificationToken.java b/lampray-iam/authentication-service/src/main/java/tech/lamprism/lampray/security/authentication/registration/RegisterVerificationToken.java index e277900f..30f6d1e5 100644 --- a/lampray-iam/authentication-service/src/main/java/tech/lamprism/lampray/security/authentication/registration/RegisterVerificationToken.java +++ b/lampray-iam/authentication-service/src/main/java/tech/lamprism/lampray/security/authentication/registration/RegisterVerificationToken.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2023-2025 RollW + * Copyright (C) 2023-2026 RollW * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,7 +18,7 @@ import space.lingu.NonNull; import tech.lamprism.lampray.DataEntity; -import tech.lamprism.lampray.LongEntityBuilder; +import tech.lamprism.lampray.EntityBuilder; import tech.lamprism.lampray.security.authentication.VerifiableToken; import tech.rollw.common.web.system.SystemResourceKind; @@ -34,7 +34,7 @@ public record RegisterVerificationToken( Long id, String token, long userId, - long expiryTime,// timestamp + long expiryTime, boolean used ) implements VerifiableToken, DataEntity { @@ -42,7 +42,7 @@ public boolean isExpired() { return System.currentTimeMillis() > expiryTime; } - private static final int EXPIRATION = 60 * 24;// min + private static final int EXPIRATION = 60 * 24; public static long calculateExpiryDate(int expiryTimeInMinutes) { long now = System.currentTimeMillis(); @@ -103,7 +103,7 @@ public boolean isUsable() { return !used && !isExpired(); } - public static final class Builder implements LongEntityBuilder { + public static final class Builder implements EntityBuilder { private Long id; private String token; private long userId; @@ -123,6 +123,10 @@ public Builder(RegisterVerificationToken source) { @Override public Builder setEntityId(Long id) { + return setId(id); + } + + public Builder setId(Long id) { this.id = id; return this; } diff --git a/lampray-iam/authentication-service/src/main/java/tech/lamprism/lampray/security/authentication/registration/repository/RegisterTokenDao.kt b/lampray-iam/authentication-service/src/main/java/tech/lamprism/lampray/security/authentication/registration/repository/RegisterTokenDao.kt index f641b5d1..0959c040 100644 --- a/lampray-iam/authentication-service/src/main/java/tech/lamprism/lampray/security/authentication/registration/repository/RegisterTokenDao.kt +++ b/lampray-iam/authentication-service/src/main/java/tech/lamprism/lampray/security/authentication/registration/repository/RegisterTokenDao.kt @@ -1,5 +1,5 @@ /* - * Copyright (C) 2023-2025 RollW + * Copyright (C) 2023-2026 RollW * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -23,5 +23,5 @@ import tech.lamprism.lampray.common.data.Dao * @author RollW */ @Dao -interface RegisterTokenDao : CommonDao { -} \ No newline at end of file +interface RegisterTokenDao : CommonDao { +} diff --git a/lampray-iam/authentication-service/src/main/java/tech/lamprism/lampray/security/authentication/registration/repository/RegisterTokenDo.kt b/lampray-iam/authentication-service/src/main/java/tech/lamprism/lampray/security/authentication/registration/repository/RegisterTokenEntity.kt similarity index 80% rename from lampray-iam/authentication-service/src/main/java/tech/lamprism/lampray/security/authentication/registration/repository/RegisterTokenDo.kt rename to lampray-iam/authentication-service/src/main/java/tech/lamprism/lampray/security/authentication/registration/repository/RegisterTokenEntity.kt index 038bcd11..2f7254b6 100644 --- a/lampray-iam/authentication-service/src/main/java/tech/lamprism/lampray/security/authentication/registration/repository/RegisterTokenDo.kt +++ b/lampray-iam/authentication-service/src/main/java/tech/lamprism/lampray/security/authentication/registration/repository/RegisterTokenEntity.kt @@ -1,5 +1,5 @@ /* - * Copyright (C) 2023-2025 RollW + * Copyright (C) 2023-2026 RollW * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -41,10 +41,10 @@ import java.time.OffsetDateTime UniqueConstraint(columnNames = ["token"], name = "index__token") ] ) -class RegisterTokenDo( +class RegisterTokenEntity( @Id @GeneratedValue(strategy = GenerationType.IDENTITY) - @Column(name = "id") + @Column(name = "id", nullable = false, insertable = false, updatable = false) private var id: Long? = null, @Column(name = "token") @@ -64,7 +64,7 @@ class RegisterTokenDo( } override fun getUserId(): Long { - return userId + return userId } fun setUserId(userId: Long) { @@ -75,12 +75,10 @@ class RegisterTokenDo( return !used && !isExpired() } - fun setId(id: Long?) { - this.id = id - } + fun getId(): Long? = id - override fun getEntityId(): Long? { - return id + override fun getEntityId(): Long { + return id!! } override fun getCreateTime(): OffsetDateTime = TimeAttributed.NONE_TIME @@ -91,8 +89,7 @@ class RegisterTokenDo( RegisterTokenResourceKind fun lock(): RegisterVerificationToken = RegisterVerificationToken( - id, token, userId, - expiryTime, used + id, token, userId, expiryTime, used ) fun toBuilder(): Builder { @@ -108,11 +105,6 @@ class RegisterTokenDo( } companion object { - @JvmStatic - fun RegisterVerificationToken.toDo(): RegisterTokenDo = RegisterTokenDo( - entityId, token, userId, expiryTime, used - ) - @JvmStatic fun builder(): Builder { return Builder() @@ -128,12 +120,12 @@ class RegisterTokenDo( internal constructor() - internal constructor(registerTokenDo: RegisterTokenDo) { - id = registerTokenDo.id - token = registerTokenDo.token - userId = registerTokenDo.userId - expiryTime = registerTokenDo.expiryTime - used = registerTokenDo.used + internal constructor(registerTokenEntity: RegisterTokenEntity) { + id = registerTokenEntity.id + token = registerTokenEntity.token + userId = registerTokenEntity.userId + expiryTime = registerTokenEntity.expiryTime + used = registerTokenEntity.used } fun setId(id: Long?): Builder { @@ -160,5 +152,15 @@ class RegisterTokenDo( this.used = used return this } + + fun build(): RegisterTokenEntity { + return RegisterTokenEntity( + id = id, + token = token, + userId = userId, + expiryTime = expiryTime, + used = used + ) + } } -} \ No newline at end of file +} diff --git a/lampray-iam/authentication-service/src/main/java/tech/lamprism/lampray/security/authentication/registration/repository/RegisterTokenRepository.kt b/lampray-iam/authentication-service/src/main/java/tech/lamprism/lampray/security/authentication/registration/repository/RegisterTokenRepository.kt index 7612099d..eef4e636 100644 --- a/lampray-iam/authentication-service/src/main/java/tech/lamprism/lampray/security/authentication/registration/repository/RegisterTokenRepository.kt +++ b/lampray-iam/authentication-service/src/main/java/tech/lamprism/lampray/security/authentication/registration/repository/RegisterTokenRepository.kt @@ -1,5 +1,5 @@ /* - * Copyright (C) 2023-2025 RollW + * Copyright (C) 2023-2026 RollW * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -25,11 +25,11 @@ import java.util.Optional */ @Repository class RegisterTokenRepository( - private val registerTokenDao: RegisterTokenDao -) : CommonRepository(registerTokenDao) { - fun findByToken(token: String): Optional { + registerTokenDao: RegisterTokenDao +) : CommonRepository(registerTokenDao) { + fun findByToken(token: String): Optional { return findOne { root, _, cb -> - cb.equal(root.get(RegisterTokenDo_.token), token) + cb.equal(root.get(RegisterTokenEntity_.token), token) } } -} \ No newline at end of file +} diff --git a/lampray-iam/authentication-service/src/main/java/tech/lamprism/lampray/security/authentication/registration/service/LoginRegisterService.java b/lampray-iam/authentication-service/src/main/java/tech/lamprism/lampray/security/authentication/registration/service/LoginRegisterService.java index 3f500b1a..df3e9428 100644 --- a/lampray-iam/authentication-service/src/main/java/tech/lamprism/lampray/security/authentication/registration/service/LoginRegisterService.java +++ b/lampray-iam/authentication-service/src/main/java/tech/lamprism/lampray/security/authentication/registration/service/LoginRegisterService.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2023-2025 RollW + * Copyright (C) 2023-2026 RollW * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -42,7 +42,7 @@ import tech.lamprism.lampray.security.authentication.registration.RegisterVerificationToken; import tech.lamprism.lampray.security.authentication.registration.Registration; import tech.lamprism.lampray.security.authentication.registration.RegistrationInterceptor; -import tech.lamprism.lampray.security.authentication.registration.repository.RegisterTokenDo; +import tech.lamprism.lampray.security.authentication.registration.repository.RegisterTokenEntity; import tech.lamprism.lampray.security.authentication.registration.repository.RegisterTokenRepository; import tech.lamprism.lampray.security.firewall.FirewallAccessRequest; import tech.lamprism.lampray.security.firewall.FirewallRegistry; @@ -236,16 +236,19 @@ public VerifiableToken createRegisterToken(UserIdentity userIdentity) { UUID uuid = UUID.randomUUID(); String token = uuid.toString(); long expiryTime = RegisterVerificationToken.calculateExpiryDate(); - RegisterTokenDo registerVerificationToken = new RegisterTokenDo( - null, token, userIdentity.getUserId(), expiryTime, false - ); + RegisterTokenEntity registerVerificationToken = RegisterTokenEntity.builder() + .setToken(token) + .setUserId(userIdentity.getUserId()) + .setExpiryTime(expiryTime) + .setUsed(false) + .build(); registerVerificationToken = registerTokenRepository.save(registerVerificationToken); return registerVerificationToken.lock(); } @Override public RegisterVerificationToken getRegisterToken(String token) { - RegisterTokenDo registerTokenDo = registerTokenRepository.findByToken(token) + RegisterTokenEntity registerTokenDo = registerTokenRepository.findByToken(token) .orElseThrow(() -> new AuthenticationException(AuthErrorCode.ERROR_TOKEN_NOT_EXIST)); if (registerTokenDo.isExpired() || registerTokenDo.getUsed()) { throw new AuthenticationException(AuthErrorCode.ERROR_TOKEN_NOT_EXIST); @@ -271,7 +274,7 @@ private AttributedUser retrieveUser(UserTrait user) { @Override public void verifyRegisterToken(String token) { - RegisterTokenDo registerTokenDo = registerTokenRepository.findByToken(token) + RegisterTokenEntity registerTokenDo = registerTokenRepository.findByToken(token) .orElseThrow(() -> new AuthenticationException(AuthErrorCode.ERROR_TOKEN_NOT_EXIST)); if (registerTokenDo.getUsed()) { throw new AuthenticationException(AuthErrorCode.ERROR_TOKEN_USED); diff --git a/lampray-system/message-resource-service/src/main/java/tech/lamprism/lampray/system/resource/LocalizedMessage.kt b/lampray-system/message-resource-service/src/main/java/tech/lamprism/lampray/system/resource/LocalizedMessage.kt index 460e1f42..d3ba7f35 100644 --- a/lampray-system/message-resource-service/src/main/java/tech/lamprism/lampray/system/resource/LocalizedMessage.kt +++ b/lampray-system/message-resource-service/src/main/java/tech/lamprism/lampray/system/resource/LocalizedMessage.kt @@ -1,5 +1,5 @@ /* - * Copyright (C) 2023 RollW + * Copyright (C) 2023-2026 RollW * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,10 +15,9 @@ */ package tech.lamprism.lampray.system.resource -import space.lingu.NonNull import tech.lamprism.lampray.DataEntity +import tech.lamprism.lampray.EntityBuilder import tech.lamprism.lampray.TimeAttributed -import tech.rollw.common.web.system.SystemResourceKind import java.time.OffsetDateTime import java.util.Locale @@ -37,20 +36,19 @@ data class LocalizedMessage( override val locale: Locale, private val updateTime: OffsetDateTime ) : LocalizedMessageResource, DataEntity { - override fun getEntityId(): Long? = id + override fun getEntityId(): Long = id!! + + fun getId(): Long? = id override fun getCreateTime(): OffsetDateTime = TimeAttributed.NONE_TIME override fun getUpdateTime(): OffsetDateTime = updateTime - @NonNull - override fun getSystemResourceKind(): SystemResourceKind { - return LocalizedMessageResourceKind - } + override fun getSystemResourceKind() = LocalizedMessageResourceKind fun toBuilder() = Builder(this) - class Builder { + class Builder : EntityBuilder { private var id: Long? = null private var key: String? = null private var value: String? = null @@ -71,6 +69,10 @@ data class LocalizedMessage( this.id = id } + override fun setEntityId(id: Long) = apply { + this.id = id + } + fun setKey(key: String) = apply { this.key = key } @@ -87,7 +89,7 @@ data class LocalizedMessage( this.updateTime = updateTime } - fun build(): LocalizedMessage = + override fun build(): LocalizedMessage = LocalizedMessage(id, key!!, value!!, locale!!, updateTime!!) } @@ -100,10 +102,12 @@ data class LocalizedMessage( key: String, value: String, locale: Locale ): LocalizedMessage { + val now = OffsetDateTime.now() return builder() .setKey(key) .setValue(value) .setLocale(locale) + .setUpdateTime(now) .build() } } diff --git a/lampray-system/message-resource-service/src/main/java/tech/lamprism/lampray/system/resource/data/LocalizedMessageDao.kt b/lampray-system/message-resource-service/src/main/java/tech/lamprism/lampray/system/resource/data/LocalizedMessageDao.kt index 7c0a9590..33569421 100644 --- a/lampray-system/message-resource-service/src/main/java/tech/lamprism/lampray/system/resource/data/LocalizedMessageDao.kt +++ b/lampray-system/message-resource-service/src/main/java/tech/lamprism/lampray/system/resource/data/LocalizedMessageDao.kt @@ -1,5 +1,5 @@ /* - * Copyright (C) 2023 RollW + * Copyright (C) 2023-2026 RollW * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -23,5 +23,4 @@ import tech.lamprism.lampray.common.data.Dao * @author RollW */ @Dao -interface LocalizedMessageDao : CommonDao { -} \ No newline at end of file +interface LocalizedMessageDao : CommonDao diff --git a/lampray-system/message-resource-service/src/main/java/tech/lamprism/lampray/system/resource/data/LocalizedMessageDo.kt b/lampray-system/message-resource-service/src/main/java/tech/lamprism/lampray/system/resource/data/LocalizedMessageEntity.kt similarity index 91% rename from lampray-system/message-resource-service/src/main/java/tech/lamprism/lampray/system/resource/data/LocalizedMessageDo.kt rename to lampray-system/message-resource-service/src/main/java/tech/lamprism/lampray/system/resource/data/LocalizedMessageEntity.kt index ff9f031d..a9697f72 100644 --- a/lampray-system/message-resource-service/src/main/java/tech/lamprism/lampray/system/resource/data/LocalizedMessageDo.kt +++ b/lampray-system/message-resource-service/src/main/java/tech/lamprism/lampray/system/resource/data/LocalizedMessageEntity.kt @@ -1,5 +1,5 @@ /* - * Copyright (C) 2023 RollW + * Copyright (C) 2023-2026 RollW * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -46,11 +46,11 @@ import java.util.Locale UniqueConstraint(columnNames = ["key", "locale"], name = "index__key_locale") ] ) -class LocalizedMessageDo( +class LocalizedMessageEntity( @Id @Column(name = "id") @GeneratedValue(strategy = GenerationType.IDENTITY) - private var id: Long? = null, + var id: Long? = null, @Column(name = "key", nullable = false, length = 255) override var key: String = "", @@ -71,10 +71,6 @@ class LocalizedMessageDo( return id } - fun setId(id: Long?) { - this.id = id - } - override fun getCreateTime(): OffsetDateTime = TimeAttributed.NONE_TIME override fun getUpdateTime(): OffsetDateTime = updateTime @@ -92,8 +88,8 @@ class LocalizedMessageDo( } companion object { - fun LocalizedMessage.toDo(): LocalizedMessageDo { - return LocalizedMessageDo(entityId, key, value, locale, updateTime) + fun LocalizedMessage.toEntity(): LocalizedMessageEntity { + return LocalizedMessageEntity(entityId, key, value, locale, updateTime) } } -} \ No newline at end of file +} diff --git a/lampray-system/message-resource-service/src/main/java/tech/lamprism/lampray/system/resource/data/LocalizedMessageRepository.kt b/lampray-system/message-resource-service/src/main/java/tech/lamprism/lampray/system/resource/data/LocalizedMessageRepository.kt index 70c1ee25..b0450601 100644 --- a/lampray-system/message-resource-service/src/main/java/tech/lamprism/lampray/system/resource/data/LocalizedMessageRepository.kt +++ b/lampray-system/message-resource-service/src/main/java/tech/lamprism/lampray/system/resource/data/LocalizedMessageRepository.kt @@ -1,5 +1,5 @@ /* - * Copyright (C) 2023 RollW + * Copyright (C) 2023-2026 RollW * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -27,28 +27,29 @@ import java.util.Locale */ @Repository class LocalizedMessageRepository( - private val localizedMessageDao: LocalizedMessageDao -) : CommonRepository(localizedMessageDao) { + localizedMessageDao: LocalizedMessageDao +) : CommonRepository(localizedMessageDao) { + fun findByKey(key: String, locale: Locale) = findOne { root, _, criteriaBuilder -> criteriaBuilder.and( - criteriaBuilder.equal(root.get(LocalizedMessageDo_.key), key), - criteriaBuilder.equal(root.get(LocalizedMessageDo_.locale), locale) + criteriaBuilder.equal(root.get(LocalizedMessageEntity_.key), key), + criteriaBuilder.equal(root.get(LocalizedMessageEntity_.locale), locale) ) } fun findByKey( key: String, pageable: Pageable = Pageable.unpaged() - ): Page = + ): Page = findAll(pageable) { root, _, criteriaBuilder -> - criteriaBuilder.equal(root.get(LocalizedMessageDo_.key), key) + criteriaBuilder.equal(root.get(LocalizedMessageEntity_.key), key) } fun deleteByKey(key: String) { delete { root, _, criteriaBuilder -> criteriaBuilder.and( - criteriaBuilder.equal(root.get(LocalizedMessageDo_.key), key) + criteriaBuilder.equal(root.get(LocalizedMessageEntity_.key), key) ) } } @@ -56,9 +57,9 @@ class LocalizedMessageRepository( fun deleteByKey(key: String, locale: Locale) { delete { root, _, criteriaBuilder -> criteriaBuilder.and( - criteriaBuilder.equal(root.get(LocalizedMessageDo_.key), key), - criteriaBuilder.equal(root.get(LocalizedMessageDo_.locale), locale) + criteriaBuilder.equal(root.get(LocalizedMessageEntity_.key), key), + criteriaBuilder.equal(root.get(LocalizedMessageEntity_.locale), locale) ) } } -} \ No newline at end of file +} diff --git a/lampray-system/message-resource-service/src/main/java/tech/lamprism/lampray/system/resource/service/LocalizedMessageResourceService.kt b/lampray-system/message-resource-service/src/main/java/tech/lamprism/lampray/system/resource/service/LocalizedMessageResourceService.kt index 21d65f85..8c3069e7 100644 --- a/lampray-system/message-resource-service/src/main/java/tech/lamprism/lampray/system/resource/service/LocalizedMessageResourceService.kt +++ b/lampray-system/message-resource-service/src/main/java/tech/lamprism/lampray/system/resource/service/LocalizedMessageResourceService.kt @@ -1,5 +1,5 @@ /* - * Copyright (C) 2023 RollW + * Copyright (C) 2023-2026 RollW * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,7 +20,7 @@ import org.springframework.stereotype.Service import tech.lamprism.lampray.system.resource.LocalizedMessageResource import tech.lamprism.lampray.system.resource.LocalizedMessageResourceProvider import tech.lamprism.lampray.system.resource.SimpleLocalizedMessageResource -import tech.lamprism.lampray.system.resource.data.LocalizedMessageDo +import tech.lamprism.lampray.system.resource.data.LocalizedMessageEntity import tech.lamprism.lampray.system.resource.data.LocalizedMessageRepository import java.time.OffsetDateTime import java.util.Locale @@ -46,19 +46,19 @@ class LocalizedMessageResourceService( value: String, locale: Locale ) { - val localizedMessageDo = localizedMessageRepository - .findByKey(key, locale).orElse(null) ?: LocalizedMessageDo().apply { + val localizedMessageEntity = localizedMessageRepository + .findByKey(key, locale).orElse(null) ?: LocalizedMessageEntity().apply { this.key = key this.value = value this.locale = locale } - if (localizedMessageDo.entityId != null && - localizedMessageDo.value == value + if (localizedMessageEntity.id != null && + localizedMessageEntity.value == value ) { return } val time = OffsetDateTime.now() - localizedMessageDo.apply { + localizedMessageEntity.apply { this.value = value this.updateTime = time }.let { @@ -86,9 +86,9 @@ class LocalizedMessageResourceService( key: String, locale: Locale ): LocalizedMessageResource? { - val localizedMessageDo = localizedMessageRepository + val localizedMessageEntity = localizedMessageRepository .findByKey(key, locale).orElse(null) - return localizedMessageDo?.lock() + return localizedMessageEntity?.lock() } override fun getMessageResource( @@ -104,10 +104,10 @@ class LocalizedMessageResourceService( locale: Locale, defaultValueProvider: Supplier ): LocalizedMessageResource? { - val localizedMessageDo = localizedMessageRepository + val localizedMessageEntity = localizedMessageRepository .findByKey(key, locale).orElse(null) - if (localizedMessageDo != null) { - return localizedMessageDo.lock() + if (localizedMessageEntity != null) { + return localizedMessageEntity.lock() } return SimpleLocalizedMessageResource(key, defaultValueProvider.get(), locale) } @@ -119,4 +119,4 @@ class LocalizedMessageResourceService( override fun getMessageResources(key: String): List { return localizedMessageRepository.findByKey(key).map { it.lock() } } -} \ No newline at end of file +} diff --git a/lampray-system/setting-service/src/main/java/tech/lamprism/lampray/setting/SystemSetting.java b/lampray-system/setting-service/src/main/java/tech/lamprism/lampray/setting/SystemSetting.java index 2936470b..5b6bf6e8 100644 --- a/lampray-system/setting-service/src/main/java/tech/lamprism/lampray/setting/SystemSetting.java +++ b/lampray-system/setting-service/src/main/java/tech/lamprism/lampray/setting/SystemSetting.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2023 RollW + * Copyright (C) 2023-2026 RollW * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -28,7 +28,7 @@ * @author RollW */ @SuppressWarnings("all") -public class SystemSetting implements DataEntity { +public class SystemSetting implements DataEntity { private final Long id; private final String key; private final String value; @@ -47,11 +47,15 @@ public String getValue() { return value; } - @Override - public Long getEntityId() { + public Long getId() { return id; } + @Override + public String getEntityId() { + return key; + } + @NonNull @Override public OffsetDateTime getCreateTime() { @@ -95,7 +99,7 @@ public String toString() { + '}'; } - public static final class Builder implements EntityBuilder { + public static final class Builder implements EntityBuilder { private Long id; private String key; private String value; @@ -104,11 +108,12 @@ public Builder() { } public Builder(SystemSetting systemSetting) { - this.id = systemSetting.getEntityId(); + this.id = systemSetting.id; this.key = systemSetting.getKey(); this.value = systemSetting.getValue(); } + public Builder setKey(String key) { this.key = key; return this; @@ -124,10 +129,15 @@ public SystemSetting build() { return new SystemSetting(id, key, value); } - @Override - public Builder setEntityId(Long id) { + public Builder setId(Long id) { this.id = id; return this; } + + @Override + public Builder setEntityId(String id) { + this.key = id; + return this; + } } } diff --git a/lampray-system/setting-service/src/main/java/tech/lamprism/lampray/setting/data/SystemSettingDao.kt b/lampray-system/setting-service/src/main/java/tech/lamprism/lampray/setting/data/SystemSettingDao.kt index 367c3e39..daaec285 100644 --- a/lampray-system/setting-service/src/main/java/tech/lamprism/lampray/setting/data/SystemSettingDao.kt +++ b/lampray-system/setting-service/src/main/java/tech/lamprism/lampray/setting/data/SystemSettingDao.kt @@ -1,5 +1,5 @@ /* - * Copyright (C) 2023 RollW + * Copyright (C) 2023-2026 RollW * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -23,5 +23,4 @@ import tech.lamprism.lampray.common.data.Dao * @author RollW */ @Dao -interface SystemSettingDao: CommonDao { -} \ No newline at end of file +interface SystemSettingDao : CommonDao diff --git a/lampray-system/setting-service/src/main/java/tech/lamprism/lampray/setting/data/SystemSettingDo.kt b/lampray-system/setting-service/src/main/java/tech/lamprism/lampray/setting/data/SystemSettingEntity.kt similarity index 70% rename from lampray-system/setting-service/src/main/java/tech/lamprism/lampray/setting/data/SystemSettingDo.kt rename to lampray-system/setting-service/src/main/java/tech/lamprism/lampray/setting/data/SystemSettingEntity.kt index b9369f4a..d4124a45 100644 --- a/lampray-system/setting-service/src/main/java/tech/lamprism/lampray/setting/data/SystemSettingDo.kt +++ b/lampray-system/setting-service/src/main/java/tech/lamprism/lampray/setting/data/SystemSettingEntity.kt @@ -1,5 +1,5 @@ /* - * Copyright (C) 2023 RollW + * Copyright (C) 2023-2026 RollW * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,15 +18,14 @@ package tech.lamprism.lampray.setting.data import jakarta.persistence.Column import jakarta.persistence.Entity -import jakarta.persistence.GeneratedValue -import jakarta.persistence.GenerationType import jakarta.persistence.Id import jakarta.persistence.Table -import jakarta.persistence.Temporal -import jakarta.persistence.TemporalType import jakarta.persistence.UniqueConstraint +import org.hibernate.annotations.Generated +import org.hibernate.generator.EventType import tech.lamprism.lampray.DataEntity import tech.lamprism.lampray.TimeAttributed +import tech.lamprism.lampray.setting.SystemSetting import tech.lamprism.lampray.setting.SystemSettingResourceKind import tech.rollw.common.web.system.SystemResourceKind import java.time.OffsetDateTime @@ -38,27 +37,22 @@ import java.time.OffsetDateTime @Table(name = "system_setting", uniqueConstraints = [ UniqueConstraint(columnNames = ["key"], name = "index__key") ]) -class SystemSettingDo( - @Id - @Column(name = "id") - @GeneratedValue(strategy = GenerationType.IDENTITY) - private var id: Long? = null, +class SystemSettingEntity( + @Column(name = "id", nullable = false, insertable = false, updatable = false) + @Generated(event = [EventType.INSERT]) + var id: Long? = null, - @Column(name = "key") + @Id + @Column(name = "key", nullable = false, unique = true, length = 255) var key: String = "", @Column(name = "value") var value: String? = null, - @Temporal(TemporalType.TIMESTAMP) @Column(name = "update_time", nullable = false) private var updateTime: OffsetDateTime = OffsetDateTime.now() -) : DataEntity { - override fun getEntityId(): Long? = id - - fun setId(id: Long?) { - this.id = id - } +) : DataEntity { + override fun getEntityId(): String = key fun setUpdateTime(updateTime: OffsetDateTime) { this.updateTime = updateTime @@ -70,4 +64,15 @@ class SystemSettingDo( override fun getSystemResourceKind(): SystemResourceKind = SystemSettingResourceKind -} \ No newline at end of file + + fun lock(): SystemSetting = SystemSetting(id, key, value) + + companion object { + @JvmStatic + fun SystemSetting.toEntity() = SystemSettingEntity( + id = id, + key = key, + value = value + ) + } +} diff --git a/lampray-system/setting-service/src/main/java/tech/lamprism/lampray/setting/data/SystemSettingRepository.kt b/lampray-system/setting-service/src/main/java/tech/lamprism/lampray/setting/data/SystemSettingRepository.kt index a851036a..89e1a9b9 100644 --- a/lampray-system/setting-service/src/main/java/tech/lamprism/lampray/setting/data/SystemSettingRepository.kt +++ b/lampray-system/setting-service/src/main/java/tech/lamprism/lampray/setting/data/SystemSettingRepository.kt @@ -1,5 +1,5 @@ /* - * Copyright (C) 2023 RollW + * Copyright (C) 2023-2026 RollW * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,27 +18,15 @@ package tech.lamprism.lampray.setting.data import org.springframework.stereotype.Repository import tech.lamprism.lampray.common.data.CommonRepository -import java.util.Optional /** * @author RollW */ @Repository class SystemSettingRepository( - private val systemSettingDao: SystemSettingDao -) : CommonRepository(systemSettingDao) { - fun findByKey(key: String): Optional { - return findOne { root, query, criteriaBuilder -> - criteriaBuilder.equal(root.get("key"), key) - } + systemSettingDao: SystemSettingDao +) : CommonRepository(systemSettingDao) { + override fun save(entity: S): S { + return saveAndFlush(entity) } - - fun findByKeyIn(keys: Set): List { - if (keys.isEmpty()) { - return emptyList() - } - return findAll { root, query, criteriaBuilder -> - root.get("key").`in`(keys) - } - } -} \ No newline at end of file +} diff --git a/lampray-system/setting-service/src/main/java/tech/lamprism/lampray/setting/service/SystemSettingConfigProvider.kt b/lampray-system/setting-service/src/main/java/tech/lamprism/lampray/setting/service/SystemSettingConfigProvider.kt index f1b3ba44..fec040a2 100644 --- a/lampray-system/setting-service/src/main/java/tech/lamprism/lampray/setting/service/SystemSettingConfigProvider.kt +++ b/lampray-system/setting-service/src/main/java/tech/lamprism/lampray/setting/service/SystemSettingConfigProvider.kt @@ -1,5 +1,5 @@ /* - * Copyright (C) 2023-2025 RollW + * Copyright (C) 2023-2026 RollW * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -28,7 +28,7 @@ import tech.lamprism.lampray.setting.SettingSpecification.Companion.keyName import tech.lamprism.lampray.setting.SettingSpecificationHelper import tech.lamprism.lampray.setting.SettingSpecificationProvider import tech.lamprism.lampray.setting.SnapshotConfigValue -import tech.lamprism.lampray.setting.data.SystemSettingDo +import tech.lamprism.lampray.setting.data.SystemSettingEntity import tech.lamprism.lampray.setting.data.SystemSettingRepository /** @@ -37,7 +37,7 @@ import tech.lamprism.lampray.setting.data.SystemSettingRepository @Service class SystemSettingConfigProvider( private val systemSettingRepository: SystemSettingRepository, - private val settingSpecificationProvider: SettingSpecificationProvider + private val settingSpecificationProvider: SettingSpecificationProvider, ) : ConfigProvider { override val metadata: ConfigReader.Metadata = @@ -47,7 +47,7 @@ class SystemSettingConfigProvider( ) override fun get(key: String): String? { - return systemSettingRepository.findByKey(key) + return systemSettingRepository.findById(key) .orElse(null)?.value } @@ -55,7 +55,7 @@ class SystemSettingConfigProvider( get(key) ?: defaultValue override fun get(specification: SettingSpecification): T? { - val setting = systemSettingRepository.findByKey(specification.keyName) + val setting = systemSettingRepository.findById(specification.keyName) .orElse(null) ?: return null return with(SettingSpecificationHelper) { setting.value.deserialize(specification) @@ -68,7 +68,7 @@ class SystemSettingConfigProvider( ): T = get(specification) ?: defaultValue override fun getValue(specification: SettingSpecification): ConfigValue { - val setting = systemSettingRepository.findByKey(specification.keyName) + val setting = systemSettingRepository.findById(specification.keyName) .orElse(null) ?: return SnapshotConfigValue(null, SettingSource.DATABASE, specification) return with(SettingSpecificationHelper) { SnapshotConfigValue( @@ -84,7 +84,7 @@ class SystemSettingConfigProvider( return emptyList() } val keys = specifications.map { it.keyName }.toSet() - val settings = systemSettingRepository.findByKeyIn(keys) + val settings = systemSettingRepository.findAllById(keys) .associateBy { it.key } @Suppress("UNCHECKED_CAST") return (specifications as List>).map { spec -> @@ -102,14 +102,14 @@ class SystemSettingConfigProvider( } override fun set(key: String, value: String?): SettingSource { - val setting = systemSettingRepository.findByKey(key) + val setting = systemSettingRepository.findById(key) .orElse(null) if (setting != null) { setting.value = value systemSettingRepository.save(setting) return SettingSource.DATABASE } - val newSetting = SystemSettingDo( + val newSetting = SystemSettingEntity( key = key, value = value ) @@ -118,7 +118,7 @@ class SystemSettingConfigProvider( } override fun set(spec: SettingSpecification, value: T?): SettingSource { - val setting = systemSettingRepository.findByKey(spec.keyName) + val setting = systemSettingRepository.findById(spec.keyName) .orElse(null) val value = with(SettingSpecificationHelper) { value.serialize(spec) @@ -128,7 +128,7 @@ class SystemSettingConfigProvider( systemSettingRepository.save(setting) return SettingSource.DATABASE } - val newSetting = SystemSettingDo( + val newSetting = SystemSettingEntity( key = spec.key.name, value = value ) @@ -137,7 +137,7 @@ class SystemSettingConfigProvider( } override fun reset(spec: SettingSpecification): SettingSource { - val setting = systemSettingRepository.findByKey(spec.keyName) + val setting = systemSettingRepository.findById(spec.keyName) .orElse(null) ?: return SettingSource.NONE systemSettingRepository.delete(setting) return SettingSource.DATABASE @@ -152,4 +152,4 @@ class SystemSettingConfigProvider( false } } -} \ No newline at end of file +} diff --git a/lampray-user/staff-service/src/main/java/tech/lamprism/lampray/staff/persistence/StaffDao.kt b/lampray-user/staff-service/src/main/java/tech/lamprism/lampray/staff/persistence/StaffDao.kt index fc4069f7..908e9134 100644 --- a/lampray-user/staff-service/src/main/java/tech/lamprism/lampray/staff/persistence/StaffDao.kt +++ b/lampray-user/staff-service/src/main/java/tech/lamprism/lampray/staff/persistence/StaffDao.kt @@ -1,5 +1,5 @@ /* - * Copyright (C) 2023 RollW + * Copyright (C) 2023-2026 RollW * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -23,5 +23,5 @@ import tech.lamprism.lampray.common.data.Dao * @author RollW */ @Dao -interface StaffDao : CommonDao { -} \ No newline at end of file +interface StaffDao : CommonDao { +} diff --git a/lampray-user/staff-service/src/main/java/tech/lamprism/lampray/staff/persistence/StaffDo.kt b/lampray-user/staff-service/src/main/java/tech/lamprism/lampray/staff/persistence/StaffEntity.kt similarity index 90% rename from lampray-user/staff-service/src/main/java/tech/lamprism/lampray/staff/persistence/StaffDo.kt rename to lampray-user/staff-service/src/main/java/tech/lamprism/lampray/staff/persistence/StaffEntity.kt index dd0e1075..371098fe 100644 --- a/lampray-user/staff-service/src/main/java/tech/lamprism/lampray/staff/persistence/StaffDo.kt +++ b/lampray-user/staff-service/src/main/java/tech/lamprism/lampray/staff/persistence/StaffEntity.kt @@ -1,5 +1,5 @@ /* - * Copyright (C) 2023 RollW + * Copyright (C) 2023-2026 RollW * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -44,7 +44,7 @@ import java.time.OffsetDateTime */ @Entity @Table(name = "staff") -class StaffDo( +class StaffEntity( @Id @Column(name = "id", nullable = false) @GeneratedValue(strategy = GenerationType.IDENTITY) @@ -54,9 +54,11 @@ class StaffDo( override var userId: Long = 0, @ElementCollection(targetClass = StaffType::class, fetch = FetchType.EAGER) - @CollectionTable(name = "staff_types", joinColumns = [ - JoinColumn(name = "id", referencedColumnName = "id"), - ], foreignKey = ForeignKey(name = "index__type__id")) + @CollectionTable( + name = "staff_types", joinColumns = [ + JoinColumn(name = "id", referencedColumnName = "id"), + ], foreignKey = ForeignKey(name = "index__type__id") + ) @Column(name = "type", nullable = false, length = 20) @Enumerated(EnumType.STRING) @JdbcTypeCode(SqlTypes.VARCHAR) @@ -77,13 +79,13 @@ class StaffDo( var deleted: Boolean = false ) : DataEntity, AttributedStaff { override fun getEntityId(): Long? = id - + fun setId(id: Long?) { this.id = id } override fun getCreateTime(): OffsetDateTime = createTime - + fun setCreateTime(createTime: OffsetDateTime) { this.createTime = createTime } @@ -93,14 +95,14 @@ class StaffDo( fun setUpdateTime(updateTime: OffsetDateTime) { this.updateTime = updateTime } - + override val staffId: Long get() = id!! override fun getResourceId(): Long = id!! fun lock() = Staff( - id, userId, types, createTime, updateTime, + id, userId, types, createTime, updateTime, asUser, deleted ) @@ -112,10 +114,10 @@ class StaffDo( private var updateTime: OffsetDateTime? = null private var asUser = false private var deleted = false - + constructor() - - constructor(staff: StaffDo) { + + constructor(staff: StaffEntity) { this.id = staff.id this.userId = staff.userId this.types = staff.types.toMutableSet() @@ -129,7 +131,7 @@ class StaffDo( this.id = id } - fun setUserId(userId: Long) = apply{ + fun setUserId(userId: Long) = apply { this.userId = userId } @@ -166,26 +168,26 @@ class StaffDo( fun setDeleted(deleted: Boolean) = apply { this.deleted = deleted } - - fun build() = StaffDo( + + fun build() = StaffEntity( id, userId, types ?: emptySet(), - createTime!!, - updateTime!!, + createTime!!, + updateTime!!, asUser, deleted ) } companion object { @JvmStatic - fun Staff.toDo(): StaffDo { - return StaffDo( + fun Staff.toEntity(): StaffEntity { + return StaffEntity( entityId, userId, types, createTime, updateTime, isAsUser, isDeleted ) } - + @JvmStatic fun builder() = Builder() } - -} \ No newline at end of file + +} diff --git a/lampray-user/staff-service/src/main/java/tech/lamprism/lampray/staff/persistence/StaffRepository.kt b/lampray-user/staff-service/src/main/java/tech/lamprism/lampray/staff/persistence/StaffRepository.kt index b57f74a6..1366d06e 100644 --- a/lampray-user/staff-service/src/main/java/tech/lamprism/lampray/staff/persistence/StaffRepository.kt +++ b/lampray-user/staff-service/src/main/java/tech/lamprism/lampray/staff/persistence/StaffRepository.kt @@ -1,5 +1,5 @@ /* - * Copyright (C) 2023 RollW + * Copyright (C) 2023-2026 RollW * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -26,21 +26,21 @@ import java.util.Optional */ @Repository class StaffRepository( - private val staffDao: StaffDao -) : CommonRepository(staffDao) { - fun findByUserId(userId: Long): Optional { + staffDao: StaffDao +) : CommonRepository(staffDao) { + fun findByUserId(userId: Long): Optional { return findOne { root, _, criteriaBuilder -> - criteriaBuilder.equal(root.get(StaffDo_.userId), userId) + criteriaBuilder.equal(root.get(StaffEntity_.userId), userId) } } - fun findByTypes(types: Set): List { + fun findByTypes(types: Set): List { return findAll { root, _, criteriaBuilder -> criteriaBuilder.and( *types.map { - criteriaBuilder.isMember(it, root.get(StaffDo_.types)) + criteriaBuilder.isMember(it, root.get(StaffEntity_.types)) }.toTypedArray() ) } } -} \ No newline at end of file +} diff --git a/lampray-user/staff-service/src/main/java/tech/lamprism/lampray/staff/service/CreateStaffOnUserCreateListener.java b/lampray-user/staff-service/src/main/java/tech/lamprism/lampray/staff/service/CreateStaffOnUserCreateListener.java index 557cb489..fdd0ea1b 100644 --- a/lampray-user/staff-service/src/main/java/tech/lamprism/lampray/staff/service/CreateStaffOnUserCreateListener.java +++ b/lampray-user/staff-service/src/main/java/tech/lamprism/lampray/staff/service/CreateStaffOnUserCreateListener.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2023-2025 RollW + * Copyright (C) 2023-2026 RollW * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -21,7 +21,7 @@ import org.springframework.stereotype.Component; import space.lingu.NonNull; import tech.lamprism.lampray.staff.StaffType; -import tech.lamprism.lampray.staff.persistence.StaffDo; +import tech.lamprism.lampray.staff.persistence.StaffEntity; import tech.lamprism.lampray.staff.persistence.StaffRepository; import tech.lamprism.lampray.user.AttributedUser; import tech.lamprism.lampray.user.Role; @@ -50,7 +50,7 @@ public void onApplicationEvent(@NonNull NewUserCreatedEvent event) { } OffsetDateTime now = OffsetDateTime.now(); StaffType type = StaffType.of(attributedUser.getRole()); - StaffDo staff = StaffDo.builder() + StaffEntity staff = StaffEntity.builder() .setUserId(attributedUser.getUserId()) .setCreateTime(now) .setUpdateTime(now) diff --git a/lampray-user/staff-service/src/main/java/tech/lamprism/lampray/staff/service/StaffServiceImpl.java b/lampray-user/staff-service/src/main/java/tech/lamprism/lampray/staff/service/StaffServiceImpl.java index e9df1d13..0d121fde 100644 --- a/lampray-user/staff-service/src/main/java/tech/lamprism/lampray/staff/service/StaffServiceImpl.java +++ b/lampray-user/staff-service/src/main/java/tech/lamprism/lampray/staff/service/StaffServiceImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2023 RollW + * Copyright (C) 2023-2026 RollW * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,7 +20,7 @@ import tech.lamprism.lampray.LampException; import tech.lamprism.lampray.staff.StaffInfo; import tech.lamprism.lampray.staff.StaffService; -import tech.lamprism.lampray.staff.persistence.StaffDo; +import tech.lamprism.lampray.staff.persistence.StaffEntity; import tech.lamprism.lampray.staff.persistence.StaffRepository; import tech.lamprism.lampray.user.UserIdentity; import tech.lamprism.lampray.user.UserProvider; @@ -42,7 +42,7 @@ public StaffServiceImpl(StaffRepository staffRepository, @Override public StaffInfo getStaffByUser(long userId) { - StaffDo staff = staffRepository.findByUserId(userId).orElse(null); + StaffEntity staff = staffRepository.findByUserId(userId).orElse(null); if (staff == null) { throw new LampException(DataErrorCode.ERROR_DATA_NOT_EXIST); } @@ -52,7 +52,7 @@ public StaffInfo getStaffByUser(long userId) { @Override public StaffInfo getStaff(long staffId) { - StaffDo staff = staffRepository.findById(staffId).orElse(null); + StaffEntity staff = staffRepository.findById(staffId).orElse(null); if (staff == null) { throw new LampException(DataErrorCode.ERROR_DATA_NOT_EXIST); } diff --git a/lampray-user/user-details-api/src/main/java/tech/lamprism/lampray/user/details/UserPersonalData.java b/lampray-user/user-details-api/src/main/java/tech/lamprism/lampray/user/details/UserPersonalData.java index d814875d..74c2f631 100644 --- a/lampray-user/user-details-api/src/main/java/tech/lamprism/lampray/user/details/UserPersonalData.java +++ b/lampray-user/user-details-api/src/main/java/tech/lamprism/lampray/user/details/UserPersonalData.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2023 RollW + * Copyright (C) 2023-2026 RollW * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -100,7 +100,7 @@ public String getWebsite() { @Override public Long getEntityId() { - return getUserId(); + return userId; } @NonNull @@ -141,7 +141,6 @@ public static UserPersonalData defaultOf(UserIdentity user) { .build(); } - public static boolean checkNecessaryFields( @NonNull UserPersonalData userPersonalData) { Preconditions.checkNotNull(userPersonalData); @@ -187,11 +186,12 @@ public Builder(UserPersonalData userPersonalData) { this.introduction = userPersonalData.introduction; this.location = userPersonalData.location; this.website = userPersonalData.website; + this.updateTime = userPersonalData.updateTime; } @Override public Builder setEntityId(Long id) { - return this; + return setUserId(Preconditions.checkNotNull(id)); } public Builder setUserId(long userId) { diff --git a/lampray-user/user-details-service/src/main/java/tech/lamprism/lampray/user/details/persistence/UserPersonalDataDao.kt b/lampray-user/user-details-service/src/main/java/tech/lamprism/lampray/user/details/persistence/UserPersonalDataDao.kt index b5550eef..1a1fb443 100644 --- a/lampray-user/user-details-service/src/main/java/tech/lamprism/lampray/user/details/persistence/UserPersonalDataDao.kt +++ b/lampray-user/user-details-service/src/main/java/tech/lamprism/lampray/user/details/persistence/UserPersonalDataDao.kt @@ -1,5 +1,5 @@ /* - * Copyright (C) 2023 RollW + * Copyright (C) 2023-2026 RollW * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -23,5 +23,4 @@ import tech.lamprism.lampray.common.data.Dao * @author RollW */ @Dao -interface UserPersonalDataDao : CommonDao { -} \ No newline at end of file +interface UserPersonalDataDao : CommonDao diff --git a/lampray-user/user-details-service/src/main/java/tech/lamprism/lampray/user/details/persistence/UserPersonalDataDo.kt b/lampray-user/user-details-service/src/main/java/tech/lamprism/lampray/user/details/persistence/UserPersonalDataEntity.kt similarity index 77% rename from lampray-user/user-details-service/src/main/java/tech/lamprism/lampray/user/details/persistence/UserPersonalDataDo.kt rename to lampray-user/user-details-service/src/main/java/tech/lamprism/lampray/user/details/persistence/UserPersonalDataEntity.kt index 4e1f5276..d3b89d89 100644 --- a/lampray-user/user-details-service/src/main/java/tech/lamprism/lampray/user/details/persistence/UserPersonalDataDo.kt +++ b/lampray-user/user-details-service/src/main/java/tech/lamprism/lampray/user/details/persistence/UserPersonalDataEntity.kt @@ -1,5 +1,5 @@ /* - * Copyright (C) 2023 RollW + * Copyright (C) 2023-2026 RollW * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -42,10 +42,10 @@ import java.time.OffsetDateTime */ @Entity @Table(name = "user_personal_data") -class UserPersonalDataDo( +class UserPersonalDataEntity( @Id @Column(name = "id", nullable = false) - private var id: Long = 0, + private var userId: Long = 0, @Column(name = "nickname", nullable = false, length = 120) var nickname: String = "", @@ -78,7 +78,13 @@ class UserPersonalDataDo( @Temporal(TemporalType.TIMESTAMP) private var updateTime: OffsetDateTime = OffsetDateTime.now() ) : DataEntity { - override fun getEntityId(): Long = id + override fun getEntityId(): Long = userId + + fun getUserId(): Long = userId + + fun setUserId(userId: Long) { + this.userId = userId + } override fun getSystemResourceKind(): SystemResourceKind = UserResourceKind @@ -98,14 +104,22 @@ class UserPersonalDataDo( } fun lock() = UserPersonalData( - id, nickname, avatar, cover, birthday, introduction, - gender, location, website, updateTime + userId, + nickname, + avatar, + cover, + birthday, + introduction, + gender, + location, + website, + updateTime ) fun toBuilder() = Builder(this) class Builder { - private var id: Long = 0 + private var userId: Long = 0 private var nickname: String? = null private var avatar: String? = null private var cover: String? = null @@ -118,8 +132,8 @@ class UserPersonalDataDo( constructor() - constructor(other: UserPersonalDataDo) { - this.id = other.id + constructor(other: UserPersonalDataEntity) { + this.userId = other.userId this.nickname = other.nickname this.avatar = other.avatar this.cover = other.cover @@ -131,8 +145,8 @@ class UserPersonalDataDo( this.updateTime = other.updateTime } - fun setId(id: Long) = apply { - this.id = id + fun setUserId(userId: Long) = apply { + this.userId = userId } fun setNickname(nickname: String) = apply { @@ -171,30 +185,38 @@ class UserPersonalDataDo( this.updateTime = updateTime } - fun build(): UserPersonalDataDo { - return UserPersonalDataDo( - id, - nickname!!, - avatar!!, - cover!!, - birthday!!, - introduction, - gender!!, - location, - website, - updateTime!! + fun build(): UserPersonalDataEntity { + return UserPersonalDataEntity( + userId = userId, + nickname = nickname!!, + avatar = avatar!!, + cover = cover!!, + birthday = birthday!!, + introduction = introduction, + gender = gender!!, + location = location, + website = website, + updateTime = updateTime!! ) } } companion object { @JvmStatic - fun UserPersonalData.toDo() = UserPersonalDataDo( - entityId, nickname, avatar, cover, birthday, introduction, - gender, location, website, updateTime + fun UserPersonalData.toEntity() = UserPersonalDataEntity( + userId = entityId, + nickname = nickname, + avatar = avatar, + cover = cover, + birthday = birthday, + introduction = introduction, + gender = gender, + location = location, + website = website, + updateTime = updateTime ) @JvmStatic fun builder() = Builder() } -} \ No newline at end of file +} diff --git a/lampray-user/user-details-service/src/main/java/tech/lamprism/lampray/user/details/persistence/UserPersonalDataRepository.kt b/lampray-user/user-details-service/src/main/java/tech/lamprism/lampray/user/details/persistence/UserPersonalDataRepository.kt index 64c1339e..fc7f7fbd 100644 --- a/lampray-user/user-details-service/src/main/java/tech/lamprism/lampray/user/details/persistence/UserPersonalDataRepository.kt +++ b/lampray-user/user-details-service/src/main/java/tech/lamprism/lampray/user/details/persistence/UserPersonalDataRepository.kt @@ -1,5 +1,5 @@ /* - * Copyright (C) 2023 RollW + * Copyright (C) 2023-2026 RollW * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -24,6 +24,6 @@ import tech.lamprism.lampray.common.data.CommonRepository */ @Repository class UserPersonalDataRepository( - private val userPersonalDataDao: UserPersonalDataDao -) : CommonRepository(userPersonalDataDao) { -} \ No newline at end of file + userPersonalDataDao: UserPersonalDataDao +) : CommonRepository(userPersonalDataDao) { +} diff --git a/lampray-user/user-details-service/src/main/java/tech/lamprism/lampray/user/details/service/UserPersonalDataServiceImpl.java b/lampray-user/user-details-service/src/main/java/tech/lamprism/lampray/user/details/service/UserPersonalDataServiceImpl.java index 41a9b3c8..100de6ea 100644 --- a/lampray-user/user-details-service/src/main/java/tech/lamprism/lampray/user/details/service/UserPersonalDataServiceImpl.java +++ b/lampray-user/user-details-service/src/main/java/tech/lamprism/lampray/user/details/service/UserPersonalDataServiceImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2023 RollW + * Copyright (C) 2023-2026 RollW * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -25,7 +25,7 @@ import tech.lamprism.lampray.user.details.UserDataFieldType; import tech.lamprism.lampray.user.details.UserPersonalData; import tech.lamprism.lampray.user.details.UserPersonalDataService; -import tech.lamprism.lampray.user.details.persistence.UserPersonalDataDo; +import tech.lamprism.lampray.user.details.persistence.UserPersonalDataEntity; import tech.lamprism.lampray.user.details.persistence.UserPersonalDataRepository; import java.time.OffsetDateTime; @@ -47,8 +47,7 @@ public UserPersonalDataServiceImpl(UserProvider userProvider, @Override public UserPersonalData getPersonalData(long userId) { - UserPersonalDataDo data = userPersonalDataRepository.findById(userId) - .orElse(null); + UserPersonalDataEntity data = userPersonalDataRepository.findById(userId).orElse(null); if (data == null) { AttributedUser user = userProvider.getUser(userId); return UserPersonalData.defaultOf(user); @@ -63,8 +62,7 @@ public UserPersonalData getPersonalData(long userId) { @Override public UserPersonalData getPersonalData(UserIdentity userIdentity) { - UserPersonalDataDo data = userPersonalDataRepository.findById( - userIdentity.getUserId()).orElse(null); + UserPersonalDataEntity data = userPersonalDataRepository.findById(userIdentity.getUserId()).orElse(null); if (data == null) { return UserPersonalData.defaultOf(userIdentity); } @@ -98,7 +96,7 @@ public List getPersonalData(List userI public List getPersonalDataByIds(List ids) { return userPersonalDataRepository.findAllById(ids) .stream() - .map(UserPersonalDataDo::lock) + .map(UserPersonalDataEntity::lock) .toList(); } @@ -113,9 +111,8 @@ public void updatePersonalData(UserTrait user, UserDataField... fields) { if (fields.length == 0) { return; } - UserPersonalDataDo exist = userPersonalDataRepository.findById(user.getUserId()) - .orElse(null); - UserPersonalDataDo.Builder builder = toBuilder(exist); + UserPersonalDataEntity exist = userPersonalDataRepository.findById(user.getUserId()).orElse(null); + UserPersonalDataEntity.Builder builder = toBuilder(exist, user.getUserId()); for (UserDataField field : fields) { Utils.setBuilderValue(builder, field); } @@ -123,10 +120,11 @@ public void updatePersonalData(UserTrait user, UserDataField... fields) { userPersonalDataRepository.save(builder.build()); } - private UserPersonalDataDo.Builder toBuilder(UserPersonalDataDo data) { + private UserPersonalDataEntity.Builder toBuilder(UserPersonalDataEntity data, long userId) { if (data != null) { return data.toBuilder(); } - return UserPersonalDataDo.builder(); + return UserPersonalDataEntity.builder() + .setUserId(userId); } } diff --git a/lampray-user/user-details-service/src/main/java/tech/lamprism/lampray/user/details/service/Utils.kt b/lampray-user/user-details-service/src/main/java/tech/lamprism/lampray/user/details/service/Utils.kt index 8013c92b..72d8f04b 100644 --- a/lampray-user/user-details-service/src/main/java/tech/lamprism/lampray/user/details/service/Utils.kt +++ b/lampray-user/user-details-service/src/main/java/tech/lamprism/lampray/user/details/service/Utils.kt @@ -1,5 +1,5 @@ /* - * Copyright (C) 2023 RollW + * Copyright (C) 2023-2026 RollW * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,14 +20,14 @@ import tech.lamprism.lampray.user.details.Birthday import tech.lamprism.lampray.user.details.Gender import tech.lamprism.lampray.user.details.UserDataField import tech.lamprism.lampray.user.details.UserDataFieldType -import tech.lamprism.lampray.user.details.persistence.UserPersonalDataDo +import tech.lamprism.lampray.user.details.persistence.UserPersonalDataEntity /** * @author RollW */ internal object Utils { @JvmStatic - fun UserPersonalDataDo.Builder.setBuilderValue(field: UserDataField<*>) { + fun UserPersonalDataEntity.Builder.setBuilderValue(field: UserDataField<*>) { when (field.type()) { UserDataFieldType.AVATAR -> setAvatar(field.value() as String) UserDataFieldType.INTRO -> setIntroduction(field.value() as String) diff --git a/lampray-user/user-service/src/main/java/tech/lamprism/lampray/user/repository/UserDao.kt b/lampray-user/user-service/src/main/java/tech/lamprism/lampray/user/repository/UserDao.kt index eff57074..00832192 100644 --- a/lampray-user/user-service/src/main/java/tech/lamprism/lampray/user/repository/UserDao.kt +++ b/lampray-user/user-service/src/main/java/tech/lamprism/lampray/user/repository/UserDao.kt @@ -1,5 +1,5 @@ /* - * Copyright (C) 2023-2025 RollW + * Copyright (C) 2023-2026 RollW * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -21,5 +21,5 @@ import tech.lamprism.lampray.common.data.Dao @Dao @JvmDefaultWithoutCompatibility -interface UserDao : CommonDao { -} \ No newline at end of file +interface UserDao : CommonDao { +} diff --git a/lampray-user/user-service/src/main/java/tech/lamprism/lampray/user/repository/UserDo.kt b/lampray-user/user-service/src/main/java/tech/lamprism/lampray/user/repository/UserEntity.kt similarity index 96% rename from lampray-user/user-service/src/main/java/tech/lamprism/lampray/user/repository/UserDo.kt rename to lampray-user/user-service/src/main/java/tech/lamprism/lampray/user/repository/UserEntity.kt index f1cdc3fc..f297d136 100644 --- a/lampray-user/user-service/src/main/java/tech/lamprism/lampray/user/repository/UserDo.kt +++ b/lampray-user/user-service/src/main/java/tech/lamprism/lampray/user/repository/UserEntity.kt @@ -1,5 +1,5 @@ /* - * Copyright (C) 2023 RollW + * Copyright (C) 2023-2026 RollW * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -47,7 +47,7 @@ import java.time.OffsetDateTime UniqueConstraint(columnNames = ["username"], name = "index__username") ] ) -class UserDo( +class UserEntity( @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "id") @@ -170,7 +170,7 @@ class UserDo( } override fun toString(): String { - return "UserDo{" + + return "UserEntity{" + "id=" + id + ", username='" + username + '\'' + ", password='" + password + '\'' + @@ -210,7 +210,7 @@ class UserDo( constructor() - constructor(other: UserDo) { + constructor(other: UserEntity) { this.id = other.id this.username = other.username this.password = other.password @@ -268,8 +268,8 @@ class UserDo( this.canceled = canceled } - fun build(): UserDo { - return UserDo( + fun build(): UserEntity { + return UserEntity( id, username, password, @@ -287,8 +287,8 @@ class UserDo( companion object { @JvmStatic - fun User.toDo(): UserDo { - return UserDo( + fun User.toEntity(): UserEntity { + return UserEntity( entityId, username, password, role, registerTime, updateTime, email, phone, isEnabled, isLocked, isCanceled diff --git a/lampray-user/user-service/src/main/java/tech/lamprism/lampray/user/repository/UserRepository.kt b/lampray-user/user-service/src/main/java/tech/lamprism/lampray/user/repository/UserRepository.kt index e5a3f600..a11eddf0 100644 --- a/lampray-user/user-service/src/main/java/tech/lamprism/lampray/user/repository/UserRepository.kt +++ b/lampray-user/user-service/src/main/java/tech/lamprism/lampray/user/repository/UserRepository.kt @@ -1,5 +1,5 @@ /* - * Copyright (C) 2023-2025 RollW + * Copyright (C) 2023-2026 RollW * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -26,22 +26,22 @@ import java.util.Optional */ @Repository class UserRepository( - private val userDao: UserDao -) : CommonRepository(userDao) { + userDao: UserDao +) : CommonRepository(userDao) { - fun searchBy(keyword: String): List { - return userDao.findAll(createSearchBySpec(keyword)) + fun searchBy(keyword: String): List { + return findAll(createSearchBySpec(keyword)) } - fun findByUsername(username: String): Optional { + fun findByUsername(username: String): Optional { return findOne { root, _, criteriaBuilder -> - criteriaBuilder.equal(root.get(UserDo_.username), username) + criteriaBuilder.equal(root.get(UserEntity_.username), username) } } - fun findByEmail(email: String): Optional { + fun findByEmail(email: String): Optional { return findOne { root, _, criteriaBuilder -> - criteriaBuilder.equal(root.get(UserDo_.email), email) + criteriaBuilder.equal(root.get(UserEntity_.email), email) } } @@ -54,11 +54,11 @@ class UserRepository( } fun hasUsers(): Boolean { - return userDao.count() > 0 + return count() > 0 } - private fun createSearchBySpec(keyword: String) = - Specification { root, _, builder -> - builder.like(root.get(UserDo_.username), keyword) + private fun createSearchBySpec(keyword: String): Specification = + Specification { root, _, builder -> + builder.like(root.get(UserEntity_.username), keyword) } -} \ No newline at end of file +} diff --git a/lampray-user/user-service/src/main/java/tech/lamprism/lampray/user/service/UserProviderService.java b/lampray-user/user-service/src/main/java/tech/lamprism/lampray/user/service/UserProviderService.java index 1338bfd4..b36a716e 100644 --- a/lampray-user/user-service/src/main/java/tech/lamprism/lampray/user/service/UserProviderService.java +++ b/lampray-user/user-service/src/main/java/tech/lamprism/lampray/user/service/UserProviderService.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2023-2025 RollW + * Copyright (C) 2023-2026 RollW * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -24,7 +24,7 @@ import tech.lamprism.lampray.user.UserResourceKind; import tech.lamprism.lampray.user.UserViewException; import tech.lamprism.lampray.user.filter.UserInfoFilter; -import tech.lamprism.lampray.user.repository.UserDo; +import tech.lamprism.lampray.user.repository.UserEntity; import tech.lamprism.lampray.user.repository.UserRepository; import tech.rollw.common.web.CommonRuntimeException; import tech.rollw.common.web.UserErrorCode; @@ -82,8 +82,8 @@ public AttributedUser provide(@NonNull SystemResource rawSystemResource) return getUser(rawSystemResource.getResourceId()); } - private UserDo getUser(long id) { - UserDo user = userRepository.findById(id).orElse(null); + private UserEntity getUser(long id) { + UserEntity user = userRepository.findById(id).orElse(null); if (user == null) { throw new UserViewException(UserErrorCode.ERROR_USER_NOT_EXIST); } @@ -92,12 +92,12 @@ private UserDo getUser(long id) { @Override public void updateUser(User user) { - userRepository.save(UserDo.toDo(user)); + userRepository.save(UserEntity.toEntity(user)); } @Override public boolean checkUsernameExist(String username, long id) { - UserDo user = userRepository.findByUsername(username).orElse(null); + UserEntity user = userRepository.findByUsername(username).orElse(null); if (user == null) { return false; } @@ -109,7 +109,7 @@ public boolean checkUsernameExist(String username, long id) { @Override public boolean checkEmailExist(String email, long id) { - UserDo user = userRepository.findByEmail(email).orElse(null); + UserEntity user = userRepository.findByEmail(email).orElse(null); if (user == null) { return false; } diff --git a/lampray-user/user-service/src/main/java/tech/lamprism/lampray/user/service/UserServiceImpl.java b/lampray-user/user-service/src/main/java/tech/lamprism/lampray/user/service/UserServiceImpl.java index 3da25a1b..e197ca77 100644 --- a/lampray-user/user-service/src/main/java/tech/lamprism/lampray/user/service/UserServiceImpl.java +++ b/lampray-user/user-service/src/main/java/tech/lamprism/lampray/user/service/UserServiceImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2023-2025 RollW + * Copyright (C) 2023-2026 RollW * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -33,7 +33,7 @@ import tech.lamprism.lampray.user.filter.UserFilteringInfo; import tech.lamprism.lampray.user.filter.UserFilteringInfoType; import tech.lamprism.lampray.user.filter.UserInfoFilter; -import tech.lamprism.lampray.user.repository.UserDo; +import tech.lamprism.lampray.user.repository.UserEntity; import tech.lamprism.lampray.user.repository.UserRepository; import tech.rollw.common.web.ErrorCode; import tech.rollw.common.web.UserErrorCode; @@ -66,7 +66,7 @@ public UserServiceImpl(UserRepository userRepository, @Override public String getSignature(long userId) { - UserDo user = userRepository.findById(userId).orElse(null); + UserEntity user = userRepository.findById(userId).orElse(null); if (user == null) { return null; } @@ -86,7 +86,7 @@ public AttributedUser createUser(String username, String password, validate(username, password, email); OffsetDateTime time = OffsetDateTime.now(); - UserDo user = UserDo.builder() + UserEntity user = UserEntity.builder() .setUsername(username) .setPassword(passwordEncoder.encode(password)) .setRole(role) @@ -95,7 +95,7 @@ public AttributedUser createUser(String username, String password, .setUpdateTime(time) .setEmail(email) .build(); - UserDo inserted = userRepository.save(user); + UserEntity inserted = userRepository.save(user); NewUserCreatedEvent newUserCreatedEvent = new NewUserCreatedEvent(inserted); eventPublisher.publishEvent(newUserCreatedEvent); return inserted; @@ -119,7 +119,7 @@ private void validate(String username, @Override public AttributedUserDetails getUser(long userId) throws UserViewException { - UserDo user = userRepository.findById(userId).orElse(null); + UserEntity user = userRepository.findById(userId).orElse(null); if (user == null) { throw new UserViewException(UserErrorCode.ERROR_USER_NOT_EXIST); } @@ -128,7 +128,7 @@ public AttributedUserDetails getUser(long userId) throws UserViewException { @Override public AttributedUserDetails getUser(String username) throws UserViewException { - UserDo user = userRepository.findByUsername(username).orElse(null); + UserEntity user = userRepository.findByUsername(username).orElse(null); if (user == null) { throw new UserViewException(UserErrorCode.ERROR_USER_NOT_EXIST); } @@ -137,7 +137,7 @@ public AttributedUserDetails getUser(String username) throws UserViewException { @Override public AttributedUserDetails getUserByEmail(String email) throws UserViewException { - UserDo user = userRepository.findByEmail(email).orElse(null); + UserEntity user = userRepository.findByEmail(email).orElse(null); if (user == null) { throw new UserViewException(UserErrorCode.ERROR_USER_NOT_EXIST); } diff --git a/lampray-web/src/main/java/tech/lamprism/lampray/system/database/LiquibaseInitializeConfiguration.java b/lampray-web/src/main/java/tech/lamprism/lampray/system/database/LiquibaseInitializeConfiguration.java index bd47f47d..25414302 100644 --- a/lampray-web/src/main/java/tech/lamprism/lampray/system/database/LiquibaseInitializeConfiguration.java +++ b/lampray-web/src/main/java/tech/lamprism/lampray/system/database/LiquibaseInitializeConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2023-2025 RollW + * Copyright (C) 2023-2026 RollW * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -19,6 +19,10 @@ import liquibase.Contexts; import liquibase.LabelExpression; import liquibase.Liquibase; +import liquibase.Scope; +import liquibase.changelog.ChangeLogHistoryService; +import liquibase.changelog.ChangeLogHistoryServiceFactory; +import liquibase.changelog.ChangeSet; import liquibase.database.Database; import liquibase.database.DatabaseFactory; import liquibase.database.jvm.JdbcConnection; @@ -35,6 +39,7 @@ import java.sql.ResultSet; import java.sql.SQLException; import java.util.List; +import java.util.Locale; /** * Liquibase initialization configuration for database migration management. @@ -46,6 +51,7 @@ public class LiquibaseInitializeConfiguration { private static final Logger logger = LoggerFactory.getLogger(LiquibaseInitializeConfiguration.class); private static final String CHANGELOG_PATH = "classpath:db/changelog.yaml"; + private static final String BASELINE_CHANGELOG_PATH_PREFIX = "db/baseline/"; private static final String BASELINE_CONTEXT = "baseline"; private static final String INCREMENTAL_CONTEXT = "incremental"; @@ -78,7 +84,7 @@ public SpringLiquibase springLiquibase(DataSource dataSource) throws Exception { switch (status) { case NEW_INSTALL -> handleNewInstallationSync(dataSource, liquibase); - case NORMAL_UPGRADE -> handleNormalUpgradeSync(dataSource, liquibase); + case NORMAL_UPGRADE -> handleNormalUpgradeSync(dataSource); } return liquibase; @@ -156,8 +162,8 @@ private void handleNewInstallationSync(DataSource dataSource, SpringLiquibase sp } - private void handleNormalUpgradeSync(DataSource dataSource, SpringLiquibase springLiquibase) throws Exception { - logger.info("Normal upgrade detected: syncing baseline changeSets..."); + private void handleNormalUpgradeSync(DataSource dataSource) throws Exception { + logger.info("Normal upgrade detected: refreshing mutable baseline checksums and syncing baseline changeSets..."); try (Connection connection = dataSource.getConnection()) { Database database = DatabaseFactory.getInstance() @@ -168,12 +174,67 @@ private void handleNormalUpgradeSync(DataSource dataSource, SpringLiquibase spri new ClassLoaderResourceAccessor(), database ); + + refreshMutableBaselineChecksums(liquibase, database); syncChangeSetsByContext(liquibase, BASELINE_CONTEXT); logger.info("Normal upgrade sync completed: baseline changeSets marked as executed, " + "future incremental changeSets will be applied on upgrades."); } } + private void refreshMutableBaselineChecksums(Liquibase liquibase, Database database) throws Exception { + ChangeLogHistoryService changeLogHistoryService = Scope.getCurrentScope() + .getSingleton(ChangeLogHistoryServiceFactory.class) + .getChangeLogService(database); + int refreshedChecksums = 0; + + for (ChangeSet changeSet : liquibase.getDatabaseChangeLog().getChangeSets()) { + if (!isMutableBaselineChangeSet(changeSet)) { + continue; + } + + ChangeSet.RunStatus runStatus = database.getRunStatus(changeSet); + if (runStatus == ChangeSet.RunStatus.INVALID_MD5SUM || runStatus == ChangeSet.RunStatus.RUN_AGAIN) { + changeLogHistoryService.replaceChecksum(changeSet); + refreshedChecksums++; + logger.info("Refreshed checksum for mutable baseline changeset {}::{}::{}", + changeSet.getFilePath(), changeSet.getId(), changeSet.getAuthor()); + } + } + + if (refreshedChecksums > 0) { + logger.info("Refreshed {} mutable baseline checksum(s) before Liquibase validation.", refreshedChecksums); + } + } + + private boolean isMutableBaselineChangeSet(ChangeSet changeSet) { + return hasBaselinePath(changeSet.getFilePath()) + || hasBaselinePath(changeSet.getStoredFilePath()) + || hasBaselineContext(changeSet); + } + + private boolean hasBaselinePath(String filePath) { + if (filePath == null) { + return false; + } + + String normalizedPath = filePath.replace('\\', '/'); + if (normalizedPath.startsWith("classpath:")) { + normalizedPath = normalizedPath.substring("classpath:".length()); + } + + return normalizedPath.startsWith(BASELINE_CHANGELOG_PATH_PREFIX) + || normalizedPath.contains("/" + BASELINE_CHANGELOG_PATH_PREFIX); + } + + private boolean hasBaselineContext(ChangeSet changeSet) { + if (changeSet.getContextFilter() == null) { + return false; + } + + return changeSet.getContextFilter().toString().toLowerCase(Locale.ROOT).contains(BASELINE_CONTEXT); + } + private void handleLegacyMigrationSync(DataSource dataSource) throws Exception { logger.info("Legacy migration detected: syncing baseline changeSets..."); diff --git a/lampray-web/src/main/java/tech/lamprism/lampray/web/controller/article/ArticleManageController.java b/lampray-web/src/main/java/tech/lamprism/lampray/web/controller/article/ArticleManageController.java index 621587c8..4631ef9d 100644 --- a/lampray-web/src/main/java/tech/lamprism/lampray/web/controller/article/ArticleManageController.java +++ b/lampray-web/src/main/java/tech/lamprism/lampray/web/controller/article/ArticleManageController.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2023 RollW + * Copyright (C) 2023-2026 RollW * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,8 +18,6 @@ import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; -import tech.lamprism.lampray.web.controller.AdminApi; -import tech.lamprism.lampray.web.controller.article.model.ArticleMetaVo; import tech.lamprism.lampray.content.ContentAccessService; import tech.lamprism.lampray.content.ContentIdentity; import tech.lamprism.lampray.content.ContentMetadataDetails; @@ -27,6 +25,8 @@ import tech.lamprism.lampray.content.ContentType; import tech.lamprism.lampray.content.common.ContentErrorCode; import tech.lamprism.lampray.content.common.ContentException; +import tech.lamprism.lampray.web.controller.AdminApi; +import tech.lamprism.lampray.web.controller.article.model.ArticleMetaVo; import tech.rollw.common.web.HttpResponseEntity; /** @@ -46,7 +46,7 @@ public ArticleManageController(ContentPublishProvider contentPublishProvider, @GetMapping("/users/{userId}/articles/{articleId}") public HttpResponseEntity getArticle( @PathVariable("userId") Long userId, - @PathVariable("articleId") Long articleId) { + @PathVariable("articleId") String articleId) { ContentMetadataDetails contentMetadataDetails = contentAccessService.getContentMetadataDetails( ContentIdentity.of(articleId, ContentType.ARTICLE) diff --git a/lampray-web/src/main/java/tech/lamprism/lampray/web/controller/article/model/ArticleInfoView.java b/lampray-web/src/main/java/tech/lamprism/lampray/web/controller/article/model/ArticleInfoView.java index d22c966d..9ab4be7c 100644 --- a/lampray-web/src/main/java/tech/lamprism/lampray/web/controller/article/model/ArticleInfoView.java +++ b/lampray-web/src/main/java/tech/lamprism/lampray/web/controller/article/model/ArticleInfoView.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2023-2025 RollW + * Copyright (C) 2023-2026 RollW * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -28,7 +28,7 @@ * @author RollW */ public record ArticleInfoView( - long id, + String id, long userId, String title, String cover, diff --git a/lampray-web/src/main/java/tech/lamprism/lampray/web/controller/article/model/ArticleMetaVo.java b/lampray-web/src/main/java/tech/lamprism/lampray/web/controller/article/model/ArticleMetaVo.java index 0d0f5c31..b72f4624 100644 --- a/lampray-web/src/main/java/tech/lamprism/lampray/web/controller/article/model/ArticleMetaVo.java +++ b/lampray-web/src/main/java/tech/lamprism/lampray/web/controller/article/model/ArticleMetaVo.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2023 RollW + * Copyright (C) 2023-2026 RollW * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -28,7 +28,7 @@ * @author RollW */ public record ArticleMetaVo( - long id, + String id, String title, StructuralText content, long authorId, diff --git a/lampray-web/src/main/java/tech/lamprism/lampray/web/controller/article/model/ArticleVo.java b/lampray-web/src/main/java/tech/lamprism/lampray/web/controller/article/model/ArticleVo.java index bf5486e3..3c5da4d6 100644 --- a/lampray-web/src/main/java/tech/lamprism/lampray/web/controller/article/model/ArticleVo.java +++ b/lampray-web/src/main/java/tech/lamprism/lampray/web/controller/article/model/ArticleVo.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2023 RollW + * Copyright (C) 2023-2026 RollW * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -29,7 +29,7 @@ * @author RollW */ public record ArticleVo( - long id, + String id, String title, StructuralText content, long userId, diff --git a/lampray-web/src/main/java/tech/lamprism/lampray/web/controller/comment/CommentController.kt b/lampray-web/src/main/java/tech/lamprism/lampray/web/controller/comment/CommentController.kt index 9a7af89c..ee60a304 100644 --- a/lampray-web/src/main/java/tech/lamprism/lampray/web/controller/comment/CommentController.kt +++ b/lampray-web/src/main/java/tech/lamprism/lampray/web/controller/comment/CommentController.kt @@ -1,5 +1,5 @@ /* - * Copyright (C) 2023-2025 RollW + * Copyright (C) 2023-2026 RollW * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -47,7 +47,7 @@ class CommentController( ) { @PostMapping("/{contentType}/{contentId}/comments") fun createComment( - @PathVariable("contentId") contentId: Long, + @PathVariable("contentId") contentId: String, @PathVariable("contentType") type: String, @RequestBody commentRequest: CommentRequest ): HttpResponseEntity { @@ -77,7 +77,7 @@ class CommentController( @GetMapping("/{contentType}/{contentId}/comments") fun getComments( - @PathVariable("contentId") contentId: Long, + @PathVariable("contentId") contentId: String, @PathVariable("contentType") type: String ): HttpResponseEntity> { val contentType = getContentType(type) @@ -105,7 +105,7 @@ class CommentController( .context val user = context.user!! val contents = contentCollectionProviderFactory.getContents( - ContentCollectionIdentity.of(user.userId, ContentCollectionType.USER_COMMENTS), + ContentCollectionIdentity.of(user.userId.toString(), ContentCollectionType.USER_COMMENTS), ContentAccessCredentials.NO_LIMIT ).mapNotNull { CommentVo.of(it.contentDetails) diff --git a/lampray-web/src/main/java/tech/lamprism/lampray/web/controller/comment/model/CommentRequest.java b/lampray-web/src/main/java/tech/lamprism/lampray/web/controller/comment/model/CommentRequest.java index f7727010..87fa282f 100644 --- a/lampray-web/src/main/java/tech/lamprism/lampray/web/controller/comment/model/CommentRequest.java +++ b/lampray-web/src/main/java/tech/lamprism/lampray/web/controller/comment/model/CommentRequest.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2023 RollW + * Copyright (C) 2023-2026 RollW * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -23,6 +23,6 @@ */ public record CommentRequest( StructuralText content, - Long parent + String parent ) { } diff --git a/lampray-web/src/main/java/tech/lamprism/lampray/web/controller/comment/model/CommentVo.kt b/lampray-web/src/main/java/tech/lamprism/lampray/web/controller/comment/model/CommentVo.kt index 9da2fadd..d602b25c 100644 --- a/lampray-web/src/main/java/tech/lamprism/lampray/web/controller/comment/model/CommentVo.kt +++ b/lampray-web/src/main/java/tech/lamprism/lampray/web/controller/comment/model/CommentVo.kt @@ -1,5 +1,5 @@ /* - * Copyright (C) 2023 RollW + * Copyright (C) 2023-2026 RollW * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -26,17 +26,17 @@ import java.time.OffsetDateTime * @author RollW */ data class CommentVo( - val id: Long, + val id: String, val userId: Long, - val parent: Long, + val parent: String?, val content: StructuralText, - val contentId: Long, + val contentId: String, val contentType: ContentType, val createTime: OffsetDateTime, val updateTime: OffsetDateTime ) : ContentVo { - override fun id(): Long = id + override fun id(): String = id override fun createTime(): OffsetDateTime = createTime @@ -53,11 +53,13 @@ data class CommentVo( if (metadata !is CommentDetailsMetadata) { return null } + val content = contentDetails.content + ?: return null return CommentVo( contentDetails.contentId, contentDetails.userId, metadata.parentId, - contentDetails.content, + content, metadata.contentId, metadata.contentType, contentDetails.createTime, diff --git a/lampray-web/src/main/java/tech/lamprism/lampray/web/controller/content/ContentController.java b/lampray-web/src/main/java/tech/lamprism/lampray/web/controller/content/ContentController.java index 9778eeaa..bd39ab7d 100644 --- a/lampray-web/src/main/java/tech/lamprism/lampray/web/controller/content/ContentController.java +++ b/lampray-web/src/main/java/tech/lamprism/lampray/web/controller/content/ContentController.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2023-2025 RollW + * Copyright (C) 2023-2026 RollW * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -47,6 +47,7 @@ import tech.rollw.common.web.system.SystemResourceOperatorProvider; import java.util.List; +import java.util.Objects; /** * @author RollW @@ -55,13 +56,13 @@ public class ContentController { private final ContentPublishProvider contentPublishProvider; private final ContentAccessService contentAccessService; - private final SystemResourceOperatorProvider systemResourceOperatorProvider; + private final SystemResourceOperatorProvider systemResourceOperatorProvider; private final ContentCollectionProviderFactory contentCollectionProviderFactory; private final ContextThreadAware apiContextThreadAware; public ContentController(ContentPublishProvider contentPublishProvider, ContentAccessService contentAccessService, - SystemResourceOperatorProvider systemResourceOperatorProvider, + SystemResourceOperatorProvider systemResourceOperatorProvider, ContentCollectionProviderFactory contentCollectionProviderFactory, ContextThreadAware apiContextThreadAware) { this.contentPublishProvider = contentPublishProvider; @@ -75,7 +76,7 @@ public ContentController(ContentPublishProvider contentPublishProvider, public HttpResponseEntity getContent( @PathVariable("userId") Long userId, @PathVariable("contentType") UrlContentType contentType, - @PathVariable("contentId") Long contentId) { + @PathVariable("contentId") String contentId) { ContextThread apiContextThread = apiContextThreadAware.getContextThread(); ApiContext apiContext = apiContextThread.getContext(); ContentDetails details = contentAccessService.openContent( @@ -88,7 +89,7 @@ public HttpResponseEntity getContent( return HttpResponseEntity.of(ContentErrorCode.ERROR_CONTENT_NOT_FOUND); } - return HttpResponseEntity.success(contentVoConvert(details)); + return HttpResponseEntity.success(contentVoConvertOrThrow(details)); } @@ -109,14 +110,17 @@ public HttpResponseEntity> getContents( ); List> contents = contentCollectionProviderFactory.getContents( ContentCollectionIdentity.of( - user.getUserId(), + String.valueOf(user.getUserId()), userCollectionType ), contentAccessCredentials ); return HttpResponseEntity.success( - contents.stream().map(this::contentVoConvert).toList() + contents.stream() + .map(this::contentVoConvert) + .filter(Objects::nonNull) + .toList() ); } @@ -136,13 +140,16 @@ public HttpResponseEntity> getUserContents( List> contents = contentCollectionProviderFactory.getContents( ContentCollectionIdentity.of( - userId, + String.valueOf(userId), contentType.getUserCollectionType() ), contentAccessCredentials ); return HttpResponseEntity.success( - contents.stream().map(this::contentVoConvert).toList() + contents.stream() + .map(this::contentVoConvert) + .filter(Objects::nonNull) + .toList() ); } @@ -150,7 +157,7 @@ public HttpResponseEntity> getUserContents( public HttpResponseEntity deleteContent( @PathVariable("userId") Long userId, @PathVariable("contentType") UrlContentType contentType, - @PathVariable("contentId") Long contentId) { + @PathVariable("contentId") String contentId) { ContentOperator contentOperator = systemResourceOperatorProvider.getSystemResourceOperator( getSystemResource(contentId, contentType), true @@ -167,12 +174,12 @@ public HttpResponseEntity deleteContent( public HttpResponseEntity updateContent( @PathVariable("userId") Long userId, @PathVariable("contentType") UrlContentType contentType, - @PathVariable("contentId") Long contentId) { + @PathVariable("contentId") String contentId) { return HttpResponseEntity.success(); } - private SystemResource getSystemResource(Long contentId, - UrlContentType contentType) { + private SystemResource getSystemResource(String contentId, + UrlContentType contentType) { return new SimpleSystemResource<>( contentId, contentType.getContentType().getSystemResourceKind() @@ -180,6 +187,14 @@ private SystemResource getSystemResource(Long contentId, } private ContentVo contentVoConvert(ContentDetails details) { - return ContentViewHelper.toContentView(details); + return ContentViewHelper.toContentView(details); + } + + private ContentVo contentVoConvertOrThrow(ContentDetails details) { + ContentVo contentVo = contentVoConvert(details); + if (contentVo == null) { + throw new ContentException(ContentErrorCode.ERROR_CONTENT_NOT_FOUND); + } + return contentVo; } } diff --git a/lampray-web/src/main/java/tech/lamprism/lampray/web/controller/content/ContentManageController.java b/lampray-web/src/main/java/tech/lamprism/lampray/web/controller/content/ContentManageController.java index 480a03f0..74476d46 100644 --- a/lampray-web/src/main/java/tech/lamprism/lampray/web/controller/content/ContentManageController.java +++ b/lampray-web/src/main/java/tech/lamprism/lampray/web/controller/content/ContentManageController.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2023-2025 RollW + * Copyright (C) 2023-2026 RollW * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -59,14 +59,18 @@ public ContentManageController(ContentAccessService contentAccessService, Conten public HttpResponseEntity getContent( @PathVariable("userId") Long userId, @PathVariable("contentType") UrlContentType contentType, - @PathVariable("contentId") Long contentId) { + @PathVariable("contentId") String contentId) { ContentMetadataDetails contentMetadataDetails = contentAccessService.getContentMetadataDetails( ContentIdentity.of(contentId, contentType.getContentType()) ); if (contentMetadataDetails.getUserId() != userId) { return HttpResponseEntity.of(ContentErrorCode.ERROR_CONTENT_NOT_FOUND); } - return HttpResponseEntity.success(ContentViewHelper.toContentView(contentMetadataDetails.getContentDetails())); + ContentVo contentVo = ContentViewHelper.toContentView(contentMetadataDetails.getContentDetails()); + if (contentVo == null) { + return HttpResponseEntity.of(ContentErrorCode.ERROR_CONTENT_NOT_FOUND); + } + return HttpResponseEntity.success(contentVo); } private ContentCollectionType getUserContentCollectionType(UrlContentType contentType) { diff --git a/lampray-web/src/main/java/tech/lamprism/lampray/web/controller/content/vo/ContentVo.java b/lampray-web/src/main/java/tech/lamprism/lampray/web/controller/content/vo/ContentVo.java index 1e2a4d7f..651cf522 100644 --- a/lampray-web/src/main/java/tech/lamprism/lampray/web/controller/content/vo/ContentVo.java +++ b/lampray-web/src/main/java/tech/lamprism/lampray/web/controller/content/vo/ContentVo.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2023 RollW + * Copyright (C) 2023-2026 RollW * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -22,7 +22,7 @@ * @author RollW */ public interface ContentVo { - long id(); + String id(); OffsetDateTime createTime(); diff --git a/lampray-web/src/main/java/tech/lamprism/lampray/web/controller/review/model/ReviewJobContentView.kt b/lampray-web/src/main/java/tech/lamprism/lampray/web/controller/review/model/ReviewJobContentView.kt index 48200038..f66913c9 100644 --- a/lampray-web/src/main/java/tech/lamprism/lampray/web/controller/review/model/ReviewJobContentView.kt +++ b/lampray-web/src/main/java/tech/lamprism/lampray/web/controller/review/model/ReviewJobContentView.kt @@ -1,5 +1,5 @@ /* - * Copyright (C) 2023 RollW + * Copyright (C) 2023-2026 RollW * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -25,7 +25,7 @@ import java.time.OffsetDateTime * @author RollW */ data class ReviewJobContentView( - val contentId: Long, + val contentId: String, val contentType: ContentType, val title: String?, val content: StructuralText, @@ -47,4 +47,4 @@ data class ReviewJobContentView( ) } } -} \ No newline at end of file +} diff --git a/lampray-web/src/main/java/tech/lamprism/lampray/web/controller/review/model/ReviewJobDetailsView.kt b/lampray-web/src/main/java/tech/lamprism/lampray/web/controller/review/model/ReviewJobDetailsView.kt index 12e64b04..7537316a 100644 --- a/lampray-web/src/main/java/tech/lamprism/lampray/web/controller/review/model/ReviewJobDetailsView.kt +++ b/lampray-web/src/main/java/tech/lamprism/lampray/web/controller/review/model/ReviewJobDetailsView.kt @@ -1,5 +1,5 @@ /* - * Copyright (C) 2023-2025 RollW + * Copyright (C) 2023-2026 RollW * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -29,7 +29,7 @@ data class ReviewJobDetailsView( val id: String, val status: ReviewStatus, val contentType: ContentType, - val contentId: Long, + val contentId: String, val reviewMark: ReviewMark, val createTime: OffsetDateTime, val updateTime: OffsetDateTime, diff --git a/lampray-web/src/main/java/tech/lamprism/lampray/web/controller/review/model/ReviewJobView.kt b/lampray-web/src/main/java/tech/lamprism/lampray/web/controller/review/model/ReviewJobView.kt index a43afd9f..33475081 100644 --- a/lampray-web/src/main/java/tech/lamprism/lampray/web/controller/review/model/ReviewJobView.kt +++ b/lampray-web/src/main/java/tech/lamprism/lampray/web/controller/review/model/ReviewJobView.kt @@ -1,5 +1,5 @@ /* - * Copyright (C) 2023-2025 RollW + * Copyright (C) 2023-2026 RollW * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -29,7 +29,7 @@ data class ReviewJobView( val id: String, val status: ReviewStatus, val contentType: ContentType, - val contentId: Long, + val contentId: String, val reviewMark: ReviewMark, val createTime: OffsetDateTime, val updateTime: OffsetDateTime diff --git a/lampray-web/src/main/resources/db/baseline/baseline-0.1.0-alpha1.yaml b/lampray-web/src/main/resources/db/baseline/baseline-0.1.0-alpha1.yaml index 1b8cb8e4..be04f013 100644 --- a/lampray-web/src/main/resources/db/baseline/baseline-0.1.0-alpha1.yaml +++ b/lampray-web/src/main/resources/db/baseline/baseline-0.1.0-alpha1.yaml @@ -93,7 +93,7 @@ databaseChangeLog: constraints: nullable: false name: parent_id - type: BIGINT + type: VARCHAR(64) - column: constraints: nullable: false @@ -118,7 +118,7 @@ databaseChangeLog: constraints: nullable: false name: comment_on_id - type: BIGINT + type: VARCHAR(64) - column: constraints: nullable: false @@ -144,7 +144,7 @@ databaseChangeLog: constraints: nullable: false name: content_id - type: BIGINT + type: VARCHAR(64) - column: constraints: nullable: false @@ -171,6 +171,12 @@ databaseChangeLog: primaryKeyName: pk_favorite_group name: id type: BIGINT + - column: + constraints: + nullable: false + unique: true + name: resource_id + type: VARCHAR(64) - column: constraints: nullable: false @@ -227,6 +233,12 @@ databaseChangeLog: primaryKeyName: pk_favorite_item name: id type: BIGINT + - column: + constraints: + nullable: false + unique: true + name: resource_id + type: VARCHAR(64) - column: constraints: nullable: false @@ -236,12 +248,12 @@ databaseChangeLog: constraints: nullable: false name: group_id - type: BIGINT + type: VARCHAR(64) - column: constraints: nullable: false name: content_id - type: BIGINT + type: VARCHAR(64) - column: constraints: nullable: false @@ -337,7 +349,7 @@ databaseChangeLog: constraints: nullable: false name: content_id - type: BIGINT + type: VARCHAR(64) - column: constraints: nullable: false @@ -467,6 +479,8 @@ databaseChangeLog: name: id type: BIGINT - column: + constraints: + nullable: false name: key type: VARCHAR(255) - column: diff --git a/lampray-web/src/main/resources/db/changelog.yaml b/lampray-web/src/main/resources/db/changelog.yaml index e14cc195..d4e29b14 100644 --- a/lampray-web/src/main/resources/db/changelog.yaml +++ b/lampray-web/src/main/resources/db/changelog.yaml @@ -5,4 +5,7 @@ databaseChangeLog: - include: file: db/changelog/0.1.0/0.1.0-alpha1-01-changelog.yaml context: incremental + - include: + file: db/changelog/0.1.0/0.1.0-alpha1-02-resource-id-migration.yaml + context: incremental diff --git a/lampray-web/src/main/resources/db/changelog/0.1.0/0.1.0-alpha1-02-resource-id-migration.yaml b/lampray-web/src/main/resources/db/changelog/0.1.0/0.1.0-alpha1-02-resource-id-migration.yaml new file mode 100644 index 00000000..72f89f2d --- /dev/null +++ b/lampray-web/src/main/resources/db/changelog/0.1.0/0.1.0-alpha1-02-resource-id-migration.yaml @@ -0,0 +1,121 @@ +databaseChangeLog: + - changeSet: + id: 0.1.0-alpha1-15-resource-id-columns + author: RollW + objectQuotingStrategy: QUOTE_ONLY_RESERVED_WORDS + changes: + - addColumn: + tableName: article + columns: + - column: + name: resource_id + type: VARCHAR(64) + - update: + tableName: article + columns: + - column: + name: resource_id + valueComputed: id + where: resource_id IS NULL + - addNotNullConstraint: + tableName: article + columnName: resource_id + columnDataType: VARCHAR(64) + - addUniqueConstraint: + tableName: article + columnNames: resource_id + constraintName: uc_article_resource_id + + - addColumn: + tableName: comment + columns: + - column: + name: resource_id + type: VARCHAR(64) + - update: + tableName: comment + columns: + - column: + name: resource_id + valueComputed: id + where: resource_id IS NULL + - modifyDataType: + tableName: comment + columnName: parent_id + newDataType: VARCHAR(64) + - modifyDataType: + tableName: comment + columnName: comment_on_id + newDataType: VARCHAR(64) + - update: + tableName: comment + columns: + - column: + name: parent_id + value: "" + where: parent_id = '0' OR parent_id IS NULL + - addNotNullConstraint: + tableName: comment + columnName: resource_id + columnDataType: VARCHAR(64) + - addUniqueConstraint: + tableName: comment + columnNames: resource_id + constraintName: uc_comment_resource_id + + - addColumn: + tableName: favorite_group + columns: + - column: + name: resource_id + type: VARCHAR(64) + - update: + tableName: favorite_group + columns: + - column: + name: resource_id + valueComputed: id + where: resource_id IS NULL + - addNotNullConstraint: + tableName: favorite_group + columnName: resource_id + columnDataType: VARCHAR(64) + - addUniqueConstraint: + tableName: favorite_group + columnNames: resource_id + constraintName: uc_favorite_group_resource_id + + - addColumn: + tableName: favorite_item + columns: + - column: + name: resource_id + type: VARCHAR(64) + - update: + tableName: favorite_item + columns: + - column: + name: resource_id + valueComputed: id + where: resource_id IS NULL + - modifyDataType: + tableName: favorite_item + columnName: group_id + newDataType: VARCHAR(64) + - modifyDataType: + tableName: favorite_item + columnName: content_id + newDataType: VARCHAR(64) + - addNotNullConstraint: + tableName: favorite_item + columnName: resource_id + columnDataType: VARCHAR(64) + - addUniqueConstraint: + tableName: favorite_item + columnNames: resource_id + constraintName: uc_favorite_item_resource_id + + - modifyDataType: + tableName: review_job + columnName: content_id + newDataType: VARCHAR(64)