Files
leanote/app/service/ShareService.go

832 lines
25 KiB
Go
Raw Normal View History

2014-05-07 13:06:24 +08:00
package service
import (
"github.com/leanote/leanote/app/db"
2015-11-13 17:58:41 +08:00
"github.com/leanote/leanote/app/info"
. "github.com/leanote/leanote/app/lea"
"gopkg.in/mgo.v2/bson"
2014-05-07 13:06:24 +08:00
"sort"
2015-11-13 17:58:41 +08:00
"time"
2014-05-07 13:06:24 +08:00
)
// 共享Notebook, Note服务
type ShareService struct {
}
2014-11-12 17:32:03 +08:00
//-----------------------------------
// 返回shareNotebooks, sharedUserInfos
// info.ShareNotebooksByUser, []info.User
2014-05-07 13:06:24 +08:00
// 总体来说, 这个方法比较麻烦, 速度未知. 以后按以下方案来缓存用户基础数据
// 以后建个用户的基本数据表, 放所有notebook, sharedNotebook的缓存!!
// 每更新一次则启动一个goroutine异步更新
// 共享只能共享本notebook下的, 如果其子也要共享, 必须设置其子!!!
// 那么, 父, 子在shareNotebooks表中都会有记录
// 得到用户的所有*被*共享的Notebook
// 1 得到别人共享给我的所有notebooks
// 2 按parent进行层次化
// 3 每个层按seq进行排序
// 4 按用户分组
// [ok]
2014-11-12 17:32:03 +08:00
// 谁共享给了我的Query
func (this *ShareService) getOrQ(userId string) bson.M {
// 得到我和和我参与的组织
groupIds := groupService.GetMineAndBelongToGroupIds(userId)
2015-11-13 17:58:41 +08:00
2014-11-12 17:32:03 +08:00
q := bson.M{}
if len(groupIds) > 0 {
orQ := []bson.M{
bson.M{"ToUserId": bson.ObjectIdHex(userId)},
bson.M{"ToGroupId": bson.M{"$in": groupIds}},
}
// 不是trash的
q["$or"] = orQ
} else {
2015-11-13 17:58:41 +08:00
q["ToUserId"] = bson.ObjectIdHex(userId)
2014-11-12 17:32:03 +08:00
}
return q
}
// 得到共享给我的笔记本和用户(谁共享给了我)
2014-05-07 13:06:24 +08:00
func (this *ShareService) GetShareNotebooks(userId string) (info.ShareNotebooksByUser, []info.User) {
myUserId := userId
2015-11-13 17:58:41 +08:00
2014-11-12 17:32:03 +08:00
// 得到共享给我的用户s信息
// 得到我参与的组织
q := this.getOrQ(userId)
2015-11-13 17:58:41 +08:00
2014-11-12 17:32:03 +08:00
// 不查hasShareNotes
// 直接查shareNotes, shareNotebooks表得到userId
userIds1 := []bson.ObjectId{}
db.Distinct(db.ShareNotes, q, "UserId", &userIds1)
2015-11-13 17:58:41 +08:00
2014-11-12 17:32:03 +08:00
userIds2 := []bson.ObjectId{}
db.Distinct(db.ShareNotebooks, q, "UserId", &userIds2) // BUG之前是userId1, 2014/12/29
2015-11-13 17:58:41 +08:00
2014-11-12 17:32:03 +08:00
userIds := append(userIds1, userIds2...)
2015-11-13 17:58:41 +08:00
userInfos := userService.GetUserInfosOrderBySeq(userIds)
// 不要我的id
for i, userInfo := range userInfos {
if userInfo.UserId.Hex() == myUserId {
userInfos = append(userInfos[:i], userInfos[i+1:]...)
2015-11-13 17:58:41 +08:00
break
}
}
2015-11-13 17:58:41 +08:00
2014-05-07 13:06:24 +08:00
//--------------------
// 得到他们共享给我的notebooks
2015-11-13 17:58:41 +08:00
2014-11-12 17:32:03 +08:00
// 这里可能会得到重复的记录
// 权限: 笔记本分享给个人 > 笔记本分享给组织
2014-05-07 13:06:24 +08:00
shareNotebooks := []info.ShareNotebook{}
2014-11-12 17:32:03 +08:00
db.ShareNotebooks.Find(q).Sort("-ToUserId").All(&shareNotebooks) // 按ToUserId降序排序, 那么有ToUserId的在前面
2015-11-13 17:58:41 +08:00
2014-05-07 13:06:24 +08:00
if len(shareNotebooks) == 0 {
return nil, userInfos
}
2015-11-13 17:58:41 +08:00
2014-05-07 13:06:24 +08:00
shareNotebooksLen := len(shareNotebooks)
2015-11-13 17:58:41 +08:00
2014-05-07 13:06:24 +08:00
// 找到了所有的notbookId, 那么找notebook表得到其详细信息
2014-11-12 17:32:03 +08:00
notebookIds := []bson.ObjectId{}
2014-05-07 13:06:24 +08:00
shareNotebooksMap := make(map[bson.ObjectId]info.ShareNotebook, shareNotebooksLen)
2014-11-12 17:32:03 +08:00
for _, each := range shareNotebooks {
// 之后的就不要了, 只留权限高的
if _, ok := shareNotebooksMap[each.NotebookId]; !ok {
// 默认的是没有notebookId的
notebookIds = append(notebookIds, each.NotebookId)
shareNotebooksMap[each.NotebookId] = each
}
2014-05-07 13:06:24 +08:00
}
2015-11-13 17:58:41 +08:00
2014-05-07 13:06:24 +08:00
// 1, 2
subNotebooks := notebookService.GetNotebooksByNotebookIds(notebookIds)
// 填充其它信息变成SubShareNotebooks
subShareNotebooks := this.parseToSubShareNotebooks(&subNotebooks, &shareNotebooksMap)
2015-11-13 17:58:41 +08:00
2014-05-07 13:06:24 +08:00
// 3 按用户进行分组成ShareNotebooksByUser
2015-11-13 17:58:41 +08:00
shareNotebooksByUsersMap := map[bson.ObjectId][]info.ShareNotebooks{}
2014-05-07 13:06:24 +08:00
// 先建立userId => []
for _, eachSub := range subShareNotebooks {
userId := eachSub.Notebook.UserId
// 我自己的, 算了
if userId.Hex() == myUserId {
2015-11-13 17:58:41 +08:00
continue
}
2015-11-13 17:58:41 +08:00
2014-05-07 13:06:24 +08:00
if _, ok := shareNotebooksByUsersMap[userId]; ok {
shareNotebooksByUsersMap[userId] = append(shareNotebooksByUsersMap[userId], eachSub)
} else {
shareNotebooksByUsersMap[userId] = []info.ShareNotebooks{eachSub}
}
}
2015-11-13 17:58:41 +08:00
shareNotebooksByUser := info.ShareNotebooksByUser{}
2014-05-07 13:06:24 +08:00
for userId, eachShareNotebooks := range shareNotebooksByUsersMap {
// 4, 按用户排序
shareNotebooksByUser[userId.Hex()] = sortSubShareNotebooks(eachShareNotebooks)
}
2015-11-13 17:58:41 +08:00
2014-05-07 13:06:24 +08:00
return shareNotebooksByUser, userInfos
}
// 排序
func sortSubShareNotebooks(eachNotebooks info.SubShareNotebooks) info.SubShareNotebooks {
// 遍历子, 则子往上进行排序
for _, eachNotebook := range eachNotebooks {
if eachNotebook.Subs != nil && len(eachNotebook.Subs) > 0 {
eachNotebook.Subs = sortSubShareNotebooks(eachNotebook.Subs)
}
}
// 子排完了, 本层排
sort.Sort(&eachNotebooks)
return eachNotebooks
}
// 将普通的notebooks添加perm及shareNotebook信息
func (this *ShareService) parseToSubShareNotebooks(subNotebooks *info.SubNotebooks, shareNotebooksMap *map[bson.ObjectId]info.ShareNotebook) info.SubShareNotebooks {
subShareNotebooks := info.SubShareNotebooks{}
for _, each := range *subNotebooks {
shareNotebooks := info.ShareNotebooks{}
2015-11-13 17:58:41 +08:00
shareNotebooks.Notebook = each.Notebook // 基本信息有了
2014-05-07 13:06:24 +08:00
shareNotebooks.ShareNotebook = (*shareNotebooksMap)[each.NotebookId] // perm有了
2015-11-13 17:58:41 +08:00
2014-05-07 13:06:24 +08:00
// 公用的, 单独赋值
shareNotebooks.Seq = shareNotebooks.ShareNotebook.Seq
shareNotebooks.NotebookId = shareNotebooks.ShareNotebook.NotebookId
2015-11-13 17:58:41 +08:00
2014-05-07 13:06:24 +08:00
// 还有其子, 递归解析之
if each.Subs != nil && len(each.Subs) > 0 {
shareNotebooks.Subs = this.parseToSubShareNotebooks(&each.Subs, shareNotebooksMap)
}
subShareNotebooks = append(subShareNotebooks, shareNotebooks)
}
2015-11-13 17:58:41 +08:00
2014-05-07 13:06:24 +08:00
return subShareNotebooks
}
//-------------
// 得到共享笔记本下的notes
2015-11-13 17:58:41 +08:00
func (this *ShareService) ListShareNotesByNotebookId(notebookId, myUserId, sharedUserId string,
page, pageSize int, sortField string, isAsc bool) []info.ShareNoteWithPerm {
2014-05-07 13:06:24 +08:00
// 1 首先判断是否真的sharedUserId 共享了 notebookId 给 myUserId
2014-11-12 17:32:03 +08:00
q := this.getOrQ(myUserId)
2015-11-13 17:58:41 +08:00
q["NotebookId"] = bson.ObjectIdHex(notebookId)
q["UserId"] = bson.ObjectIdHex(sharedUserId)
2014-05-07 13:06:24 +08:00
shareNotebook := info.ShareNotebook{}
2015-11-13 17:58:41 +08:00
db.GetByQ(db.ShareNotebooks,
2014-11-12 17:32:03 +08:00
q,
&shareNotebook)
2015-11-13 17:58:41 +08:00
2014-05-07 13:06:24 +08:00
if shareNotebook.NotebookId == "" {
return nil
}
2015-11-13 17:58:41 +08:00
2014-05-07 13:06:24 +08:00
perm := shareNotebook.Perm
2015-11-13 17:58:41 +08:00
2014-05-07 13:06:24 +08:00
// 2 得到该notebook下分页显示所有的notes
2015-11-13 17:58:41 +08:00
_, notes := noteService.ListNotes(sharedUserId, notebookId, false, page, pageSize, sortField, isAsc, false)
2014-05-07 13:06:24 +08:00
// 3 添加权限信息
// 3.1 如果该notebook自己有其它权限信息, 比如1, 那么覆盖notebook的权限信息
noteIds := make([]bson.ObjectId, len(notes))
for i, note := range notes {
noteIds[i] = note.NoteId
}
2014-11-12 17:32:03 +08:00
// 笔记的权限
shareNotes := []info.ShareNote{}
delete(q, "NotebookId")
2015-11-13 17:58:41 +08:00
q["NoteId"] = bson.M{"$in": noteIds}
2014-11-12 17:32:03 +08:00
db.ShareNotes.Find(q).Sort("-ToUserId").All(&shareNotes) // 给个的权限>给组织的权限
notePerms := map[bson.ObjectId]int{}
for _, each := range shareNotes {
if _, ok := notePerms[each.NoteId]; !ok {
notePerms[each.NoteId] = each.Perm
}
}
Log("笔记权限")
2015-11-13 17:58:41 +08:00
LogJ(notePerms)
2014-05-07 13:06:24 +08:00
// 3.2 组合
notesWithPerm := make([]info.ShareNoteWithPerm, len(notes))
for i, each := range notes {
2015-11-13 17:58:41 +08:00
thisPerm := perm
2014-05-07 13:06:24 +08:00
if selfPerm, ok := notePerms[each.NoteId]; ok {
thisPerm = selfPerm
}
2015-11-13 17:58:41 +08:00
2014-05-07 13:06:24 +08:00
notesWithPerm[i] = info.ShareNoteWithPerm{each, thisPerm}
}
return notesWithPerm
}
// 得到note的perm信息
2014-11-12 17:32:03 +08:00
//func (this *ShareService) getNotesPerm(noteIds []bson.ObjectId, myUserId, sharedUserId string) map[bson.ObjectId]int {
// shareNotes := []info.ShareNote{}
2015-11-13 17:58:41 +08:00
// db.ListByQ(db.ShareNotes,
2014-11-12 17:32:03 +08:00
// bson.M{
2015-11-13 17:58:41 +08:00
// "NoteId": bson.M{"$in": noteIds},
// "UserId": bson.ObjectIdHex(sharedUserId),
2014-11-12 17:32:03 +08:00
// "ToUserId": bson.ObjectIdHex(myUserId)}, &shareNotes)
2015-11-13 17:58:41 +08:00
//
2014-11-12 17:32:03 +08:00
// notesPerm := make(map[bson.ObjectId]int, len(shareNotes))
// for _, each := range shareNotes {
// notesPerm[each.NoteId] = each.Perm
// }
2015-11-13 17:58:41 +08:00
//
2014-11-12 17:32:03 +08:00
// return notesPerm
//}
2014-05-07 13:06:24 +08:00
// 得到默认的单个的notes 共享集
// 如果真要支持排序, 这里得到所有共享的notes, 到noteService方再sort和limit
// 可以这样! 到时将零散的共享noteId放在用户基本数据中
// 这里不好排序
2015-11-13 17:58:41 +08:00
func (this *ShareService) ListShareNotes(myUserId, sharedUserId string,
pageNumber, pageSize int, sortField string, isAsc bool) []info.ShareNoteWithPerm {
2014-05-07 13:06:24 +08:00
skipNum, _ := parsePageAndSort(pageNumber, pageSize, sortField, isAsc)
shareNotes := []info.ShareNote{}
2015-11-13 17:58:41 +08:00
2014-11-12 17:32:03 +08:00
q := this.getOrQ(myUserId)
2015-11-13 17:58:41 +08:00
q["UserId"] = bson.ObjectIdHex(sharedUserId)
2014-05-07 13:06:24 +08:00
db.ShareNotes.
2014-11-12 17:32:03 +08:00
Find(q).
Sort("-ToUserId"). // 给个人的权限 > 给组织的权限
2014-05-07 13:06:24 +08:00
Skip(skipNum).
Limit(pageSize).
All(&shareNotes)
2015-11-13 17:58:41 +08:00
2014-05-07 13:06:24 +08:00
if len(shareNotes) == 0 {
return nil
}
2015-11-13 17:58:41 +08:00
2014-05-07 13:06:24 +08:00
noteIds := make([]bson.ObjectId, len(shareNotes))
for i, each := range shareNotes {
noteIds[i] = each.NoteId
}
notes := noteService.ListNotesByNoteIds(noteIds)
2014-11-12 17:32:03 +08:00
notesMap := map[bson.ObjectId]info.Note{}
2014-05-07 13:06:24 +08:00
for _, each := range notes {
notesMap[each.NoteId] = each
}
2015-11-13 17:58:41 +08:00
2014-05-07 13:06:24 +08:00
// 将shareNotes与notes结合起来
2014-11-12 17:32:03 +08:00
notesWithPerm := []info.ShareNoteWithPerm{}
hasAdded := map[bson.ObjectId]bool{} // 防止重复, 只要前面权限高的
for _, each := range shareNotes {
if !hasAdded[each.NoteId] {
// 待优化
notesWithPerm = append(notesWithPerm, info.ShareNoteWithPerm{notesMap[each.NoteId], each.Perm})
hasAdded[each.NoteId] = true
}
2014-05-07 13:06:24 +08:00
}
return notesWithPerm
}
func (this *ShareService) notes2NotesWithPerm(notes []info.Note) {
}
// 添加一个notebook共享
// [ok]
func (this *ShareService) AddShareNotebook1(shareNotebook info.ShareNotebook) bool {
// 添加一条记录说明两者存在关系
2015-11-13 17:58:41 +08:00
this.AddHasShareNote(shareNotebook.UserId.Hex(), shareNotebook.ToUserId.Hex())
2014-05-07 13:06:24 +08:00
shareNotebook.CreatedTime = time.Now()
return db.Insert(db.ShareNotebooks, shareNotebook)
}
// 添加共享笔记本
func (this *ShareService) AddShareNotebook(notebookId string, perm int, userId, email string) (bool, string, string) {
// 通过email得到被共享的userId
toUserId := userService.GetUserId(email)
if toUserId == "" {
return false, "无该用户", ""
}
2015-03-31 14:27:26 +08:00
return this.AddShareNotebookToUserId(notebookId, perm, userId, toUserId)
}
2015-11-13 17:58:41 +08:00
2015-03-31 14:27:26 +08:00
// 第三方注册时没有email
func (this *ShareService) AddShareNotebookToUserId(notebookId string, perm int, userId, toUserId string) (bool, string, string) {
2014-05-07 13:06:24 +08:00
// 添加一条记录说明两者存在关系
2015-11-13 17:58:41 +08:00
this.AddHasShareNote(userId, toUserId)
2014-05-07 13:06:24 +08:00
// 先删除之
db.Delete(db.ShareNotebooks, bson.M{"NotebookId": bson.ObjectIdHex(notebookId),
2015-11-13 17:58:41 +08:00
"UserId": bson.ObjectIdHex(userId),
2014-05-07 13:06:24 +08:00
"ToUserId": bson.ObjectIdHex(toUserId),
2015-11-13 17:58:41 +08:00
})
shareNotebook := info.ShareNotebook{NotebookId: bson.ObjectIdHex(notebookId),
UserId: bson.ObjectIdHex(userId),
ToUserId: bson.ObjectIdHex(toUserId),
Perm: perm,
2014-05-07 13:06:24 +08:00
CreatedTime: time.Now(),
}
return db.Insert(db.ShareNotebooks, shareNotebook), "", toUserId
}
// 添加一个note共享
// [ok]
/*
func (this *ShareService) AddShareNote(shareNote info.ShareNote) bool {
shareNote.CreatedTime = time.Now()
return db.Insert(db.ShareNotes, shareNote)
}
*/
func (this *ShareService) AddShareNote(noteId string, perm int, userId, email string) (bool, string, string) {
// 通过email得到被共享的userId
toUserId := userService.GetUserId(email)
if toUserId == "" {
return false, "无该用户", ""
}
2015-03-31 14:27:26 +08:00
return this.AddShareNoteToUserId(noteId, perm, userId, toUserId)
}
2015-11-13 17:58:41 +08:00
// 第三方测试没有userId
2015-03-31 14:27:26 +08:00
func (this *ShareService) AddShareNoteToUserId(noteId string, perm int, userId, toUserId string) (bool, string, string) {
2014-05-07 13:06:24 +08:00
// 添加一条记录说明两者存在关系
2015-11-13 17:58:41 +08:00
this.AddHasShareNote(userId, toUserId)
2014-05-07 13:06:24 +08:00
// 先删除之
db.Delete(db.ShareNotes, bson.M{"NoteId": bson.ObjectIdHex(noteId),
2015-11-13 17:58:41 +08:00
"UserId": bson.ObjectIdHex(userId),
2014-05-07 13:06:24 +08:00
"ToUserId": bson.ObjectIdHex(toUserId),
2015-11-13 17:58:41 +08:00
})
shareNote := info.ShareNote{NoteId: bson.ObjectIdHex(noteId),
UserId: bson.ObjectIdHex(userId),
ToUserId: bson.ObjectIdHex(toUserId),
Perm: perm,
2014-05-07 13:06:24 +08:00
CreatedTime: time.Now(),
}
return db.Insert(db.ShareNotes, shareNote), "", toUserId
}
2014-09-21 22:05:04 +08:00
// updatedUserId是否有查看userId noteId的权限?
2014-11-12 17:32:03 +08:00
// userId是所有者
2014-09-21 22:05:04 +08:00
func (this *ShareService) HasReadPerm(userId, updatedUserId, noteId string) bool {
2014-11-12 17:32:03 +08:00
q := this.getOrQ(updatedUserId) // (toUserId == "xxx" || ToGroupId in (1, 2,3))
q["UserId"] = bson.ObjectIdHex(userId)
q["NoteId"] = bson.ObjectIdHex(noteId)
if !db.Has(db.ShareNotes, q) {
2014-09-21 22:05:04 +08:00
// noteId的notebookId是否被共享了?
notebookId := noteService.GetNotebookId(noteId)
if notebookId.Hex() == "" {
return false
}
2015-11-13 17:58:41 +08:00
2014-11-12 17:32:03 +08:00
delete(q, "NoteId")
q["NotebookId"] = notebookId
2015-11-13 17:58:41 +08:00
2014-09-21 22:05:04 +08:00
// 判断notebook是否被共享
2014-11-12 17:32:03 +08:00
if !db.Has(db.ShareNotebooks, q) {
2014-09-21 22:05:04 +08:00
return false
2015-11-13 17:58:41 +08:00
} else {
return true
}
2014-09-21 22:05:04 +08:00
} else {
return true
}
}
2014-05-07 13:06:24 +08:00
// updatedUserId是否有修改userId noteId的权限?
func (this *ShareService) HasUpdatePerm(userId, updatedUserId, noteId string) bool {
2014-11-12 17:32:03 +08:00
q := this.getOrQ(updatedUserId) // (toUserId == "xxx" || ToGroupId in (1, 2,3))
q["UserId"] = bson.ObjectIdHex(userId)
q["NoteId"] = bson.ObjectIdHex(noteId)
2015-11-13 17:58:41 +08:00
2014-11-12 17:32:03 +08:00
// note的权限
shares := []info.ShareNote{}
db.ShareNotes.Find(q).Sort("-ToUserId").All(&shares) // 个人 > 组织
for _, share := range shares {
return share.Perm == 1 // 第1个权限最大
}
2015-11-13 17:58:41 +08:00
2014-11-12 17:32:03 +08:00
// notebook的权限
notebookId := noteService.GetNotebookId(noteId)
if notebookId.Hex() == "" {
return false
}
2015-11-13 17:58:41 +08:00
2014-11-12 17:32:03 +08:00
delete(q, "NoteId")
q["NotebookId"] = notebookId
shares2 := []info.ShareNotebook{}
db.ShareNotebooks.Find(q).Sort("-ToUserId").All(&shares2) // 个人 > 组织
for _, share := range shares2 {
return share.Perm == 1 // 第1个权限最大
2014-05-07 13:06:24 +08:00
}
2014-11-12 17:32:03 +08:00
return false
2014-05-07 13:06:24 +08:00
}
// updatedUserId是否有修改userId notebookId的权限?
func (this *ShareService) HasUpdateNotebookPerm(userId, updatedUserId, notebookId string) bool {
2014-11-12 17:32:03 +08:00
q := this.getOrQ(updatedUserId) // (toUserId == "xxx" || ToGroupId in (1, 2,3))
q["UserId"] = bson.ObjectIdHex(userId)
q["NotebookId"] = bson.ObjectIdHex(notebookId)
shares2 := []info.ShareNotebook{}
db.ShareNotebooks.Find(q).Sort("-ToUserId").All(&shares2) // 个人 > 组织
for _, share := range shares2 {
return share.Perm == 1 // 第1个权限最大
}
return false
2014-05-07 13:06:24 +08:00
}
// 共享note, notebook时使用
func (this *ShareService) AddHasShareNote(userId, toUserId string) bool {
db.Insert(db.HasShareNotes, info.HasShareNote{UserId: bson.ObjectIdHex(userId), ToUserId: bson.ObjectIdHex(toUserId)})
2015-11-13 17:58:41 +08:00
return true
2014-05-07 13:06:24 +08:00
}
// userId是否被共享了noteId
2014-09-19 17:18:53 +08:00
func (this *ShareService) HasSharedNote(noteId, myUserId string) bool {
2014-05-07 13:06:24 +08:00
return db.Has(db.ShareNotes, bson.M{"ToUserId": bson.ObjectIdHex(myUserId), "NoteId": bson.ObjectIdHex(noteId)})
}
2015-11-13 17:58:41 +08:00
2014-05-07 13:06:24 +08:00
// noteId的notebook是否共享了给我
2014-09-20 15:20:36 +08:00
func (this *ShareService) HasSharedNotebook(noteId, myUserId, sharedUserId string) bool {
notebookId := noteService.GetNotebookId(noteId)
if notebookId != "" {
return db.Has(db.ShareNotebooks, bson.M{"NotebookId": notebookId,
2015-11-13 17:58:41 +08:00
"UserId": bson.ObjectIdHex(sharedUserId),
2014-05-07 13:06:24 +08:00
"ToUserId": bson.ObjectIdHex(myUserId),
})
}
return false
}
// 得到共享的笔记内容
2014-11-12 17:32:03 +08:00
// 并返回笔记的权限!!!
2014-05-07 13:06:24 +08:00
func (this *ShareService) GetShareNoteContent(noteId, myUserId, sharedUserId string) (noteContent info.NoteContent) {
noteContent = info.NoteContent{}
// 是否单独共享了该notebook
// 或者, 其notebook共享了我
2015-11-13 17:58:41 +08:00
// Log(this.HasSharedNote(noteId, myUserId))
// Log(this.HasSharedNotebook(noteId, myUserId, sharedUserId))
2014-11-12 17:32:03 +08:00
Log(this.HasReadPerm(sharedUserId, myUserId, noteId))
if this.HasReadPerm(sharedUserId, myUserId, noteId) {
2015-11-13 17:58:41 +08:00
// if this.HasSharedNote(noteId, myUserId) || this.HasSharedNotebook(noteId, myUserId, sharedUserId) {
2014-05-07 13:06:24 +08:00
db.Get(db.NoteContents, noteId, &noteContent)
} else {
}
return
}
// 查看note的分享信息
// 分享给了哪些用户和权限
// ShareNotes表 userId = me, noteId = ...
// 还要查看该note的notebookId分享的信息
func (this *ShareService) ListNoteShareUserInfo(noteId, userId string) []info.ShareUserInfo {
// 得到shareNote信息, 得到所有的ToUserId
shareNotes := []info.ShareNote{}
2015-11-13 17:58:41 +08:00
db.ListByQLimit(db.ShareNotes,
2014-11-12 17:32:03 +08:00
bson.M{
2015-11-13 17:58:41 +08:00
"NoteId": bson.ObjectIdHex(noteId),
"UserId": bson.ObjectIdHex(userId),
2014-11-12 17:32:03 +08:00
"ToGroupId": bson.M{"$exists": false},
}, &shareNotes, 100)
2015-11-13 17:58:41 +08:00
// Log("<<>>>>")
// Log(len(shareNotes))
2014-05-07 13:06:24 +08:00
if len(shareNotes) == 0 {
return nil
}
shareNotesMap := make(map[bson.ObjectId]info.ShareNote, len(shareNotes))
for _, each := range shareNotes {
shareNotesMap[each.ToUserId] = each
}
2015-11-13 17:58:41 +08:00
2014-05-07 13:06:24 +08:00
toUserIds := make([]bson.ObjectId, len(shareNotes))
for i, eachShareNote := range shareNotes {
toUserIds[i] = eachShareNote.ToUserId
}
2015-11-13 17:58:41 +08:00
2014-05-07 13:06:24 +08:00
note := noteService.GetNote(noteId, userId)
if note.NoteId == "" {
return nil
}
2015-11-13 17:58:41 +08:00
2014-05-07 13:06:24 +08:00
// 查看其notebook的shareNotebooks信息
shareNotebooks := []info.ShareNotebook{}
2015-11-13 17:58:41 +08:00
db.ListByQ(db.ShareNotebooks,
bson.M{"NotebookId": note.NotebookId, "UserId": bson.ObjectIdHex(userId), "ToUserId": bson.M{"$in": toUserIds}},
2014-05-07 13:06:24 +08:00
&shareNotebooks)
shareNotebooksMap := make(map[bson.ObjectId]info.ShareNotebook, len(shareNotebooks))
for _, each := range shareNotebooks {
shareNotebooksMap[each.ToUserId] = each
}
2015-11-13 17:58:41 +08:00
2014-05-07 13:06:24 +08:00
// 得到用户信息
userInfos := userService.ListUserInfosByUserIds(toUserIds)
2015-11-13 17:58:41 +08:00
2014-05-07 13:06:24 +08:00
if len(userInfos) == 0 {
return nil
}
2015-11-13 17:58:41 +08:00
2014-05-07 13:06:24 +08:00
shareUserInfos := make([]info.ShareUserInfo, len(userInfos))
2015-11-13 17:58:41 +08:00
2014-05-07 13:06:24 +08:00
for i, userInfo := range userInfos {
_, hasNotebook := shareNotebooksMap[userInfo.UserId]
2015-11-13 17:58:41 +08:00
shareUserInfos[i] = info.ShareUserInfo{ToUserId: userInfo.UserId,
Email: userInfo.Email,
Perm: shareNotesMap[userInfo.UserId].Perm,
2014-05-07 13:06:24 +08:00
NotebookHasShared: hasNotebook,
2015-11-13 17:58:41 +08:00
}
2014-05-07 13:06:24 +08:00
}
2015-11-13 17:58:41 +08:00
2014-05-07 13:06:24 +08:00
return shareUserInfos
}
// 得到notebook的share信息
// TODO 这里必须要分页, 最多取100个用户; 限制
func (this *ShareService) ListNotebookShareUserInfo(notebookId, userId string) []info.ShareUserInfo {
// notebook的shareNotebooks信息
shareNotebooks := []info.ShareNotebook{}
2015-11-13 17:58:41 +08:00
db.ListByQLimit(db.ShareNotebooks,
2014-11-12 17:32:03 +08:00
bson.M{
2015-11-13 17:58:41 +08:00
"NotebookId": bson.ObjectIdHex(notebookId),
"UserId": bson.ObjectIdHex(userId),
"ToGroupId": bson.M{"$exists": false},
},
2014-05-07 13:06:24 +08:00
&shareNotebooks, 100)
2015-11-13 17:58:41 +08:00
2014-05-07 13:06:24 +08:00
if len(shareNotebooks) == 0 {
return nil
}
2015-11-13 17:58:41 +08:00
2014-05-07 13:06:24 +08:00
// 得到用户信息
toUserIds := make([]bson.ObjectId, len(shareNotebooks))
for i, each := range shareNotebooks {
toUserIds[i] = each.ToUserId
}
userInfos := userService.ListUserInfosByUserIds(toUserIds)
2015-11-13 17:58:41 +08:00
2014-05-07 13:06:24 +08:00
if len(userInfos) == 0 {
return nil
}
2015-11-13 17:58:41 +08:00
2014-05-07 13:06:24 +08:00
shareNotebooksMap := make(map[bson.ObjectId]info.ShareNotebook, len(shareNotebooks))
for _, each := range shareNotebooks {
shareNotebooksMap[each.ToUserId] = each
}
2015-11-13 17:58:41 +08:00
2014-05-07 13:06:24 +08:00
shareUserInfos := make([]info.ShareUserInfo, len(userInfos))
for i, userInfo := range userInfos {
2015-11-13 17:58:41 +08:00
shareUserInfos[i] = info.ShareUserInfo{ToUserId: userInfo.UserId,
2014-05-07 13:06:24 +08:00
Email: userInfo.Email,
2015-11-13 17:58:41 +08:00
Perm: shareNotebooksMap[userInfo.UserId].Perm,
}
2014-05-07 13:06:24 +08:00
}
2015-11-13 17:58:41 +08:00
2014-05-07 13:06:24 +08:00
return shareUserInfos
}
//----------------
// 改变note share权限
func (this *ShareService) UpdateShareNotePerm(noteId string, perm int, userId, toUserId string) bool {
2015-11-13 17:58:41 +08:00
return db.UpdateByQField(db.ShareNotes,
2014-05-07 13:06:24 +08:00
bson.M{"NoteId": bson.ObjectIdHex(noteId), "UserId": bson.ObjectIdHex(userId), "ToUserId": bson.ObjectIdHex(toUserId)},
2015-11-13 17:58:41 +08:00
"Perm",
2014-05-07 13:06:24 +08:00
perm,
2015-11-13 17:58:41 +08:00
)
2014-05-07 13:06:24 +08:00
}
func (this *ShareService) UpdateShareNotebookPerm(notebookId string, perm int, userId, toUserId string) bool {
2015-11-13 17:58:41 +08:00
return db.UpdateByQField(db.ShareNotebooks,
2014-05-07 13:06:24 +08:00
bson.M{"NotebookId": bson.ObjectIdHex(notebookId), "UserId": bson.ObjectIdHex(userId), "ToUserId": bson.ObjectIdHex(toUserId)},
2015-11-13 17:58:41 +08:00
"Perm",
2014-05-07 13:06:24 +08:00
perm,
2015-11-13 17:58:41 +08:00
)
2014-05-07 13:06:24 +08:00
}
//---------------
// 删除share note
func (this *ShareService) DeleteShareNote(noteId string, userId, toUserId string) bool {
return db.DeleteAll(db.ShareNotes,
bson.M{"NoteId": bson.ObjectIdHex(noteId), "UserId": bson.ObjectIdHex(userId), "ToUserId": bson.ObjectIdHex(toUserId)})
}
// 删除笔记时要删除该noteId的所有...
func (this *ShareService) DeleteShareNoteAll(noteId string, userId string) bool {
return db.DeleteAll(db.ShareNotes,
bson.M{"NoteId": bson.ObjectIdHex(noteId), "UserId": bson.ObjectIdHex(userId)})
}
2015-11-13 17:58:41 +08:00
2014-05-07 13:06:24 +08:00
// 删除share notebook
func (this *ShareService) DeleteShareNotebook(notebookId string, userId, toUserId string) bool {
return db.DeleteAll(db.ShareNotebooks,
bson.M{"NotebookId": bson.ObjectIdHex(notebookId), "UserId": bson.ObjectIdHex(userId), "ToUserId": bson.ObjectIdHex(toUserId)})
}
// 删除userId分享给toUserId的所有
func (this *ShareService) DeleteUserShareNoteAndNotebook(userId, toUserId string) bool {
query := bson.M{"UserId": bson.ObjectIdHex(userId), "ToUserId": bson.ObjectIdHex(toUserId)}
2015-11-13 17:58:41 +08:00
db.DeleteAll(db.ShareNotebooks, query)
db.DeleteAll(db.ShareNotes, query)
db.DeleteAll(db.HasShareNotes, query)
2014-05-07 13:06:24 +08:00
return true
2014-09-21 22:05:04 +08:00
}
2015-11-13 17:58:41 +08:00
// 用户userId是否有修改noteId的权限
2014-09-21 22:05:04 +08:00
func (this *ShareService) HasUpdateNotePerm(noteId, userId string) bool {
if noteId == "" || userId == "" {
2015-11-13 17:58:41 +08:00
return false
2014-09-21 22:05:04 +08:00
}
note := noteService.GetNoteById(noteId)
2015-11-13 17:58:41 +08:00
LogJ(note)
2014-09-21 22:05:04 +08:00
if note.UserId != "" {
noteUserId := note.UserId.Hex()
if noteUserId != userId {
// 是否是有权限协作的
if this.HasUpdatePerm(noteUserId, userId, noteId) {
return true
} else {
2015-11-13 17:58:41 +08:00
return false
2014-09-21 22:05:04 +08:00
}
} else {
return true
}
} else {
2015-11-13 17:58:41 +08:00
return false
2014-09-21 22:05:04 +08:00
}
}
2015-11-13 17:58:41 +08:00
// 用户userId是否有查看noteId的权限
2014-09-21 22:05:04 +08:00
func (this *ShareService) HasReadNotePerm(noteId, userId string) bool {
if noteId == "" || userId == "" {
2015-11-13 17:58:41 +08:00
return false
2014-09-21 22:05:04 +08:00
}
note := noteService.GetNoteById(noteId)
if note.UserId != "" {
noteUserId := note.UserId.Hex()
if noteUserId != userId {
// 是否是有权限协作的
if this.HasReadPerm(noteUserId, userId, noteId) {
return true
} else {
2015-11-13 17:58:41 +08:00
return false
2014-09-21 22:05:04 +08:00
}
} else {
return true
}
} else {
2015-11-13 17:58:41 +08:00
return false
2014-09-21 22:05:04 +08:00
}
2014-11-12 17:32:03 +08:00
}
//----------------
// 用户分组
// 得到笔记分享给的groups
func (this *ShareService) GetNoteShareGroups(noteId, userId string) []info.ShareNote {
groups := groupService.GetGroupsContainOf(userId)
2015-11-13 17:58:41 +08:00
2014-11-12 17:32:03 +08:00
// 得到有分享的分组
shares := []info.ShareNote{}
2015-11-13 17:58:41 +08:00
db.ListByQ(db.ShareNotes,
bson.M{"NoteId": bson.ObjectIdHex(noteId), "UserId": bson.ObjectIdHex(userId), "ToGroupId": bson.M{"$exists": true}}, &shares)
2014-11-12 17:32:03 +08:00
mapShares := map[bson.ObjectId]info.ShareNote{}
for _, share := range shares {
2015-11-13 17:58:41 +08:00
mapShares[share.ToGroupId] = share
2014-11-12 17:32:03 +08:00
}
2015-11-13 17:58:41 +08:00
2014-11-12 17:32:03 +08:00
// 所有的groups都有share, 但没有share的group没有shareId
shares2 := make([]info.ShareNote, len(groups))
for i, group := range groups {
share, ok := mapShares[group.GroupId]
if !ok {
share = info.ShareNote{}
}
2015-11-13 17:58:41 +08:00
share.ToGroup = group
2014-11-12 17:32:03 +08:00
shares2[i] = share
}
2015-11-13 17:58:41 +08:00
2014-11-12 17:32:03 +08:00
return shares2
}
// 共享笔记给分组
2015-11-13 17:58:41 +08:00
func (this *ShareService) AddShareNoteGroup(userId, noteId, groupId string, perm int) bool {
if !groupService.IsExistsGroupUser(userId, groupId) {
2014-11-12 17:32:03 +08:00
return false
}
2015-11-13 17:58:41 +08:00
2014-11-12 17:32:03 +08:00
// 先删除之
this.DeleteShareNoteGroup(userId, noteId, groupId)
2015-11-13 17:58:41 +08:00
shareNote := info.ShareNote{NoteId: bson.ObjectIdHex(noteId),
UserId: bson.ObjectIdHex(userId), // 冗余字段
ToGroupId: bson.ObjectIdHex(groupId),
Perm: perm,
2014-11-12 17:32:03 +08:00
CreatedTime: time.Now(),
}
return db.Insert(db.ShareNotes, shareNote)
}
// 删除
func (this *ShareService) DeleteShareNoteGroup(userId, noteId, groupId string) bool {
return db.Delete(db.ShareNotes, bson.M{"NoteId": bson.ObjectIdHex(noteId),
2015-11-13 17:58:41 +08:00
"UserId": bson.ObjectIdHex(userId),
2014-11-12 17:32:03 +08:00
"ToGroupId": bson.ObjectIdHex(groupId),
2015-11-13 17:58:41 +08:00
})
2014-11-12 17:32:03 +08:00
}
//-------
2015-11-13 17:58:41 +08:00
2014-11-12 17:32:03 +08:00
// 得到笔记本分享给的groups
func (this *ShareService) GetNotebookShareGroups(notebookId, userId string) []info.ShareNotebook {
groups := groupService.GetGroupsContainOf(userId)
2015-11-13 17:58:41 +08:00
2014-11-12 17:32:03 +08:00
// 得到有分享的分组
shares := []info.ShareNotebook{}
2015-11-13 17:58:41 +08:00
db.ListByQ(db.ShareNotebooks,
bson.M{"NotebookId": bson.ObjectIdHex(notebookId), "UserId": bson.ObjectIdHex(userId), "ToGroupId": bson.M{"$exists": true}}, &shares)
2014-11-12 17:32:03 +08:00
mapShares := map[bson.ObjectId]info.ShareNotebook{}
for _, share := range shares {
2015-11-13 17:58:41 +08:00
mapShares[share.ToGroupId] = share
2014-11-12 17:32:03 +08:00
}
LogJ(shares)
2015-11-13 17:58:41 +08:00
2014-11-12 17:32:03 +08:00
// 所有的groups都有share, 但没有share的group没有shareId
shares2 := make([]info.ShareNotebook, len(groups))
for i, group := range groups {
share, ok := mapShares[group.GroupId]
if !ok {
share = info.ShareNotebook{}
}
2015-11-13 17:58:41 +08:00
share.ToGroup = group
2014-11-12 17:32:03 +08:00
shares2[i] = share
}
2015-11-13 17:58:41 +08:00
2014-11-12 17:32:03 +08:00
return shares2
}
2015-11-13 17:58:41 +08:00
2014-11-12 17:32:03 +08:00
// 共享笔记给分组
2015-11-13 17:58:41 +08:00
func (this *ShareService) AddShareNotebookGroup(userId, notebookId, groupId string, perm int) bool {
if !groupService.IsExistsGroupUser(userId, groupId) {
2014-11-12 17:32:03 +08:00
return false
}
2015-11-13 17:58:41 +08:00
2014-11-12 17:32:03 +08:00
// 先删除之
this.DeleteShareNotebookGroup(userId, notebookId, groupId)
2015-11-13 17:58:41 +08:00
shareNotebook := info.ShareNotebook{NotebookId: bson.ObjectIdHex(notebookId),
UserId: bson.ObjectIdHex(userId), // 冗余字段
ToGroupId: bson.ObjectIdHex(groupId),
Perm: perm,
2014-11-12 17:32:03 +08:00
CreatedTime: time.Now(),
}
return db.Insert(db.ShareNotebooks, shareNotebook)
}
// 删除
func (this *ShareService) DeleteShareNotebookGroup(userId, notebookId, groupId string) bool {
return db.Delete(db.ShareNotebooks, bson.M{"NotebookId": bson.ObjectIdHex(notebookId),
2015-11-13 17:58:41 +08:00
"UserId": bson.ObjectIdHex(userId),
2014-11-12 17:32:03 +08:00
"ToGroupId": bson.ObjectIdHex(groupId),
2015-11-13 17:58:41 +08:00
})
2014-11-12 17:32:03 +08:00
}
//--------------------
// 删除组时, 删除所有的
//--------------------
func (this *ShareService) DeleteAllShareNotebookGroup(groupId string) bool {
return db.Delete(db.ShareNotebooks, bson.M{
"ToGroupId": bson.ObjectIdHex(groupId),
2015-11-13 17:58:41 +08:00
})
}
func (this *ShareService) DeleteAllShareNoteGroup(groupId string) bool {
return db.Delete(db.ShareNotes, bson.M{
"ToGroupId": bson.ObjectIdHex(groupId),
2015-11-13 17:58:41 +08:00
})
}
//--------------------
// 删除组内用户时, 删除其分享的
//--------------------
func (this *ShareService) DeleteShareNotebookGroupWhenDeleteGroupUser(userId, groupId string) bool {
return db.Delete(db.ShareNotebooks, bson.M{
2015-11-13 17:58:41 +08:00
"UserId": bson.ObjectIdHex(userId),
"ToGroupId": bson.ObjectIdHex(groupId),
2015-11-13 17:58:41 +08:00
})
}
func (this *ShareService) DeleteShareNoteGroupWhenDeleteGroupUser(userId, groupId string) bool {
return db.Delete(db.ShareNotes, bson.M{
2015-11-13 17:58:41 +08:00
"UserId": bson.ObjectIdHex(userId),
"ToGroupId": bson.ObjectIdHex(groupId),
2015-11-13 17:58:41 +08:00
})
}