refactor(server): decouple services and improve architecture
- Introduce interfaces for all major services (JWT, PostAI, Comment, Message, Notification, QRCodeLogin, Upload, Vote, etc.) to support dependency inversion.
- Move query parameters from `internal/dto` to a new `internal/query` package to separate request payloads from data transfer objects.
- Refactor `internal/router` to use embedded `RouterDeps` for cleaner dependency management.
- Decouple handlers from repositories by injecting services instead of direct repository access, ensuring proper layering.
- Improve database initialization by moving it from `internal/model` to `internal/database`.
- Optimize message decryption by implementing a more efficient `BatchDecrypt` method in `MessageEncryptor` using a worker pool.
- Enhance error handling and security by implementing fail-fast checks for encryption key length during startup.
- Clean up unused code, including the `avatar` package and several unused DTOs.
2026-06-15 03:41:59 +08:00
|
|
|
|
package dto
|
|
|
|
|
|
|
|
|
|
|
|
import "with_you/internal/model"
|
|
|
|
|
|
|
|
|
|
|
|
// ==================== Post DTOs ====================
|
|
|
|
|
|
// 从 dto.go 拆分而来:帖子与投票相关的请求/响应 DTO。
|
|
|
|
|
|
// 与 post_converter.go 同属帖子域。
|
|
|
|
|
|
|
|
|
|
|
|
// PostChannelBrief 帖子所属频道(列表/详情卡片展示)
|
|
|
|
|
|
type PostChannelBrief struct {
|
|
|
|
|
|
ID string `json:"id"`
|
|
|
|
|
|
Name string `json:"name"`
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// PostImageResponse 帖子图片响应
|
|
|
|
|
|
type PostImageResponse struct {
|
|
|
|
|
|
ID string `json:"id"`
|
|
|
|
|
|
URL string `json:"url"`
|
|
|
|
|
|
ThumbnailURL string `json:"thumbnail_url"`
|
|
|
|
|
|
PreviewURL string `json:"preview_url"` // 列表/网格预览图
|
|
|
|
|
|
PreviewURLLarge string `json:"preview_url_large"` // 详情页预览图
|
|
|
|
|
|
Width int `json:"width"`
|
|
|
|
|
|
Height int `json:"height"`
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// PostResponse 帖子响应(列表用)
|
|
|
|
|
|
type PostResponse struct {
|
|
|
|
|
|
ID string `json:"id"`
|
|
|
|
|
|
UserID string `json:"user_id"`
|
|
|
|
|
|
ChannelID *string `json:"channel_id,omitempty"`
|
|
|
|
|
|
Title string `json:"title"`
|
|
|
|
|
|
Content string `json:"content"`
|
|
|
|
|
|
Segments model.MessageSegments `json:"segments,omitempty"`
|
|
|
|
|
|
Images []PostImageResponse `json:"images"`
|
|
|
|
|
|
Status string `json:"status,omitempty"`
|
|
|
|
|
|
LikesCount int `json:"likes_count"`
|
|
|
|
|
|
CommentsCount int `json:"comments_count"`
|
|
|
|
|
|
FavoritesCount int `json:"favorites_count"`
|
|
|
|
|
|
SharesCount int `json:"shares_count"`
|
|
|
|
|
|
ViewsCount int `json:"views_count"`
|
|
|
|
|
|
IsPinned bool `json:"is_pinned"`
|
|
|
|
|
|
IsLocked bool `json:"is_locked"`
|
|
|
|
|
|
IsVote bool `json:"is_vote"`
|
|
|
|
|
|
CreatedAt string `json:"created_at"`
|
|
|
|
|
|
UpdatedAt string `json:"updated_at"`
|
|
|
|
|
|
ContentEditedAt string `json:"content_edited_at,omitempty"`
|
|
|
|
|
|
Author *UserResponse `json:"author"`
|
|
|
|
|
|
IsLiked bool `json:"is_liked"`
|
|
|
|
|
|
IsFavorited bool `json:"is_favorited"`
|
|
|
|
|
|
Channel *PostChannelBrief `json:"channel,omitempty"`
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// ==================== Vote DTOs ====================
|
|
|
|
|
|
|
|
|
|
|
|
// CreateVotePostRequest 创建投票帖子请求
|
|
|
|
|
|
type CreateVotePostRequest struct {
|
2026-06-26 17:00:38 +08:00
|
|
|
|
Title string `json:"title" binding:"required,max=200"`
|
|
|
|
|
|
Content string `json:"content" binding:"max=2000"`
|
|
|
|
|
|
ChannelID *string `json:"channel_id,omitempty"`
|
|
|
|
|
|
Images []string `json:"images"`
|
|
|
|
|
|
VoteOptions []string `json:"vote_options" binding:"required,min=2,max=10"`
|
|
|
|
|
|
// ClientRequestID 客户端为本次发帖生成的幂等键(UUID)。
|
|
|
|
|
|
// 同一 userID + ClientRequestID 在 TTL 内重复提交时,后端直接返回首次创建的帖子,避免重复发帖。
|
|
|
|
|
|
ClientRequestID string `json:"client_request_id,omitempty"`
|
refactor(server): decouple services and improve architecture
- Introduce interfaces for all major services (JWT, PostAI, Comment, Message, Notification, QRCodeLogin, Upload, Vote, etc.) to support dependency inversion.
- Move query parameters from `internal/dto` to a new `internal/query` package to separate request payloads from data transfer objects.
- Refactor `internal/router` to use embedded `RouterDeps` for cleaner dependency management.
- Decouple handlers from repositories by injecting services instead of direct repository access, ensuring proper layering.
- Improve database initialization by moving it from `internal/model` to `internal/database`.
- Optimize message decryption by implementing a more efficient `BatchDecrypt` method in `MessageEncryptor` using a worker pool.
- Enhance error handling and security by implementing fail-fast checks for encryption key length during startup.
- Clean up unused code, including the `avatar` package and several unused DTOs.
2026-06-15 03:41:59 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// CreatePostWithSegmentsRequest 创建帖子请求(含 segments)
|
|
|
|
|
|
type CreatePostWithSegmentsRequest struct {
|
2026-06-26 17:00:38 +08:00
|
|
|
|
Title string `json:"title" binding:"required,max=200"`
|
|
|
|
|
|
Content string `json:"content"`
|
|
|
|
|
|
Segments model.MessageSegments `json:"segments"`
|
|
|
|
|
|
Images []string `json:"images"`
|
|
|
|
|
|
ChannelID *string `json:"channel_id,omitempty"`
|
|
|
|
|
|
// ClientRequestID 客户端为本次发帖生成的幂等键(UUID)。
|
|
|
|
|
|
// 同一 userID + ClientRequestID 在 TTL 内重复提交时,后端直接返回首次创建的帖子,避免重复发帖。
|
|
|
|
|
|
ClientRequestID string `json:"client_request_id,omitempty"`
|
refactor(server): decouple services and improve architecture
- Introduce interfaces for all major services (JWT, PostAI, Comment, Message, Notification, QRCodeLogin, Upload, Vote, etc.) to support dependency inversion.
- Move query parameters from `internal/dto` to a new `internal/query` package to separate request payloads from data transfer objects.
- Refactor `internal/router` to use embedded `RouterDeps` for cleaner dependency management.
- Decouple handlers from repositories by injecting services instead of direct repository access, ensuring proper layering.
- Improve database initialization by moving it from `internal/model` to `internal/database`.
- Optimize message decryption by implementing a more efficient `BatchDecrypt` method in `MessageEncryptor` using a worker pool.
- Enhance error handling and security by implementing fail-fast checks for encryption key length during startup.
- Clean up unused code, including the `avatar` package and several unused DTOs.
2026-06-15 03:41:59 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// VoteOptionDTO 投票选项DTO
|
|
|
|
|
|
type VoteOptionDTO struct {
|
|
|
|
|
|
ID string `json:"id"`
|
|
|
|
|
|
Content string `json:"content"`
|
|
|
|
|
|
VotesCount int `json:"votes_count"`
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// VoteResultDTO 投票结果DTO
|
|
|
|
|
|
type VoteResultDTO struct {
|
|
|
|
|
|
Options []VoteOptionDTO `json:"options"`
|
|
|
|
|
|
TotalVotes int `json:"total_votes"`
|
|
|
|
|
|
HasVoted bool `json:"has_voted"`
|
|
|
|
|
|
VotedOptionID string `json:"voted_option_id,omitzero"`
|
|
|
|
|
|
}
|