mirror of https://github.com/usememos/memos
refactor: raw struct for store
parent
0b50122aac
commit
bc22f69ac5
@ -0,0 +1,21 @@
|
|||||||
|
package api
|
||||||
|
|
||||||
|
// RowStatus is the status for a row.
|
||||||
|
type RowStatus string
|
||||||
|
|
||||||
|
const (
|
||||||
|
// Normal is the status for a normal row.
|
||||||
|
Normal RowStatus = "NORMAL"
|
||||||
|
// Archived is the status for an archived row.
|
||||||
|
Archived RowStatus = "ARCHIVED"
|
||||||
|
)
|
||||||
|
|
||||||
|
func (e RowStatus) String() string {
|
||||||
|
switch e {
|
||||||
|
case Normal:
|
||||||
|
return "NORMAL"
|
||||||
|
case Archived:
|
||||||
|
return "ARCHIVED"
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
}
|
@ -0,0 +1,21 @@
|
|||||||
|
package api
|
||||||
|
|
||||||
|
type MemoOrganizer struct {
|
||||||
|
ID int
|
||||||
|
|
||||||
|
// Domain specific fields
|
||||||
|
MemoID int
|
||||||
|
UserID int
|
||||||
|
Pinned bool
|
||||||
|
}
|
||||||
|
|
||||||
|
type MemoOrganizerFind struct {
|
||||||
|
MemoID int
|
||||||
|
UserID int
|
||||||
|
}
|
||||||
|
|
||||||
|
type MemoOrganizerUpsert struct {
|
||||||
|
MemoID int
|
||||||
|
UserID int
|
||||||
|
Pinned bool `json:"pinned"`
|
||||||
|
}
|
@ -0,0 +1,117 @@
|
|||||||
|
package store
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"memos/api"
|
||||||
|
"memos/common"
|
||||||
|
)
|
||||||
|
|
||||||
|
// memoOrganizerRaw is the store model for an MemoOrganizer.
|
||||||
|
// Fields have exactly the same meanings as MemoOrganizer.
|
||||||
|
type memoOrganizerRaw struct {
|
||||||
|
ID int
|
||||||
|
|
||||||
|
// Domain specific fields
|
||||||
|
MemoID int
|
||||||
|
UserID int
|
||||||
|
Pinned bool
|
||||||
|
}
|
||||||
|
|
||||||
|
func (raw *memoOrganizerRaw) toMemoOrganizer() *api.MemoOrganizer {
|
||||||
|
return &api.MemoOrganizer{
|
||||||
|
ID: raw.ID,
|
||||||
|
|
||||||
|
MemoID: raw.MemoID,
|
||||||
|
UserID: raw.UserID,
|
||||||
|
Pinned: raw.Pinned,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *Store) FindMemoOrganizer(find *api.MemoOrganizerFind) (*api.MemoOrganizer, error) {
|
||||||
|
memoOrganizerRaw, err := findMemoOrganizer(s.db, find)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
memoOrganizer := memoOrganizerRaw.toMemoOrganizer()
|
||||||
|
|
||||||
|
return memoOrganizer, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *Store) UpsertMemoOrganizer(upsert *api.MemoOrganizerUpsert) error {
|
||||||
|
err := upsertMemoOrganizer(s.db, upsert)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func findMemoOrganizer(db *DB, find *api.MemoOrganizerFind) (*memoOrganizerRaw, error) {
|
||||||
|
row, err := db.Db.Query(`
|
||||||
|
SELECT
|
||||||
|
id,
|
||||||
|
memo_id,
|
||||||
|
user_id,
|
||||||
|
pinned
|
||||||
|
FROM memo_organizer
|
||||||
|
WHERE memo_id = ? AND user_id = ?
|
||||||
|
`, find.MemoID, find.UserID)
|
||||||
|
if err != nil {
|
||||||
|
return nil, FormatError(err)
|
||||||
|
}
|
||||||
|
defer row.Close()
|
||||||
|
|
||||||
|
if !row.Next() {
|
||||||
|
return nil, &common.Error{Code: common.NotFound, Err: fmt.Errorf("not found")}
|
||||||
|
}
|
||||||
|
|
||||||
|
var memoOrganizerRaw memoOrganizerRaw
|
||||||
|
if err := row.Scan(
|
||||||
|
&memoOrganizerRaw.ID,
|
||||||
|
&memoOrganizerRaw.MemoID,
|
||||||
|
&memoOrganizerRaw.UserID,
|
||||||
|
&memoOrganizerRaw.Pinned,
|
||||||
|
); err != nil {
|
||||||
|
return nil, FormatError(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return &memoOrganizerRaw, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func upsertMemoOrganizer(db *DB, upsert *api.MemoOrganizerUpsert) error {
|
||||||
|
row, err := db.Db.Query(`
|
||||||
|
INSERT INTO memo_organizer (
|
||||||
|
memo_id,
|
||||||
|
user_id,
|
||||||
|
pinned
|
||||||
|
)
|
||||||
|
VALUES (?, ?, ?)
|
||||||
|
ON CONFLICT(memo_id, user_id) DO UPDATE
|
||||||
|
SET
|
||||||
|
pinned = EXCLUDED.pinned
|
||||||
|
RETURNING id, memo_id, user_id, pinned
|
||||||
|
`,
|
||||||
|
upsert.MemoID,
|
||||||
|
upsert.UserID,
|
||||||
|
upsert.Pinned,
|
||||||
|
)
|
||||||
|
if err != nil {
|
||||||
|
return FormatError(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
defer row.Close()
|
||||||
|
|
||||||
|
row.Next()
|
||||||
|
var memoOrganizer api.MemoOrganizer
|
||||||
|
if err := row.Scan(
|
||||||
|
&memoOrganizer.ID,
|
||||||
|
&memoOrganizer.MemoID,
|
||||||
|
&memoOrganizer.UserID,
|
||||||
|
&memoOrganizer.Pinned,
|
||||||
|
); err != nil {
|
||||||
|
return FormatError(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
@ -1,23 +1,25 @@
|
|||||||
INSERT INTO
|
INSERT INTO
|
||||||
memo (
|
memo (
|
||||||
|
`id`,
|
||||||
`content`,
|
`content`,
|
||||||
`creator_id`
|
`creator_id`
|
||||||
)
|
)
|
||||||
VALUES
|
VALUES
|
||||||
(
|
(
|
||||||
|
101,
|
||||||
'#memos 👋 Welcome to memos',
|
'#memos 👋 Welcome to memos',
|
||||||
101
|
101
|
||||||
);
|
);
|
||||||
|
|
||||||
INSERT INTO
|
INSERT INTO
|
||||||
memo (
|
memo (
|
||||||
|
`id`,
|
||||||
`content`,
|
`content`,
|
||||||
`creator_id`,
|
`creator_id`
|
||||||
`row_status`
|
|
||||||
)
|
)
|
||||||
VALUES
|
VALUES
|
||||||
(
|
(
|
||||||
|
102,
|
||||||
'好好学习,天天向上。',
|
'好好学习,天天向上。',
|
||||||
101,
|
101
|
||||||
'ARCHIVED'
|
|
||||||
);
|
);
|
||||||
|
@ -0,0 +1,12 @@
|
|||||||
|
INSERT INTO
|
||||||
|
memo_organizer (
|
||||||
|
`memo_id`,
|
||||||
|
`user_id`,
|
||||||
|
`pinned`
|
||||||
|
)
|
||||||
|
VALUES
|
||||||
|
(
|
||||||
|
102,
|
||||||
|
101,
|
||||||
|
1
|
||||||
|
);
|
Loading…
Reference in New Issue