chore: update list memos

This commit is contained in:
Steven
2023-12-06 22:44:49 +08:00
parent 055a327b5e
commit fa6693a7ae
8 changed files with 111 additions and 296 deletions

View File

@ -6,9 +6,6 @@ import (
"fmt"
"strings"
"github.com/pkg/errors"
"github.com/usememos/memos/internal/util"
"github.com/usememos/memos/store"
)
@ -88,13 +85,6 @@ func (d *DB) ListMemos(ctx context.Context, find *store.FindMemo) ([]*store.Memo
if v := find.Pinned; v != nil {
where = append(where, "memo_organizer.pinned = 1")
}
if v := find.HasParent; v != nil {
if *v {
where = append(where, "parent_id IS NOT NULL")
} else {
where = append(where, "parent_id IS NULL")
}
}
orders := []string{}
if find.OrderByPinned {
@ -108,45 +98,21 @@ func (d *DB) ListMemos(ctx context.Context, find *store.FindMemo) ([]*store.Memo
orders = append(orders, "id DESC")
fields := []string{
`memo.id AS id,`,
`memo.creator_id AS creator_id,`,
`memo.created_ts AS created_ts,`,
`memo.updated_ts AS updated_ts,`,
`memo.row_status AS row_status,`,
`memo.visibility AS visibility,`,
`memo.id AS id`,
`memo.creator_id AS creator_id`,
`memo.created_ts AS created_ts`,
`memo.updated_ts AS updated_ts`,
`memo.row_status AS row_status`,
`memo.visibility AS visibility`,
`CASE WHEN memo_organizer.pinned = 1 THEN 1 ELSE 0 END AS pinned`,
}
if !find.ExcludeContent {
fields = append(fields, `memo.content AS content,`)
fields = append(fields, `memo.content AS content`)
}
query := `
SELECT
` + strings.Join(fields, "\n") + `
CASE WHEN mo.pinned = 1 THEN 1 ELSE 0 END AS pinned,
(
SELECT
related_memo_id
FROM
memo_relation
WHERE
memo_relation.memo_id = memo.id AND memo_relation.type = 'COMMENT'
LIMIT 1
) AS parent_id,
GROUP_CONCAT(resource.id) AS resource_id_list,
(
SELECT
GROUP_CONCAT(memo_relation.memo_id || ':' || memo_relation.related_memo_id || ':' || memo_relation.type)
FROM
memo_relation
WHERE
memo_relation.memo_id = memo.id OR memo_relation.related_memo_id = memo.id
) AS relation_list
FROM
memo
LEFT JOIN
memo_organizer mo ON memo.id = mo.memo_id
LEFT JOIN
resource ON memo.id = resource.memo_id
query := `SELECT ` + strings.Join(fields, ", ") + `
FROM memo
LEFT JOIN memo_organizer ON memo.id = memo_organizer.memo_id
WHERE ` + strings.Join(where, " AND ") + `
GROUP BY memo.id
ORDER BY ` + strings.Join(orders, ", ")
@ -166,8 +132,6 @@ func (d *DB) ListMemos(ctx context.Context, find *store.FindMemo) ([]*store.Memo
list := make([]*store.Memo, 0)
for rows.Next() {
var memo store.Memo
var memoResourceIDList sql.NullString
var memoRelationList sql.NullString
dests := []any{
&memo.ID,
&memo.CreatorID,
@ -175,50 +139,14 @@ func (d *DB) ListMemos(ctx context.Context, find *store.FindMemo) ([]*store.Memo
&memo.UpdatedTs,
&memo.RowStatus,
&memo.Visibility,
&memo.Pinned,
}
if !find.ExcludeContent {
dests = append(dests, &memo.Content)
}
dests = append(dests, &memo.Pinned, &memo.ParentID, &memoResourceIDList, &memoRelationList)
if err := rows.Scan(dests...); err != nil {
return nil, err
}
if memoResourceIDList.Valid {
idStringList := strings.Split(memoResourceIDList.String, ",")
memo.ResourceIDList = make([]int32, 0, len(idStringList))
for _, idString := range idStringList {
id, err := util.ConvertStringToInt32(idString)
if err != nil {
return nil, err
}
memo.ResourceIDList = append(memo.ResourceIDList, id)
}
}
if memoRelationList.Valid {
memo.RelationList = make([]*store.MemoRelation, 0)
relatedMemoTypeList := strings.Split(memoRelationList.String, ",")
for _, relatedMemoType := range relatedMemoTypeList {
relatedMemoTypeList := strings.Split(relatedMemoType, ":")
if len(relatedMemoTypeList) != 3 {
return nil, errors.New("invalid relation format")
}
memoID, err := util.ConvertStringToInt32(relatedMemoTypeList[0])
if err != nil {
return nil, err
}
relatedMemoID, err := util.ConvertStringToInt32(relatedMemoTypeList[1])
if err != nil {
return nil, err
}
relationType := store.MemoRelationType(relatedMemoTypeList[2])
memo.RelationList = append(memo.RelationList, &store.MemoRelation{
MemoID: memoID,
RelatedMemoID: relatedMemoID,
Type: relationType,
})
}
}
list = append(list, &memo)
}