From 94df09c8c0477857302d5e1c3a9a0c3ef55cccc4 Mon Sep 17 00:00:00 2001 From: boojack Date: Thu, 27 Oct 2022 22:02:42 +0800 Subject: [PATCH] chore: update memo list api (#350) --- common/util.go | 7 +++++++ server/memo.go | 12 +++++++++++- store/memo.go | 10 +--------- web/src/helpers/api.ts | 3 +++ web/src/services/memoService.ts | 3 ++- web/src/store/modules/memo.ts | 2 +- web/src/types/modules/memo.d.ts | 1 + 7 files changed, 26 insertions(+), 12 deletions(-) diff --git a/common/util.go b/common/util.go index 1c8a02466..228d9f1f8 100644 --- a/common/util.go +++ b/common/util.go @@ -28,3 +28,10 @@ func ValidateEmail(email string) bool { func GenUUID() string { return uuid.New().String() } + +func Min(x, y int) int { + if x < y { + return x + } + return y +} diff --git a/server/memo.go b/server/memo.go index 9391e98b6..e903ba61e 100644 --- a/server/memo.go +++ b/server/memo.go @@ -193,9 +193,19 @@ func (s *Server) registerMemoRoutes(g *echo.Group) { } sort.Slice(list, func(i, j int) bool { - return list[i].DisplayTs > list[j].DisplayTs + return list[i].DisplayTs < list[j].DisplayTs + }) + sort.Slice(list, func(i, j int) bool { + if !list[i].Pinned && list[j].Pinned { + return false + } + return true }) + if memoFind.Limit != 0 { + list = list[memoFind.Offset:common.Min(len(list), memoFind.Offset+memoFind.Limit)] + } + c.Response().Header().Set(echo.HeaderContentType, echo.MIMEApplicationJSONCharsetUTF8) if err := json.NewEncoder(c.Response().Writer).Encode(composeResponse(list)); err != nil { return echo.NewHTTPError(http.StatusInternalServerError, "Failed to encode memo list response").SetInternal(err) diff --git a/store/memo.go b/store/memo.go index 749f20886..b4eec02d4 100644 --- a/store/memo.go +++ b/store/memo.go @@ -329,14 +329,6 @@ func findMemoRawList(ctx context.Context, tx *sql.Tx, find *api.MemoFind) ([]*me where = append(where, fmt.Sprintf("visibility in (%s)", strings.Join(list, ","))) } - pagination := "" - if find.Limit > 0 { - pagination = fmt.Sprintf("%s LIMIT %d", pagination, find.Limit) - if find.Offset > 0 { - pagination = fmt.Sprintf("%s OFFSET %d", pagination, find.Offset) - } - } - query := ` SELECT id, @@ -349,7 +341,7 @@ func findMemoRawList(ctx context.Context, tx *sql.Tx, find *api.MemoFind) ([]*me FROM memo WHERE ` + strings.Join(where, " AND ") + ` ORDER BY created_ts DESC - ` + pagination + ` rows, err := tx.QueryContext(ctx, query, args...) if err != nil { return nil, FormatError(err) diff --git a/web/src/helpers/api.ts b/web/src/helpers/api.ts index 85f8da3ef..f10db375f 100644 --- a/web/src/helpers/api.ts +++ b/web/src/helpers/api.ts @@ -78,6 +78,9 @@ export function getMemoList(memoFind?: MemoFind) { if (memoFind?.rowStatus) { queryList.push(`rowStatus=${memoFind.rowStatus}`); } + if (memoFind?.pinned) { + queryList.push(`pinned=${memoFind.pinned}`); + } if (memoFind?.offset) { queryList.push(`offset=${memoFind.offset}`); } diff --git a/web/src/services/memoService.ts b/web/src/services/memoService.ts index 8cf12a1f2..277c51d3c 100644 --- a/web/src/services/memoService.ts +++ b/web/src/services/memoService.ts @@ -1,3 +1,4 @@ +import { uniqBy } from "lodash"; import * as api from "../helpers/api"; import { createMemo, deleteMemo, patchMemo, setIsFetching, setMemos, setTags } from "../store/modules/memo"; import store from "../store"; @@ -35,7 +36,7 @@ const memoService = { store.dispatch(setMemos([])); } const memos = memoService.getState().memos; - store.dispatch(setMemos(memos.concat(fetchedMemos))); + store.dispatch(setMemos(uniqBy(memos.concat(fetchedMemos), "id"))); store.dispatch(setIsFetching(false)); return fetchedMemos; diff --git a/web/src/store/modules/memo.ts b/web/src/store/modules/memo.ts index 9eae52946..82473a224 100644 --- a/web/src/store/modules/memo.ts +++ b/web/src/store/modules/memo.ts @@ -18,7 +18,7 @@ const memoSlice = createSlice({ setMemos: (state, action: PayloadAction) => { return { ...state, - memos: action.payload.filter((m) => m.rowStatus === "NORMAL"), + memos: action.payload, }; }, createMemo: (state, action: PayloadAction) => { diff --git a/web/src/types/modules/memo.d.ts b/web/src/types/modules/memo.d.ts index 6fd035e28..cb2bd11d3 100644 --- a/web/src/types/modules/memo.d.ts +++ b/web/src/types/modules/memo.d.ts @@ -37,6 +37,7 @@ interface MemoPatch { interface MemoFind { creatorId?: UserId; rowStatus?: RowStatus; + pinned?: boolean; visibility?: Visibility; offset?: number; limit?: number;