Feat(ToolStore): Add tool favorite controller
Add controller to add and remove favorite tool
This commit is contained in:
@@ -8,9 +8,7 @@ import top.fatweb.oxygen.api.annotation.Trim
|
|||||||
import top.fatweb.oxygen.api.entity.common.ResponseCode
|
import top.fatweb.oxygen.api.entity.common.ResponseCode
|
||||||
import top.fatweb.oxygen.api.entity.common.ResponseResult
|
import top.fatweb.oxygen.api.entity.common.ResponseResult
|
||||||
import top.fatweb.oxygen.api.entity.tool.ToolBase
|
import top.fatweb.oxygen.api.entity.tool.ToolBase
|
||||||
import top.fatweb.oxygen.api.param.tool.ToolCreateParam
|
import top.fatweb.oxygen.api.param.tool.*
|
||||||
import top.fatweb.oxygen.api.param.tool.ToolUpdateParam
|
|
||||||
import top.fatweb.oxygen.api.param.tool.ToolUpgradeParam
|
|
||||||
import top.fatweb.oxygen.api.service.tool.IEditService
|
import top.fatweb.oxygen.api.service.tool.IEditService
|
||||||
import top.fatweb.oxygen.api.vo.tool.ToolCategoryVo
|
import top.fatweb.oxygen.api.vo.tool.ToolCategoryVo
|
||||||
import top.fatweb.oxygen.api.vo.tool.ToolTemplateVo
|
import top.fatweb.oxygen.api.vo.tool.ToolTemplateVo
|
||||||
@@ -207,4 +205,40 @@ class EditController(
|
|||||||
fun delete(@PathVariable id: Long): ResponseResult<Nothing> =
|
fun delete(@PathVariable id: Long): ResponseResult<Nothing> =
|
||||||
if (editService.delete(id)) ResponseResult.databaseSuccess(ResponseCode.DATABASE_DELETE_SUCCESS)
|
if (editService.delete(id)) ResponseResult.databaseSuccess(ResponseCode.DATABASE_DELETE_SUCCESS)
|
||||||
else ResponseResult.databaseFail(ResponseCode.DATABASE_DELETE_FAILED)
|
else ResponseResult.databaseFail(ResponseCode.DATABASE_DELETE_FAILED)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add favorite tool
|
||||||
|
*
|
||||||
|
* @param toolFavoriteAddParam Add favorite tool parameters
|
||||||
|
* @return Response object
|
||||||
|
* @author FatttSnake, fatttsnake@gmail.com
|
||||||
|
* @since 1.0.0
|
||||||
|
* @see ToolFavoriteAddParam
|
||||||
|
* @see ResponseResult
|
||||||
|
*/
|
||||||
|
@Operation(summary = "收藏工具")
|
||||||
|
@PostMapping("/favorite")
|
||||||
|
fun addFavorite(@RequestBody toolFavoriteAddParam: ToolFavoriteAddParam): ResponseResult<Nothing> {
|
||||||
|
editService.addFavorite(toolFavoriteAddParam)
|
||||||
|
|
||||||
|
return ResponseResult.databaseSuccess(ResponseCode.DATABASE_INSERT_SUCCESS)
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Remove favorite tool
|
||||||
|
*
|
||||||
|
* @param toolFavoriteRemoveParam Remove favorite tool parameters
|
||||||
|
* @return Response object
|
||||||
|
* @author FatttSnake, fatttsnake@gmail.com
|
||||||
|
* @since 1.0.0
|
||||||
|
* @see ToolFavoriteRemoveParam
|
||||||
|
* @see ResponseResult
|
||||||
|
*/
|
||||||
|
@Operation(summary = "收藏工具")
|
||||||
|
@DeleteMapping("/favorite")
|
||||||
|
fun addFavorite(@RequestBody toolFavoriteRemoveParam: ToolFavoriteRemoveParam): ResponseResult<Nothing> {
|
||||||
|
editService.removeFavorite(toolFavoriteRemoveParam)
|
||||||
|
|
||||||
|
return ResponseResult.databaseSuccess(ResponseCode.DATABASE_DELETE_SUCCESS)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -41,7 +41,8 @@ object ToolConverter {
|
|||||||
publish = tool.publish,
|
publish = tool.publish,
|
||||||
review = tool.review,
|
review = tool.review,
|
||||||
createTime = tool.createTime,
|
createTime = tool.createTime,
|
||||||
updateTime = tool.updateTime
|
updateTime = tool.updateTime,
|
||||||
|
favorite = tool.favorite == 1
|
||||||
)
|
)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -61,6 +61,7 @@ enum class ResponseCode(val code: Int) {
|
|||||||
DATABASE_EXECUTE_ERROR(BusinessCode.DATABASE, 50),
|
DATABASE_EXECUTE_ERROR(BusinessCode.DATABASE, 50),
|
||||||
DATABASE_DUPLICATE_KEY(BusinessCode.DATABASE, 51),
|
DATABASE_DUPLICATE_KEY(BusinessCode.DATABASE, 51),
|
||||||
DATABASE_NO_RECORD_FOUND(BusinessCode.DATABASE, 52),
|
DATABASE_NO_RECORD_FOUND(BusinessCode.DATABASE, 52),
|
||||||
|
DATABASE_RECORD_ALREADY_EXISTS(BusinessCode.DATABASE, 53),
|
||||||
|
|
||||||
TOOL_SUBMIT_SUCCESS(BusinessCode.TOOL, 10),
|
TOOL_SUBMIT_SUCCESS(BusinessCode.TOOL, 10),
|
||||||
TOOL_CANCEL_SUCCESS(BusinessCode.TOOL, 11),
|
TOOL_CANCEL_SUCCESS(BusinessCode.TOOL, 11),
|
||||||
|
|||||||
@@ -247,7 +247,16 @@ class Tool : Serializable {
|
|||||||
@TableField(exist = false)
|
@TableField(exist = false)
|
||||||
var dist: ToolData? = null
|
var dist: ToolData? = null
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Favorite
|
||||||
|
*
|
||||||
|
* @author FatttSnake, fatttsnake@gmail.com
|
||||||
|
* @since 1.0.0
|
||||||
|
*/
|
||||||
|
@TableField(exist = false)
|
||||||
|
var favorite: Int? = null
|
||||||
|
|
||||||
override fun toString(): String {
|
override fun toString(): String {
|
||||||
return "Tool(id=$id, name=$name, toolId=$toolId, icon=$icon, platform=$platform, description=$description, baseId=$baseId, authorId=$authorId, ver=$ver, keywords=$keywords, sourceId=$sourceId, distId=$distId, entryPoint=$entryPoint, publish=$publish, review=$review, createTime=$createTime, updateTime=$updateTime, deleted=$deleted, version=$version, author=$author, base=$base, categories=$categories, source=$source, dist=$dist)"
|
return "Tool(id=$id, name=$name, toolId=$toolId, icon=$icon, platform=$platform, description=$description, baseId=$baseId, authorId=$authorId, ver=$ver, keywords=$keywords, sourceId=$sourceId, distId=$distId, entryPoint=$entryPoint, publish=$publish, review=$review, createTime=$createTime, updateTime=$updateTime, deleted=$deleted, version=$version, author=$author, base=$base, categories=$categories, source=$source, dist=$dist, favorite=$favorite)"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,81 @@
|
|||||||
|
package top.fatweb.oxygen.api.entity.tool
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.annotation.TableField
|
||||||
|
import com.baomidou.mybatisplus.annotation.TableId
|
||||||
|
import com.baomidou.mybatisplus.annotation.TableLogic
|
||||||
|
import com.baomidou.mybatisplus.annotation.TableName
|
||||||
|
import com.baomidou.mybatisplus.annotation.Version
|
||||||
|
import java.io.Serializable
|
||||||
|
|
||||||
|
@TableName("t_b_tool_favorite")
|
||||||
|
class ToolFavorite : Serializable {
|
||||||
|
/**
|
||||||
|
* ID
|
||||||
|
*
|
||||||
|
* @author FatttSnake, fatttsnake@gmail.com
|
||||||
|
* @since 1.0.0
|
||||||
|
*/
|
||||||
|
@TableId("id")
|
||||||
|
var id: Long? = null
|
||||||
|
|
||||||
|
/**
|
||||||
|
* User ID
|
||||||
|
*
|
||||||
|
* @author FatttSnake, fatttsnake@gmail.com
|
||||||
|
* @since 1.0.0
|
||||||
|
*/
|
||||||
|
@TableField("user_id")
|
||||||
|
var userId: Long? = null
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Username
|
||||||
|
*
|
||||||
|
* @author FatttSnake, fatttsnake@gmail.com
|
||||||
|
* @since 1.0.0
|
||||||
|
*/
|
||||||
|
@TableField("username")
|
||||||
|
var username: String? = null
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tool ID
|
||||||
|
*
|
||||||
|
* @author FatttSnake, fatttsnake@gmail.com
|
||||||
|
* @since 1.0.0
|
||||||
|
*/
|
||||||
|
@TableField("tool_id")
|
||||||
|
var toolId: String? = null
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Platform
|
||||||
|
*
|
||||||
|
* @author FatttSnake, fatttsnake@gmail.com
|
||||||
|
* @since 1.0.0
|
||||||
|
* @see ToolBase.Platform
|
||||||
|
*/
|
||||||
|
@TableField("platform")
|
||||||
|
var platform: ToolBase.Platform? = null
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Deleted
|
||||||
|
*
|
||||||
|
* @author FatttSnake, fatttsnake@gmail.com
|
||||||
|
* @since 1.0.0
|
||||||
|
*/
|
||||||
|
@TableField("deleted")
|
||||||
|
@TableLogic
|
||||||
|
var deleted: Long? = null
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Version
|
||||||
|
*
|
||||||
|
* @author FatttSnake, fatttsnake@gmail.com
|
||||||
|
* @since 1.0.0
|
||||||
|
*/
|
||||||
|
@TableField("version")
|
||||||
|
@Version
|
||||||
|
var version: Int? = null
|
||||||
|
|
||||||
|
override fun toString(): String {
|
||||||
|
return "ToolFavorite(id=$id, userId=$userId, username=$username, toolId=$toolId, platform=$platform, deleted=$deleted, version=$version)"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
package top.fatweb.oxygen.api.exception
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Record already exists exception
|
||||||
|
*
|
||||||
|
* @author FatttSnake, fatttsnake@gmail.com
|
||||||
|
* @since 1.0.0
|
||||||
|
* @see RuntimeException
|
||||||
|
*/
|
||||||
|
class RecordAlreadyExists : RuntimeException("Record already exists")
|
||||||
@@ -177,7 +177,11 @@ class ExceptionHandler {
|
|||||||
|
|
||||||
is TwoFactorVerificationCodeErrorException -> {
|
is TwoFactorVerificationCodeErrorException -> {
|
||||||
logger.debug(e.localizedMessage, e)
|
logger.debug(e.localizedMessage, e)
|
||||||
ResponseResult.fail(ResponseCode.PERMISSION_TWO_FACTOR_VERIFICATION_CODE_ERROR, e.localizedMessage, null)
|
ResponseResult.fail(
|
||||||
|
ResponseCode.PERMISSION_TWO_FACTOR_VERIFICATION_CODE_ERROR,
|
||||||
|
e.localizedMessage,
|
||||||
|
null
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* SQL */
|
/* SQL */
|
||||||
@@ -226,6 +230,11 @@ class ExceptionHandler {
|
|||||||
ResponseResult.fail(ResponseCode.DATABASE_EXECUTE_ERROR, e.localizedMessage, null)
|
ResponseResult.fail(ResponseCode.DATABASE_EXECUTE_ERROR, e.localizedMessage, null)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
is RecordAlreadyExists -> {
|
||||||
|
logger.debug(e.localizedMessage, e)
|
||||||
|
ResponseResult.fail(ResponseCode.DATABASE_RECORD_ALREADY_EXISTS, e.localizedMessage, null)
|
||||||
|
}
|
||||||
|
|
||||||
/* Tool */
|
/* Tool */
|
||||||
is IllegalVersionException -> {
|
is IllegalVersionException -> {
|
||||||
logger.debug(e.localizedMessage, e)
|
logger.debug(e.localizedMessage, e)
|
||||||
|
|||||||
@@ -60,5 +60,5 @@ interface StoreMapper : BaseMapper<Tool> {
|
|||||||
* @since 1.0.0
|
* @since 1.0.0
|
||||||
* @see Tool
|
* @see Tool
|
||||||
*/
|
*/
|
||||||
fun selectListByAuthorToolIds(@Param("ids") ids: List<String>): List<Tool>
|
fun selectListByAuthorToolIds(@Param("ids") ids: List<String>, @Param("operator") operator: Long?): List<Tool>
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
package top.fatweb.oxygen.api.mapper.tool
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.core.mapper.BaseMapper
|
||||||
|
import org.apache.ibatis.annotations.Mapper
|
||||||
|
import top.fatweb.oxygen.api.entity.tool.ToolFavorite
|
||||||
|
|
||||||
|
@Mapper
|
||||||
|
interface ToolFavoriteMapper : BaseMapper<ToolFavorite>
|
||||||
@@ -0,0 +1,53 @@
|
|||||||
|
package top.fatweb.oxygen.api.param.tool
|
||||||
|
|
||||||
|
import io.swagger.v3.oas.annotations.media.Schema
|
||||||
|
import jakarta.validation.constraints.NotBlank
|
||||||
|
import jakarta.validation.constraints.NotNull
|
||||||
|
import jakarta.validation.constraints.Pattern
|
||||||
|
import top.fatweb.oxygen.api.annotation.Trim
|
||||||
|
import top.fatweb.oxygen.api.entity.tool.ToolBase
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add favorite tool parameters
|
||||||
|
*
|
||||||
|
* @author FatttSnake, fatttsnake@gmail.com
|
||||||
|
* @since 1.0.0
|
||||||
|
*/
|
||||||
|
data class ToolFavoriteAddParam(
|
||||||
|
/**
|
||||||
|
* Username
|
||||||
|
*
|
||||||
|
* @author FatttSnake, fatttsnake@gmail.com
|
||||||
|
* @since 1.0.0
|
||||||
|
*/
|
||||||
|
@Trim
|
||||||
|
@Schema(description = "用户名", required = true)
|
||||||
|
@field: NotBlank(message = "Username cannot be blank")
|
||||||
|
var username: String?,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tool ID
|
||||||
|
*
|
||||||
|
* @author FatttSnake, fatttsnake@gmail.com
|
||||||
|
* @since 1.0.0
|
||||||
|
*/
|
||||||
|
@Trim
|
||||||
|
@Schema(description = "工具唯一 ID", required = true)
|
||||||
|
@field: NotBlank(message = "ToolId cannot be blank")
|
||||||
|
@field: Pattern(
|
||||||
|
regexp = "^[a-zA-Z-_][0-9a-zA-Z-_]{2,19}\$",
|
||||||
|
message = "ToolId can only match '^[a-zA-Z-_][0-9a-zA-Z-_]{2,19}\$'"
|
||||||
|
)
|
||||||
|
var toolId: String?,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Platform
|
||||||
|
*
|
||||||
|
* @author FatttSnake, fatttsnake@gmail.com
|
||||||
|
* @since 1.0.0
|
||||||
|
* @see ToolBase.Platform
|
||||||
|
*/
|
||||||
|
@Schema(description = "平台")
|
||||||
|
@field:NotNull(message = "Platform can not be null")
|
||||||
|
val platform: ToolBase.Platform?
|
||||||
|
)
|
||||||
@@ -0,0 +1,53 @@
|
|||||||
|
package top.fatweb.oxygen.api.param.tool
|
||||||
|
|
||||||
|
import io.swagger.v3.oas.annotations.media.Schema
|
||||||
|
import jakarta.validation.constraints.NotBlank
|
||||||
|
import jakarta.validation.constraints.NotNull
|
||||||
|
import jakarta.validation.constraints.Pattern
|
||||||
|
import top.fatweb.oxygen.api.annotation.Trim
|
||||||
|
import top.fatweb.oxygen.api.entity.tool.ToolBase
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Remove favorite tool parameters
|
||||||
|
*
|
||||||
|
* @author FatttSnake, fatttsnake@gmail.com
|
||||||
|
* @since 1.0.0
|
||||||
|
*/
|
||||||
|
data class ToolFavoriteRemoveParam(
|
||||||
|
/**
|
||||||
|
* Username
|
||||||
|
*
|
||||||
|
* @author FatttSnake, fatttsnake@gmail.com
|
||||||
|
* @since 1.0.0
|
||||||
|
*/
|
||||||
|
@Trim
|
||||||
|
@Schema(description = "用户名", required = true)
|
||||||
|
@field: NotBlank(message = "Username cannot be blank")
|
||||||
|
var username: String?,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tool ID
|
||||||
|
*
|
||||||
|
* @author FatttSnake, fatttsnake@gmail.com
|
||||||
|
* @since 1.0.0
|
||||||
|
*/
|
||||||
|
@Trim
|
||||||
|
@Schema(description = "工具唯一 ID", required = true)
|
||||||
|
@field: NotBlank(message = "ToolId cannot be blank")
|
||||||
|
@field: Pattern(
|
||||||
|
regexp = "^[a-zA-Z-_][0-9a-zA-Z-_]{2,19}\$",
|
||||||
|
message = "ToolId can only match '^[a-zA-Z-_][0-9a-zA-Z-_]{2,19}\$'"
|
||||||
|
)
|
||||||
|
var toolId: String?,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Platform
|
||||||
|
*
|
||||||
|
* @author FatttSnake, fatttsnake@gmail.com
|
||||||
|
* @since 1.0.0
|
||||||
|
* @see ToolBase.Platform
|
||||||
|
*/
|
||||||
|
@Schema(description = "平台")
|
||||||
|
@field:NotNull(message = "Platform can not be null")
|
||||||
|
val platform: ToolBase.Platform?
|
||||||
|
)
|
||||||
@@ -3,9 +3,7 @@ package top.fatweb.oxygen.api.service.tool
|
|||||||
import com.baomidou.mybatisplus.extension.service.IService
|
import com.baomidou.mybatisplus.extension.service.IService
|
||||||
import top.fatweb.oxygen.api.entity.tool.Tool
|
import top.fatweb.oxygen.api.entity.tool.Tool
|
||||||
import top.fatweb.oxygen.api.entity.tool.ToolBase
|
import top.fatweb.oxygen.api.entity.tool.ToolBase
|
||||||
import top.fatweb.oxygen.api.param.tool.ToolCreateParam
|
import top.fatweb.oxygen.api.param.tool.*
|
||||||
import top.fatweb.oxygen.api.param.tool.ToolUpdateParam
|
|
||||||
import top.fatweb.oxygen.api.param.tool.ToolUpgradeParam
|
|
||||||
import top.fatweb.oxygen.api.vo.tool.ToolCategoryVo
|
import top.fatweb.oxygen.api.vo.tool.ToolCategoryVo
|
||||||
import top.fatweb.oxygen.api.vo.tool.ToolTemplateVo
|
import top.fatweb.oxygen.api.vo.tool.ToolTemplateVo
|
||||||
import top.fatweb.oxygen.api.vo.tool.ToolVo
|
import top.fatweb.oxygen.api.vo.tool.ToolVo
|
||||||
@@ -151,4 +149,24 @@ interface IEditService : IService<Tool> {
|
|||||||
* @since 1.0.0
|
* @since 1.0.0
|
||||||
*/
|
*/
|
||||||
fun delete(id: Long): Boolean
|
fun delete(id: Long): Boolean
|
||||||
|
|
||||||
|
/***
|
||||||
|
* Add favorite
|
||||||
|
*
|
||||||
|
* @param toolFavoriteAddParam Add favorite tool parameters
|
||||||
|
* @author FatttSnake, fatttsnake@gmail.com
|
||||||
|
* @since 1.0.0
|
||||||
|
* @see ToolFavoriteAddParam
|
||||||
|
*/
|
||||||
|
fun addFavorite(toolFavoriteAddParam: ToolFavoriteAddParam)
|
||||||
|
|
||||||
|
/***
|
||||||
|
* Remove favorite tool
|
||||||
|
*
|
||||||
|
* @param toolFavoriteRemoveParam Remove favorite tool parameters
|
||||||
|
* @author FatttSnake, fatttsnake@gmail.com
|
||||||
|
* @since 1.0.0
|
||||||
|
* @see ToolFavoriteRemoveParam
|
||||||
|
*/
|
||||||
|
fun removeFavorite(toolFavoriteRemoveParam: ToolFavoriteRemoveParam)
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
package top.fatweb.oxygen.api.service.tool
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.extension.service.IService
|
||||||
|
import top.fatweb.oxygen.api.entity.tool.ToolFavorite
|
||||||
|
|
||||||
|
interface IToolFavoriteService : IService<ToolFavorite>
|
||||||
@@ -12,9 +12,7 @@ import top.fatweb.oxygen.api.converter.tool.ToolTemplateConverter
|
|||||||
import top.fatweb.oxygen.api.entity.tool.*
|
import top.fatweb.oxygen.api.entity.tool.*
|
||||||
import top.fatweb.oxygen.api.exception.*
|
import top.fatweb.oxygen.api.exception.*
|
||||||
import top.fatweb.oxygen.api.mapper.tool.EditMapper
|
import top.fatweb.oxygen.api.mapper.tool.EditMapper
|
||||||
import top.fatweb.oxygen.api.param.tool.ToolCreateParam
|
import top.fatweb.oxygen.api.param.tool.*
|
||||||
import top.fatweb.oxygen.api.param.tool.ToolUpdateParam
|
|
||||||
import top.fatweb.oxygen.api.param.tool.ToolUpgradeParam
|
|
||||||
import top.fatweb.oxygen.api.service.tool.*
|
import top.fatweb.oxygen.api.service.tool.*
|
||||||
import top.fatweb.oxygen.api.util.WebUtil
|
import top.fatweb.oxygen.api.util.WebUtil
|
||||||
import top.fatweb.oxygen.api.vo.tool.ToolCategoryVo
|
import top.fatweb.oxygen.api.vo.tool.ToolCategoryVo
|
||||||
@@ -36,7 +34,8 @@ class EditServiceImpl(
|
|||||||
private val toolTemplateService: IToolTemplateService,
|
private val toolTemplateService: IToolTemplateService,
|
||||||
private val toolCategoryService: IToolCategoryService,
|
private val toolCategoryService: IToolCategoryService,
|
||||||
private val toolDataService: IToolDataService,
|
private val toolDataService: IToolDataService,
|
||||||
private val rToolCategoryService: IRToolCategoryService
|
private val rToolCategoryService: IRToolCategoryService,
|
||||||
|
private val toolFavoriteService: IToolFavoriteService
|
||||||
) : ServiceImpl<EditMapper, Tool>(), IEditService {
|
) : ServiceImpl<EditMapper, Tool>(), IEditService {
|
||||||
override fun getTemplate(platform: ToolBase.Platform): List<ToolTemplateVo> =
|
override fun getTemplate(platform: ToolBase.Platform): List<ToolTemplateVo> =
|
||||||
toolTemplateService.list(
|
toolTemplateService.list(
|
||||||
@@ -259,4 +258,43 @@ class EditServiceImpl(
|
|||||||
rToolCategoryService.remove(KtQueryWrapper(RToolCategory()).eq(RToolCategory::toolId, tool.id))
|
rToolCategoryService.remove(KtQueryWrapper(RToolCategory()).eq(RToolCategory::toolId, tool.id))
|
||||||
return this.removeById(id)
|
return this.removeById(id)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Transactional
|
||||||
|
override fun addFavorite(toolFavoriteAddParam: ToolFavoriteAddParam) {
|
||||||
|
if (toolFavoriteService.exists(
|
||||||
|
KtQueryWrapper(ToolFavorite())
|
||||||
|
.eq(ToolFavorite::userId, WebUtil.getLoginUserId())
|
||||||
|
.eq(ToolFavorite::username, toolFavoriteAddParam.username)
|
||||||
|
.eq(ToolFavorite::toolId, toolFavoriteAddParam.toolId)
|
||||||
|
.eq(ToolFavorite::platform, toolFavoriteAddParam.platform)
|
||||||
|
)
|
||||||
|
) {
|
||||||
|
throw RecordAlreadyExists()
|
||||||
|
}
|
||||||
|
|
||||||
|
this.detail(toolFavoriteAddParam.username!!, toolFavoriteAddParam.toolId!!, "latest", toolFavoriteAddParam.platform!!)
|
||||||
|
|
||||||
|
toolFavoriteService.save(
|
||||||
|
ToolFavorite().apply {
|
||||||
|
userId = WebUtil.getLoginUserId()
|
||||||
|
username = toolFavoriteAddParam.username
|
||||||
|
toolId = toolFavoriteAddParam.toolId
|
||||||
|
platform = toolFavoriteAddParam.platform
|
||||||
|
}
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Transactional
|
||||||
|
override fun removeFavorite(toolFavoriteRemoveParam: ToolFavoriteRemoveParam) {
|
||||||
|
if (!toolFavoriteService.remove(
|
||||||
|
KtQueryWrapper(ToolFavorite())
|
||||||
|
.eq(ToolFavorite::userId, WebUtil.getLoginUserId())
|
||||||
|
.eq(ToolFavorite::username, toolFavoriteRemoveParam.username)
|
||||||
|
.eq(ToolFavorite::toolId, toolFavoriteRemoveParam.toolId)
|
||||||
|
.eq(ToolFavorite::platform, toolFavoriteRemoveParam.platform)
|
||||||
|
)
|
||||||
|
) {
|
||||||
|
throw NoRecordFoundException()
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -9,6 +9,7 @@ import top.fatweb.oxygen.api.mapper.tool.StoreMapper
|
|||||||
import top.fatweb.oxygen.api.param.PageSortParam
|
import top.fatweb.oxygen.api.param.PageSortParam
|
||||||
import top.fatweb.oxygen.api.param.tool.ToolStoreGetParam
|
import top.fatweb.oxygen.api.param.tool.ToolStoreGetParam
|
||||||
import top.fatweb.oxygen.api.service.tool.IStoreService
|
import top.fatweb.oxygen.api.service.tool.IStoreService
|
||||||
|
import top.fatweb.oxygen.api.util.WebUtil
|
||||||
import top.fatweb.oxygen.api.vo.PageVo
|
import top.fatweb.oxygen.api.vo.PageVo
|
||||||
import top.fatweb.oxygen.api.vo.tool.ToolVo
|
import top.fatweb.oxygen.api.vo.tool.ToolVo
|
||||||
|
|
||||||
@@ -31,7 +32,7 @@ class StoreServiceImpl : ServiceImpl<StoreMapper, Tool>(), IStoreService {
|
|||||||
val toolIdsIPage = baseMapper.selectAuthorToolIdPage(toolIdsPage, toolStoreGetParam?.searchValue)
|
val toolIdsIPage = baseMapper.selectAuthorToolIdPage(toolIdsPage, toolStoreGetParam?.searchValue)
|
||||||
val toolPage = Page<Tool>(toolIdsIPage.current, toolIdsIPage.size, toolIdsIPage.total)
|
val toolPage = Page<Tool>(toolIdsIPage.current, toolIdsIPage.size, toolIdsIPage.total)
|
||||||
if (toolIdsIPage.total > 0) {
|
if (toolIdsIPage.total > 0) {
|
||||||
toolPage.setRecords(baseMapper.selectListByAuthorToolIds(toolIdsIPage.records))
|
toolPage.setRecords(baseMapper.selectListByAuthorToolIds(toolIdsIPage.records, WebUtil.getLoginUserId()))
|
||||||
}
|
}
|
||||||
|
|
||||||
return ToolConverter.toolPageToToolPageVo(toolPage)
|
return ToolConverter.toolPageToToolPageVo(toolPage)
|
||||||
@@ -44,7 +45,7 @@ class StoreServiceImpl : ServiceImpl<StoreMapper, Tool>(), IStoreService {
|
|||||||
val toolIdsIPage = baseMapper.selectAuthorToolIdPageByUsername(toolIdsPage, username)
|
val toolIdsIPage = baseMapper.selectAuthorToolIdPageByUsername(toolIdsPage, username)
|
||||||
val toolPage = Page<Tool>(toolIdsIPage.current, toolIdsIPage.size, toolIdsIPage.total)
|
val toolPage = Page<Tool>(toolIdsIPage.current, toolIdsIPage.size, toolIdsIPage.total)
|
||||||
if (toolIdsIPage.total > 0) {
|
if (toolIdsIPage.total > 0) {
|
||||||
toolPage.setRecords(baseMapper.selectListByAuthorToolIds(toolIdsIPage.records))
|
toolPage.setRecords(baseMapper.selectListByAuthorToolIds(toolIdsIPage.records, WebUtil.getLoginUserId()))
|
||||||
}
|
}
|
||||||
|
|
||||||
return ToolConverter.toolPageToToolPageVo(toolPage)
|
return ToolConverter.toolPageToToolPageVo(toolPage)
|
||||||
|
|||||||
@@ -0,0 +1,10 @@
|
|||||||
|
package top.fatweb.oxygen.api.service.tool.impl
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl
|
||||||
|
import org.springframework.stereotype.Service
|
||||||
|
import top.fatweb.oxygen.api.entity.tool.ToolFavorite
|
||||||
|
import top.fatweb.oxygen.api.mapper.tool.ToolFavoriteMapper
|
||||||
|
import top.fatweb.oxygen.api.service.tool.IToolFavoriteService
|
||||||
|
|
||||||
|
@Service
|
||||||
|
class ToolFavoriteServiceImpl : ServiceImpl<ToolFavoriteMapper, ToolFavorite>(), IToolFavoriteService
|
||||||
@@ -184,5 +184,14 @@ data class ToolVo(
|
|||||||
* @see LocalDateTime
|
* @see LocalDateTime
|
||||||
*/
|
*/
|
||||||
@Schema(description = "修改时间", example = "1900-01-01T00:00:00.000Z")
|
@Schema(description = "修改时间", example = "1900-01-01T00:00:00.000Z")
|
||||||
val updateTime: LocalDateTime?
|
val updateTime: LocalDateTime?,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Favorite
|
||||||
|
*
|
||||||
|
* @author FatttSnake, fatttsnake@gmail.com
|
||||||
|
* @since 1.0.0
|
||||||
|
*/
|
||||||
|
@Schema(description = "收藏")
|
||||||
|
val favorite: Boolean?
|
||||||
)
|
)
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
drop table if exists t_b_tool_favorite;
|
||||||
|
|
||||||
|
create table if not exists t_b_tool_favorite
|
||||||
|
(
|
||||||
|
id bigint not null primary key,
|
||||||
|
user_id bigint not null comment '用户 ID',
|
||||||
|
username varchar(20) not null comment '用户名',
|
||||||
|
tool_id varchar(50) not null comment '工具 ID',
|
||||||
|
platform varchar(20) not null comment '平台',
|
||||||
|
deleted bigint not null default 0,
|
||||||
|
version int not null default 0,
|
||||||
|
constraint t_b_tool_favorite_unique_user_id_username_tool_id_platform unique (user_id, username, tool_id, platform, deleted)
|
||||||
|
) comment '工具-收藏表';
|
||||||
@@ -237,6 +237,7 @@
|
|||||||
<result property="createTime" column="tool_create_time"/>
|
<result property="createTime" column="tool_create_time"/>
|
||||||
<result property="deleted" column="tool_deleted"/>
|
<result property="deleted" column="tool_deleted"/>
|
||||||
<result property="version" column="tool_version"/>
|
<result property="version" column="tool_version"/>
|
||||||
|
<result property="favorite" column="tool_favorite"/>
|
||||||
<result property="keywords" column="tool_keywords"
|
<result property="keywords" column="tool_keywords"
|
||||||
typeHandler="com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler"/>
|
typeHandler="com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler"/>
|
||||||
<collection property="categories"
|
<collection property="categories"
|
||||||
|
|||||||
@@ -140,7 +140,8 @@
|
|||||||
tbtc.create_time as tool_category_create_time,
|
tbtc.create_time as tool_category_create_time,
|
||||||
tbtc.update_time as tool_category_update_time,
|
tbtc.update_time as tool_category_update_time,
|
||||||
tbtc.deleted as tool_category_deleted,
|
tbtc.deleted as tool_category_deleted,
|
||||||
tbtc.version as tool_category_version
|
tbtc.version as tool_category_version,
|
||||||
|
if(tbtf.id is null, 0, 1) as tool_favorite
|
||||||
from (select *, row_number() over (partition by t_b_tool_main.tool_id, t_b_tool_main.author_id, t_b_tool_main.platform order by t_b_tool_main.publish desc) as rn
|
from (select *, row_number() over (partition by t_b_tool_main.tool_id, t_b_tool_main.author_id, t_b_tool_main.platform order by t_b_tool_main.publish desc) as rn
|
||||||
from t_b_tool_main
|
from t_b_tool_main
|
||||||
where deleted = 0
|
where deleted = 0
|
||||||
@@ -149,11 +150,13 @@
|
|||||||
) as tbtm
|
) as tbtm
|
||||||
left join (select * from t_s_user where deleted = 0) as tsu on tsu.id = tbtm.author_id
|
left join (select * from t_s_user where deleted = 0) as tsu on tsu.id = tbtm.author_id
|
||||||
left join (select * from t_s_user_info where deleted = 0) as tsui
|
left join (select * from t_s_user_info where deleted = 0) as tsui
|
||||||
on tsui.user_id = tbtm.author_id
|
on tsui.user_id = tbtm.author_id
|
||||||
left join (select * from t_r_tool_main_category where deleted = 0) as trtmc
|
left join (select * from t_r_tool_main_category where deleted = 0) as trtmc
|
||||||
on tbtm.id = trtmc.tool_id
|
on tbtm.id = trtmc.tool_id
|
||||||
left join (select * from t_b_tool_category where deleted = 0 and enable = 1) as tbtc
|
left join (select * from t_b_tool_category where deleted = 0 and enable = 1) as tbtc
|
||||||
on tbtc.id = trtmc.category_id
|
on tbtc.id = trtmc.category_id
|
||||||
|
left join (select * from t_b_tool_favorite where deleted = 0) as tbtf
|
||||||
|
on tbtf.user_id = ${operator} and tbtf.username = tsu.username and tbtf.tool_id = tbtm.tool_id and tbtf.platform = tbtm.platform
|
||||||
<where>
|
<where>
|
||||||
and tbtm.rn = 1
|
and tbtm.rn = 1
|
||||||
<foreach collection="ids" item="item" index="index" open="and concat(tbtm.author_id, ':', tbtm.tool_id) in (" separator="," close=")"
|
<foreach collection="ids" item="item" index="index" open="and concat(tbtm.author_id, ':', tbtm.tool_id) in (" separator="," close=")"
|
||||||
|
|||||||
10
src/main/resources/mapper/tool/ToolFavoriteMapper.xml
Normal file
10
src/main/resources/mapper/tool/ToolFavoriteMapper.xml
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||||
|
<mapper namespace="top.fatweb.oxygen.api.mapper.tool.ToolFavoriteMapper">
|
||||||
|
<resultMap id="toolFavoriteMap" type="toolFavorite">
|
||||||
|
<id property="id" column="tool_favorite_id"/>
|
||||||
|
<result property="userId" column="tool_favorite_user_id"/>
|
||||||
|
<result property="username" column="tool_favorite_username"/>
|
||||||
|
<result property="toolId" column="tool_favorite_tool_id"/>
|
||||||
|
</resultMap>
|
||||||
|
</mapper>
|
||||||
Reference in New Issue
Block a user