note_service.go 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229
  1. package service
  2. import (
  3. "errors"
  4. "fmt"
  5. "strconv"
  6. "note-manager/model"
  7. "note-manager/repository"
  8. )
  9. // NoteService 笔记业务逻辑层
  10. type NoteService struct {
  11. repo *repository.NoteRepository
  12. pageSize int
  13. }
  14. // NewNoteService 创建服务实例
  15. func NewNoteService(repo *repository.NoteRepository, pageSize int) *NoteService {
  16. return &NoteService{repo: repo, pageSize: pageSize}
  17. }
  18. // CreateNote 创建笔记或目录
  19. func (s *NoteService) CreateNote(req model.NoteCreateRequest) (*model.Note, error) {
  20. note := &model.Note{
  21. Title: req.Title,
  22. Content: req.Content,
  23. Category: req.Category,
  24. Tags: req.Tags,
  25. IsFolder: req.IsFolder,
  26. SortOrder: req.SortOrder,
  27. IsPublic: true, // 默认公开
  28. }
  29. if req.Password != "" {
  30. note.Password = model.HashPassword(req.Password)
  31. }
  32. if req.IsPinned != nil {
  33. note.IsPinned = *req.IsPinned
  34. }
  35. if req.IsFavorite != nil {
  36. note.IsFavorite = *req.IsFavorite
  37. }
  38. if req.IsPublic != nil {
  39. note.IsPublic = *req.IsPublic
  40. }
  41. if req.ParentID != nil {
  42. note.ParentID = *req.ParentID
  43. }
  44. if err := s.repo.Create(note); err != nil {
  45. return nil, fmt.Errorf("创建笔记失败: %w", err)
  46. }
  47. return note, nil
  48. }
  49. // GetNote 获取单条笔记
  50. func (s *NoteService) GetNote(id uint) (*model.Note, error) {
  51. note, err := s.repo.GetByID(id)
  52. if err != nil {
  53. return nil, errors.New("笔记不存在")
  54. }
  55. return note, nil
  56. }
  57. // GetNoteContent 获取笔记内容(需要密码验证)
  58. func (s *NoteService) GetNoteContent(id uint, password string) (*model.Note, error) {
  59. note, err := s.repo.GetByID(id)
  60. if err != nil {
  61. return nil, errors.New("笔记不存在")
  62. }
  63. // 检查密码
  64. if note.Password != "" {
  65. if !model.CheckPassword(password, note.Password) {
  66. return nil, errors.New("密码错误")
  67. }
  68. }
  69. return note, nil
  70. }
  71. // UpdateNote 更新笔记或目录
  72. func (s *NoteService) UpdateNote(id uint, req model.NoteUpdateRequest) (*model.Note, error) {
  73. note, err := s.repo.GetByID(id)
  74. if err != nil {
  75. return nil, errors.New("笔记不存在")
  76. }
  77. if req.Title != nil {
  78. note.Title = *req.Title
  79. }
  80. if req.Content != nil {
  81. note.Content = *req.Content
  82. }
  83. if req.Category != nil {
  84. note.Category = *req.Category
  85. }
  86. if req.Tags != nil {
  87. note.Tags = *req.Tags
  88. }
  89. if req.IsPinned != nil {
  90. note.IsPinned = *req.IsPinned
  91. }
  92. if req.IsFavorite != nil {
  93. note.IsFavorite = *req.IsFavorite
  94. }
  95. if req.IsPublic != nil {
  96. note.IsPublic = *req.IsPublic
  97. }
  98. if req.ParentID != nil {
  99. note.ParentID = *req.ParentID
  100. }
  101. if req.IsFolder != nil {
  102. note.IsFolder = *req.IsFolder
  103. }
  104. if req.SortOrder != nil {
  105. note.SortOrder = *req.SortOrder
  106. }
  107. if req.RemovePassword != nil && *req.RemovePassword {
  108. note.Password = ""
  109. } else if req.Password != nil {
  110. note.Password = model.HashPassword(*req.Password)
  111. }
  112. if err := s.repo.Update(note); err != nil {
  113. return nil, fmt.Errorf("更新笔记失败: %w", err)
  114. }
  115. return note, nil
  116. }
  117. // DeleteNote 删除笔记或目录(目录会删除所有子项)
  118. func (s *NoteService) DeleteNote(id uint) error {
  119. note, err := s.repo.GetByID(id)
  120. if err != nil {
  121. return errors.New("笔记不存在")
  122. }
  123. if note.IsFolder {
  124. return s.repo.DeleteWithChildren(id)
  125. }
  126. return s.repo.Delete(id)
  127. }
  128. // GetAllTree 获取所有笔记和目录的树形结构(管理后台用)
  129. func (s *NoteService) GetAllTree() ([]model.NoteListItem, error) {
  130. return s.repo.GetAllTree()
  131. }
  132. // GetPublicTree 获取公开笔记的树形结构(前台用)
  133. func (s *NoteService) GetPublicTree() ([]model.NoteListItem, error) {
  134. return s.repo.GetPublicTree()
  135. }
  136. // ListNotes 获取笔记列表
  137. func (s *NoteService) ListNotes(pageStr, pageSizeStr, category, tag string, pinned, favorite *bool) ([]model.NoteListItem, int64, int, error) {
  138. page := parseInt(pageStr, 1)
  139. pageSize := parseInt(pageSizeStr, s.pageSize)
  140. if page < 1 {
  141. page = 1
  142. }
  143. if pageSize < 1 || pageSize > 100 {
  144. pageSize = s.pageSize
  145. }
  146. items, total, err := s.repo.List(repository.ListQuery{
  147. Page: page,
  148. PageSize: pageSize,
  149. Category: category,
  150. Tag: tag,
  151. Pinned: pinned,
  152. Favorite: favorite,
  153. })
  154. if err != nil {
  155. return nil, 0, 0, fmt.Errorf("获取笔记列表失败: %w", err)
  156. }
  157. totalPages := int(total) / pageSize
  158. if int(total)%pageSize > 0 {
  159. totalPages++
  160. }
  161. return items, total, totalPages, nil
  162. }
  163. // GetByParentID 获取指定目录下的所有项目
  164. func (s *NoteService) GetByParentID(parentID uint) ([]model.NoteListItem, error) {
  165. return s.repo.GetByParentID(parentID)
  166. }
  167. // SearchNotes 搜索笔记
  168. func (s *NoteService) SearchNotes(keyword, pageStr, pageSizeStr string) ([]model.NoteListItem, int64, int, error) {
  169. if keyword == "" {
  170. return nil, 0, 0, errors.New("搜索关键词不能为空")
  171. }
  172. page := parseInt(pageStr, 1)
  173. pageSize := parseInt(pageSizeStr, s.pageSize)
  174. items, total, err := s.repo.Search(keyword, page, pageSize)
  175. if err != nil {
  176. return nil, 0, 0, fmt.Errorf("搜索笔记失败: %w", err)
  177. }
  178. totalPages := int(total) / pageSize
  179. if int(total)%pageSize > 0 {
  180. totalPages++
  181. }
  182. return items, total, totalPages, nil
  183. }
  184. // GetCategories 获取所有分类
  185. func (s *NoteService) GetCategories() ([]string, error) {
  186. return s.repo.GetCategories()
  187. }
  188. // GetTags 获取所有标签
  189. func (s *NoteService) GetTags() ([]string, error) {
  190. return s.repo.GetTags()
  191. }
  192. func parseInt(s string, defaultVal int) int {
  193. if s == "" {
  194. return defaultVal
  195. }
  196. v, err := strconv.Atoi(s)
  197. if err != nil {
  198. return defaultVal
  199. }
  200. return v
  201. }