init
This commit is contained in:
211
app/service/NotebookService.go
Normal file
211
app/service/NotebookService.go
Normal file
@ -0,0 +1,211 @@
|
||||
package service
|
||||
|
||||
import (
|
||||
// "fmt"
|
||||
"labix.org/v2/mgo/bson"
|
||||
"github.com/leanote/leanote/app/db"
|
||||
"github.com/leanote/leanote/app/info"
|
||||
// . "github.com/leanote/leanote/app/lea"
|
||||
"sort"
|
||||
"time"
|
||||
)
|
||||
|
||||
// 笔记本
|
||||
|
||||
type NotebookService struct {
|
||||
}
|
||||
|
||||
// 排序
|
||||
func sortSubNotebooks(eachNotebooks info.SubNotebooks) info.SubNotebooks {
|
||||
// 遍历子, 则子往上进行排序
|
||||
for _, eachNotebook := range eachNotebooks {
|
||||
if eachNotebook.Subs != nil && len(eachNotebook.Subs) > 0 {
|
||||
eachNotebook.Subs = sortSubNotebooks(eachNotebook.Subs)
|
||||
}
|
||||
}
|
||||
|
||||
// 子排完了, 本层排
|
||||
sort.Sort(&eachNotebooks)
|
||||
return eachNotebooks
|
||||
}
|
||||
|
||||
// 整理(成有关系)并排序
|
||||
// GetNotebooks()调用
|
||||
// ShareService调用
|
||||
func ParseAndSortNotebooks(userNotebooks []info.Notebook, noParentDelete, needSort bool) info.SubNotebooks {
|
||||
// 整理成info.Notebooks
|
||||
// 第一遍, 建map
|
||||
// notebookId => info.Notebooks
|
||||
userNotebooksMap := make(map[bson.ObjectId]*info.Notebooks, len(userNotebooks))
|
||||
for _, each := range userNotebooks {
|
||||
newNotebooks := info.Notebooks{Subs: info.SubNotebooks{}}
|
||||
newNotebooks.NotebookId = each.NotebookId
|
||||
newNotebooks.Title = each.Title
|
||||
newNotebooks.Seq = each.Seq
|
||||
newNotebooks.UserId = each.UserId
|
||||
newNotebooks.ParentNotebookId = each.ParentNotebookId
|
||||
newNotebooks.NumberNotes = each.NumberNotes
|
||||
newNotebooks.IsTrash = each.IsTrash
|
||||
newNotebooks.IsBlog = each.IsBlog
|
||||
userNotebooksMap[each.NotebookId] = &newNotebooks
|
||||
}
|
||||
|
||||
// 第二遍, 追加到父下
|
||||
// nilObjectId := bson.ObjectIdHex("")
|
||||
for id, each := range userNotebooksMap {
|
||||
// 如果有父, 那么追加到父下, 并剪掉当前, 那么最后就只有根的元素
|
||||
if each.ParentNotebookId.Hex() != "" {
|
||||
if userNotebooksMap[each.ParentNotebookId] != nil {
|
||||
userNotebooksMap[each.ParentNotebookId].Subs = append(userNotebooksMap[each.ParentNotebookId].Subs, *each)
|
||||
// 并剪掉
|
||||
delete(userNotebooksMap, id)
|
||||
} else if noParentDelete {
|
||||
// 没有父, 且设置了要删除
|
||||
delete(userNotebooksMap, id)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 第三遍, 得到所有根
|
||||
final := make(info.SubNotebooks, len(userNotebooksMap))
|
||||
i := 0
|
||||
for _, each := range userNotebooksMap {
|
||||
final[i] = *each
|
||||
i++
|
||||
}
|
||||
|
||||
// 最后排序
|
||||
if needSort {
|
||||
return sortSubNotebooks(final)
|
||||
}
|
||||
return final
|
||||
}
|
||||
|
||||
// 得到某notebook
|
||||
func (this *NotebookService) GetNotebook(notebookId, userId string) info.Notebook {
|
||||
notebook := info.Notebook{}
|
||||
db.GetByIdAndUserId(db.Notebooks, notebookId, userId, ¬ebook)
|
||||
return notebook
|
||||
}
|
||||
|
||||
// 得到用户下所有的notebook
|
||||
// 排序好之后返回
|
||||
// [ok]
|
||||
func (this *NotebookService) GetNotebooks(userId string) info.SubNotebooks {
|
||||
userNotebooks := []info.Notebook{}
|
||||
db.Notebooks.Find(bson.M{"UserId": bson.ObjectIdHex(userId)}).All(&userNotebooks)
|
||||
|
||||
if len(userNotebooks) == 0 {
|
||||
return nil
|
||||
}
|
||||
|
||||
return ParseAndSortNotebooks(userNotebooks, true, true)
|
||||
}
|
||||
|
||||
// share调用, 不需要删除没有父的notebook
|
||||
// 不需要排序, 因为会重新排序
|
||||
// 通过notebookIds得到notebooks, 并转成层次有序
|
||||
func (this *NotebookService) GetNotebooksByNotebookIds(notebookIds []bson.ObjectId) info.SubNotebooks {
|
||||
userNotebooks := []info.Notebook{}
|
||||
db.Notebooks.Find(bson.M{"_id": bson.M{"$in": notebookIds}}).All(&userNotebooks)
|
||||
|
||||
if len(userNotebooks) == 0 {
|
||||
return nil
|
||||
}
|
||||
|
||||
return ParseAndSortNotebooks(userNotebooks, false, false)
|
||||
}
|
||||
|
||||
// 添加
|
||||
// [ok]
|
||||
func (this *NotebookService) AddNotebook(notebook info.Notebook) bool {
|
||||
err := db.Notebooks.Insert(notebook)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
} else {
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
// 判断是否是blog
|
||||
func (this *NotebookService) IsBlog(notebookId string) bool {
|
||||
notebook := info.Notebook{}
|
||||
db.GetByQWithFields(db.Notebooks, bson.M{"_id": bson.ObjectIdHex(notebookId)}, []string{"IsBlog"}, ¬ebook);
|
||||
return notebook.IsBlog
|
||||
}
|
||||
|
||||
// 判断是否是我的notebook
|
||||
func (this *NotebookService) IsMyNotebook(notebookId, userId string) bool {
|
||||
return db.Has(db.Notebooks, bson.M{"_id": bson.ObjectIdHex(notebookId), "UserId": bson.ObjectIdHex(userId)})
|
||||
}
|
||||
|
||||
// 更新笔记本信息
|
||||
// 太广, 不用
|
||||
/*
|
||||
func (this *NotebookService) UpdateNotebook(notebook info.Notebook) bool {
|
||||
return db.UpdateByIdAndUserId2(db.Notebooks, notebook.NotebookId, notebook.UserId, notebook)
|
||||
}
|
||||
*/
|
||||
|
||||
// 更新笔记本标题
|
||||
// [ok]
|
||||
func (this *NotebookService) UpdateNotebookTitle(notebookId, userId, title string) bool {
|
||||
return db.UpdateByIdAndUserIdField(db.Notebooks, notebookId, userId, "Title", title)
|
||||
}
|
||||
|
||||
// 更新notebook
|
||||
func (this *NotebookService) UpdateNotebook(userId, notebookId string, needUpdate bson.M) bool {
|
||||
needUpdate["UpdatedTime"] = time.Now();
|
||||
|
||||
// 如果有IsBlog之类的, 需要特殊处理
|
||||
if isBlog, ok := needUpdate["IsBlog"]; ok {
|
||||
// 设为blog/取消
|
||||
if is, ok2 := isBlog.(bool); ok2 {
|
||||
q := bson.M{"UserId": bson.ObjectIdHex(userId),
|
||||
"NotebookId": bson.ObjectIdHex(notebookId)}
|
||||
db.UpdateByQMap(db.Notes, q, bson.M{"IsBlog": is})
|
||||
|
||||
// noteContents也更新, 这个就麻烦了, noteContents表没有NotebookId
|
||||
// 先查该notebook下所有notes, 得到id
|
||||
notes := []info.Note{}
|
||||
db.ListByQWithFields(db.Notes, q, []string{"_id"}, ¬es)
|
||||
if len(notes) > 0 {
|
||||
noteIds := make([]bson.ObjectId, len(notes))
|
||||
for i, each := range notes {
|
||||
noteIds[i] = each.NoteId
|
||||
}
|
||||
db.UpdateByQMap(db.NoteContents, bson.M{"_id": bson.M{"$in": noteIds}}, bson.M{"IsBlog": isBlog})
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return db.UpdateByIdAndUserIdMap(db.Notebooks, notebookId, userId, needUpdate)
|
||||
}
|
||||
|
||||
// 先查看该notebookId下是否有notes, 没有则删除
|
||||
func (this *NotebookService) DeleteNotebook(userId, notebookId string) (bool, string) {
|
||||
if db.Count(db.Notes, bson.M{"NotebookId": bson.ObjectIdHex(notebookId),
|
||||
"UserId": bson.ObjectIdHex(userId),
|
||||
"IsTrash": false}) == 0 { // 不包含trash
|
||||
return db.DeleteByIdAndUserId(db.Notebooks, notebookId, userId), ""
|
||||
}
|
||||
return false, "笔记本下有笔记"
|
||||
}
|
||||
|
||||
// 排序
|
||||
// 传入 notebookId => Seq
|
||||
// 为什么要传入userId, 防止修改其它用户的信息 (恶意)
|
||||
// [ok]
|
||||
func (this *NotebookService) SortNotebooks(userId string, notebookId2Seqs map[string]int) bool {
|
||||
if len(notebookId2Seqs) == 0 {
|
||||
return false
|
||||
}
|
||||
|
||||
for notebookId, seq := range notebookId2Seqs {
|
||||
if !db.UpdateByIdAndUserIdField2(db.Notebooks, bson.ObjectIdHex(notebookId), bson.ObjectIdHex(userId), "Seq", seq) {
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
return true
|
||||
}
|
Reference in New Issue
Block a user