Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
C
canifa_note
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Vũ Hoàng Anh
canifa_note
Commits
ea728d23
Unverified
Commit
ea728d23
authored
May 25, 2023
by
boojack
Committed by
GitHub
May 25, 2023
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
refactor: memo store (#1741)
parent
43819b02
Changes
16
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
16 changed files
with
518 additions
and
533 deletions
+518
-533
memo.go
api/memo.go
+10
-16
memo.go
server/memo.go
+215
-119
memo_relation.go
server/memo_relation.go
+8
-0
memo_resource.go
server/memo_resource.go
+2
-1
rss.go
server/rss.go
+18
-17
tag.go
server/tag.go
+5
-4
common.go
store/common.go
+21
-0
memo.go
store/memo.go
+196
-246
memo_relation.go
store/memo_relation.go
+0
-21
resource.go
store/resource.go
+0
-35
store.go
store/store.go
+0
-1
user.go
store/user.go
+4
-34
memo_relation_test.go
test/server/memo_relation_test.go
+2
-2
memo_test.go
test/server/memo_test.go
+16
-18
memo_relation_test.go
test/store/memo_relation_test.go
+7
-8
memo_test.go
test/store/memo_test.go
+14
-11
No files found.
api/memo.go
View file @
ea728d23
package
api
package
api
// MaxContentLength means the max memo content bytes is 1MB.
const
MaxContentLength
=
1
<<
30
// Visibility is the type of a visibility.
// Visibility is the type of a visibility.
type
Visibility
string
type
Visibility
string
...
@@ -15,8 +12,8 @@ const (
...
@@ -15,8 +12,8 @@ const (
Private
Visibility
=
"PRIVATE"
Private
Visibility
=
"PRIVATE"
)
)
func
(
e
Visibility
)
String
()
string
{
func
(
v
Visibility
)
String
()
string
{
switch
e
{
switch
v
{
case
Public
:
case
Public
:
return
"PUBLIC"
return
"PUBLIC"
case
Protected
:
case
Protected
:
...
@@ -27,7 +24,7 @@ func (e Visibility) String() string {
...
@@ -27,7 +24,7 @@ func (e Visibility) String() string {
return
"PRIVATE"
return
"PRIVATE"
}
}
type
Memo
struct
{
type
Memo
Response
struct
{
ID
int
`json:"id"`
ID
int
`json:"id"`
// Standard fields
// Standard fields
...
@@ -42,12 +39,13 @@ type Memo struct {
...
@@ -42,12 +39,13 @@ type Memo struct {
Pinned
bool
`json:"pinned"`
Pinned
bool
`json:"pinned"`
// Related fields
// Related fields
CreatorName
string
`json:"creatorName"`
CreatorName
string
`json:"creatorName"`
ResourceList
[]
*
Resource
`json:"resourceList"`
ResourceIDList
[]
int
RelationList
[]
*
MemoRelation
`json:"relationList"`
ResourceList
[]
*
Resource
`json:"resourceList"`
RelationList
[]
*
MemoRelation
`json:"relationList"`
}
}
type
MemoCreate
struct
{
type
CreateMemoRequest
struct
{
// Standard fields
// Standard fields
CreatorID
int
`json:"-"`
CreatorID
int
`json:"-"`
CreatedTs
*
int64
`json:"createdTs"`
CreatedTs
*
int64
`json:"createdTs"`
...
@@ -61,7 +59,7 @@ type MemoCreate struct {
...
@@ -61,7 +59,7 @@ type MemoCreate struct {
RelationList
[]
*
MemoRelationUpsert
`json:"relationList"`
RelationList
[]
*
MemoRelationUpsert
`json:"relationList"`
}
}
type
MemoPatch
struct
{
type
PatchMemoRequest
struct
{
ID
int
`json:"-"`
ID
int
`json:"-"`
// Standard fields
// Standard fields
...
@@ -78,7 +76,7 @@ type MemoPatch struct {
...
@@ -78,7 +76,7 @@ type MemoPatch struct {
RelationList
[]
*
MemoRelationUpsert
`json:"relationList"`
RelationList
[]
*
MemoRelationUpsert
`json:"relationList"`
}
}
type
MemoFind
struct
{
type
FindMemoRequest
struct
{
ID
*
int
ID
*
int
// Standard fields
// Standard fields
...
@@ -94,7 +92,3 @@ type MemoFind struct {
...
@@ -94,7 +92,3 @@ type MemoFind struct {
Limit
*
int
Limit
*
int
Offset
*
int
Offset
*
int
}
}
type
MemoDelete
struct
{
ID
int
}
server/memo.go
View file @
ea728d23
This diff is collapsed.
Click to expand it.
server/memo_relation.go
View file @
ea728d23
...
@@ -74,3 +74,11 @@ func (s *Server) registerMemoRelationRoutes(g *echo.Group) {
...
@@ -74,3 +74,11 @@ func (s *Server) registerMemoRelationRoutes(g *echo.Group) {
return
c
.
JSON
(
http
.
StatusOK
,
true
)
return
c
.
JSON
(
http
.
StatusOK
,
true
)
})
})
}
}
func
convertMemoRelationMessageToMemoRelation
(
memoRelation
*
store
.
MemoRelationMessage
)
*
api
.
MemoRelation
{
return
&
api
.
MemoRelation
{
MemoID
:
memoRelation
.
MemoID
,
RelatedMemoID
:
memoRelation
.
RelatedMemoID
,
Type
:
api
.
MemoRelationType
(
memoRelation
.
Type
),
}
}
server/memo_resource.go
View file @
ea728d23
...
@@ -8,6 +8,7 @@ import (
...
@@ -8,6 +8,7 @@ import (
"time"
"time"
"github.com/usememos/memos/api"
"github.com/usememos/memos/api"
"github.com/usememos/memos/store"
"github.com/labstack/echo/v4"
"github.com/labstack/echo/v4"
)
)
...
@@ -82,7 +83,7 @@ func (s *Server) registerMemoResourceRoutes(g *echo.Group) {
...
@@ -82,7 +83,7 @@ func (s *Server) registerMemoResourceRoutes(g *echo.Group) {
return
echo
.
NewHTTPError
(
http
.
StatusBadRequest
,
fmt
.
Sprintf
(
"Resource ID is not a number: %s"
,
c
.
Param
(
"resourceId"
)))
.
SetInternal
(
err
)
return
echo
.
NewHTTPError
(
http
.
StatusBadRequest
,
fmt
.
Sprintf
(
"Resource ID is not a number: %s"
,
c
.
Param
(
"resourceId"
)))
.
SetInternal
(
err
)
}
}
memo
,
err
:=
s
.
Store
.
FindMemo
(
ctx
,
&
api
.
MemoFind
{
memo
,
err
:=
s
.
Store
.
GetMemo
(
ctx
,
&
store
.
FindMemoMessage
{
ID
:
&
memoID
,
ID
:
&
memoID
,
})
})
if
err
!=
nil
{
if
err
!=
nil
{
...
...
server/rss.go
View file @
ea728d23
...
@@ -13,6 +13,7 @@ import (
...
@@ -13,6 +13,7 @@ import (
"github.com/labstack/echo/v4"
"github.com/labstack/echo/v4"
"github.com/usememos/memos/api"
"github.com/usememos/memos/api"
"github.com/usememos/memos/common"
"github.com/usememos/memos/common"
"github.com/usememos/memos/store"
"github.com/yuin/goldmark"
"github.com/yuin/goldmark"
)
)
...
@@ -24,12 +25,12 @@ func (s *Server) registerRSSRoutes(g *echo.Group) {
...
@@ -24,12 +25,12 @@ func (s *Server) registerRSSRoutes(g *echo.Group) {
return
echo
.
NewHTTPError
(
http
.
StatusInternalServerError
,
"Failed to get system customized profile"
)
.
SetInternal
(
err
)
return
echo
.
NewHTTPError
(
http
.
StatusInternalServerError
,
"Failed to get system customized profile"
)
.
SetInternal
(
err
)
}
}
normalStatus
:=
api
.
Normal
normalStatus
:=
store
.
Normal
memoFind
:=
api
.
MemoFind
{
memoFind
:=
store
.
FindMemoMessage
{
RowStatus
:
&
normalStatus
,
RowStatus
:
&
normalStatus
,
VisibilityList
:
[]
api
.
Visibility
{
api
.
Public
},
VisibilityList
:
[]
store
.
Visibility
{
store
.
Public
},
}
}
memoList
,
err
:=
s
.
Store
.
FindMemoList
(
ctx
,
&
memoFind
)
memoList
,
err
:=
s
.
Store
.
ListMemos
(
ctx
,
&
memoFind
)
if
err
!=
nil
{
if
err
!=
nil
{
return
echo
.
NewHTTPError
(
http
.
StatusInternalServerError
,
"Failed to find memo list"
)
.
SetInternal
(
err
)
return
echo
.
NewHTTPError
(
http
.
StatusInternalServerError
,
"Failed to find memo list"
)
.
SetInternal
(
err
)
}
}
...
@@ -55,13 +56,13 @@ func (s *Server) registerRSSRoutes(g *echo.Group) {
...
@@ -55,13 +56,13 @@ func (s *Server) registerRSSRoutes(g *echo.Group) {
return
echo
.
NewHTTPError
(
http
.
StatusInternalServerError
,
"Failed to get system customized profile"
)
.
SetInternal
(
err
)
return
echo
.
NewHTTPError
(
http
.
StatusInternalServerError
,
"Failed to get system customized profile"
)
.
SetInternal
(
err
)
}
}
normalStatus
:=
api
.
Normal
normalStatus
:=
store
.
Normal
memoFind
:=
api
.
MemoFind
{
memoFind
:=
store
.
FindMemoMessage
{
CreatorID
:
&
id
,
CreatorID
:
&
id
,
RowStatus
:
&
normalStatus
,
RowStatus
:
&
normalStatus
,
VisibilityList
:
[]
api
.
Visibility
{
api
.
Public
},
VisibilityList
:
[]
store
.
Visibility
{
store
.
Public
},
}
}
memoList
,
err
:=
s
.
Store
.
FindMemoList
(
ctx
,
&
memoFind
)
memoList
,
err
:=
s
.
Store
.
ListMemos
(
ctx
,
&
memoFind
)
if
err
!=
nil
{
if
err
!=
nil
{
return
echo
.
NewHTTPError
(
http
.
StatusInternalServerError
,
"Failed to find memo list"
)
.
SetInternal
(
err
)
return
echo
.
NewHTTPError
(
http
.
StatusInternalServerError
,
"Failed to find memo list"
)
.
SetInternal
(
err
)
}
}
...
@@ -79,7 +80,7 @@ func (s *Server) registerRSSRoutes(g *echo.Group) {
...
@@ -79,7 +80,7 @@ func (s *Server) registerRSSRoutes(g *echo.Group) {
const
MaxRSSItemCount
=
100
const
MaxRSSItemCount
=
100
const
MaxRSSItemTitleLength
=
100
const
MaxRSSItemTitleLength
=
100
func
(
s
*
Server
)
generateRSSFromMemoList
(
ctx
context
.
Context
,
memoList
[]
*
api
.
Memo
,
baseURL
string
,
profile
*
api
.
CustomizedProfile
)
(
string
,
error
)
{
func
(
s
*
Server
)
generateRSSFromMemoList
(
ctx
context
.
Context
,
memoList
[]
*
store
.
MemoMessage
,
baseURL
string
,
profile
*
api
.
CustomizedProfile
)
(
string
,
error
)
{
feed
:=
&
feeds
.
Feed
{
feed
:=
&
feeds
.
Feed
{
Title
:
profile
.
Name
,
Title
:
profile
.
Name
,
Link
:
&
feeds
.
Link
{
Href
:
baseURL
},
Link
:
&
feeds
.
Link
{
Href
:
baseURL
},
...
@@ -98,15 +99,15 @@ func (s *Server) generateRSSFromMemoList(ctx context.Context, memoList []*api.Me
...
@@ -98,15 +99,15 @@ func (s *Server) generateRSSFromMemoList(ctx context.Context, memoList []*api.Me
Created
:
time
.
Unix
(
memo
.
CreatedTs
,
0
),
Created
:
time
.
Unix
(
memo
.
CreatedTs
,
0
),
Enclosure
:
&
feeds
.
Enclosure
{
Url
:
baseURL
+
"/m/"
+
strconv
.
Itoa
(
memo
.
ID
)
+
"/image"
},
Enclosure
:
&
feeds
.
Enclosure
{
Url
:
baseURL
+
"/m/"
+
strconv
.
Itoa
(
memo
.
ID
)
+
"/image"
},
}
}
resourceList
,
err
:=
s
.
Store
.
FindResourceList
(
ctx
,
&
api
.
ResourceFind
{
if
len
(
memo
.
ResourceIDList
)
>
0
{
MemoID
:
&
memo
.
ID
,
resourceID
:=
memo
.
ResourceIDList
[
0
]
})
resource
,
err
:=
s
.
Store
.
FindResource
(
ctx
,
&
api
.
ResourceFind
{
if
err
!=
nil
{
ID
:
&
resourceID
,
return
""
,
err
})
}
if
err
!=
nil
{
if
len
(
resourceList
)
>
0
{
return
""
,
err
}
enclosure
:=
feeds
.
Enclosure
{}
enclosure
:=
feeds
.
Enclosure
{}
resource
:=
resourceList
[
0
]
if
resource
.
ExternalLink
!=
""
{
if
resource
.
ExternalLink
!=
""
{
enclosure
.
Url
=
resource
.
ExternalLink
enclosure
.
Url
=
resource
.
ExternalLink
}
else
{
}
else
{
...
...
server/tag.go
View file @
ea728d23
...
@@ -10,6 +10,7 @@ import (
...
@@ -10,6 +10,7 @@ import (
"github.com/pkg/errors"
"github.com/pkg/errors"
"github.com/usememos/memos/api"
"github.com/usememos/memos/api"
"github.com/usememos/memos/common"
"github.com/usememos/memos/common"
"github.com/usememos/memos/store"
"golang.org/x/exp/slices"
"golang.org/x/exp/slices"
"github.com/labstack/echo/v4"
"github.com/labstack/echo/v4"
...
@@ -71,14 +72,14 @@ func (s *Server) registerTagRoutes(g *echo.Group) {
...
@@ -71,14 +72,14 @@ func (s *Server) registerTagRoutes(g *echo.Group) {
return
echo
.
NewHTTPError
(
http
.
StatusBadRequest
,
"Missing user session"
)
return
echo
.
NewHTTPError
(
http
.
StatusBadRequest
,
"Missing user session"
)
}
}
contentSearch
:=
"#"
contentSearch
:=
"#"
normalRowStatus
:=
api
.
Normal
normalRowStatus
:=
store
.
Normal
memoFind
:=
api
.
MemoFind
{
memoFind
:=
&
store
.
FindMemoMessage
{
CreatorID
:
&
userID
,
CreatorID
:
&
userID
,
ContentSearch
:
&
contentSearch
,
ContentSearch
:
&
contentSearch
,
RowStatus
:
&
normalRowStatus
,
RowStatus
:
&
normalRowStatus
,
}
}
memo
List
,
err
:=
s
.
Store
.
FindMemoList
(
ctx
,
&
memoFind
)
memo
MessageList
,
err
:=
s
.
Store
.
ListMemos
(
ctx
,
memoFind
)
if
err
!=
nil
{
if
err
!=
nil
{
return
echo
.
NewHTTPError
(
http
.
StatusInternalServerError
,
"Failed to find memo list"
)
.
SetInternal
(
err
)
return
echo
.
NewHTTPError
(
http
.
StatusInternalServerError
,
"Failed to find memo list"
)
.
SetInternal
(
err
)
}
}
...
@@ -96,7 +97,7 @@ func (s *Server) registerTagRoutes(g *echo.Group) {
...
@@ -96,7 +97,7 @@ func (s *Server) registerTagRoutes(g *echo.Group) {
}
}
tagMapSet
:=
make
(
map
[
string
]
bool
)
tagMapSet
:=
make
(
map
[
string
]
bool
)
for
_
,
memo
:=
range
memoList
{
for
_
,
memo
:=
range
memo
Message
List
{
for
_
,
tag
:=
range
findTagListFromMemoContent
(
memo
.
Content
)
{
for
_
,
tag
:=
range
findTagListFromMemoContent
(
memo
.
Content
)
{
if
!
slices
.
Contains
(
tagNameList
,
tag
)
{
if
!
slices
.
Contains
(
tagNameList
,
tag
)
{
tagMapSet
[
tag
]
=
true
tagMapSet
[
tag
]
=
true
...
...
store/common.go
0 → 100644
View file @
ea728d23
package
store
// 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
(
r
RowStatus
)
String
()
string
{
switch
r
{
case
Normal
:
return
"NORMAL"
case
Archived
:
return
"ARCHIVED"
}
return
""
}
store/memo.go
View file @
ea728d23
This diff is collapsed.
Click to expand it.
store/memo_relation.go
View file @
ea728d23
...
@@ -6,30 +6,9 @@ import (
...
@@ -6,30 +6,9 @@ import (
"fmt"
"fmt"
"strings"
"strings"
"github.com/usememos/memos/api"
"github.com/usememos/memos/common"
"github.com/usememos/memos/common"
)
)
func
(
s
*
Store
)
ComposeMemoRelationList
(
ctx
context
.
Context
,
memo
*
api
.
Memo
)
error
{
memoRelationList
,
err
:=
s
.
ListMemoRelations
(
ctx
,
&
FindMemoRelationMessage
{
MemoID
:
&
memo
.
ID
,
})
if
err
!=
nil
{
return
err
}
memo
.
RelationList
=
[]
*
api
.
MemoRelation
{}
for
_
,
memoRelation
:=
range
memoRelationList
{
memo
.
RelationList
=
append
(
memo
.
RelationList
,
&
api
.
MemoRelation
{
MemoID
:
memoRelation
.
MemoID
,
RelatedMemoID
:
memoRelation
.
RelatedMemoID
,
Type
:
api
.
MemoRelationType
(
memoRelation
.
Type
),
})
}
return
nil
}
type
MemoRelationType
string
type
MemoRelationType
string
const
(
const
(
...
...
store/resource.go
View file @
ea728d23
...
@@ -4,7 +4,6 @@ import (
...
@@ -4,7 +4,6 @@ import (
"context"
"context"
"database/sql"
"database/sql"
"fmt"
"fmt"
"sort"
"strings"
"strings"
"github.com/usememos/memos/api"
"github.com/usememos/memos/api"
...
@@ -53,40 +52,6 @@ func (raw *resourceRaw) toResource() *api.Resource {
...
@@ -53,40 +52,6 @@ func (raw *resourceRaw) toResource() *api.Resource {
}
}
}
}
func
(
s
*
Store
)
ComposeMemoResourceList
(
ctx
context
.
Context
,
memo
*
api
.
Memo
)
error
{
resourceList
,
err
:=
s
.
FindResourceList
(
ctx
,
&
api
.
ResourceFind
{
MemoID
:
&
memo
.
ID
,
})
if
err
!=
nil
{
return
err
}
for
_
,
resource
:=
range
resourceList
{
memoResource
,
err
:=
s
.
FindMemoResource
(
ctx
,
&
api
.
MemoResourceFind
{
MemoID
:
&
memo
.
ID
,
ResourceID
:
&
resource
.
ID
,
})
if
err
!=
nil
{
return
err
}
resource
.
CreatedTs
=
memoResource
.
CreatedTs
resource
.
UpdatedTs
=
memoResource
.
UpdatedTs
}
sort
.
Slice
(
resourceList
,
func
(
i
,
j
int
)
bool
{
if
resourceList
[
i
]
.
CreatedTs
!=
resourceList
[
j
]
.
CreatedTs
{
return
resourceList
[
i
]
.
CreatedTs
<
resourceList
[
j
]
.
CreatedTs
}
return
resourceList
[
i
]
.
ID
<
resourceList
[
j
]
.
ID
})
memo
.
ResourceList
=
resourceList
return
nil
}
func
(
s
*
Store
)
CreateResource
(
ctx
context
.
Context
,
create
*
api
.
ResourceCreate
)
(
*
api
.
Resource
,
error
)
{
func
(
s
*
Store
)
CreateResource
(
ctx
context
.
Context
,
create
*
api
.
ResourceCreate
)
(
*
api
.
Resource
,
error
)
{
tx
,
err
:=
s
.
db
.
BeginTx
(
ctx
,
nil
)
tx
,
err
:=
s
.
db
.
BeginTx
(
ctx
,
nil
)
if
err
!=
nil
{
if
err
!=
nil
{
...
...
store/store.go
View file @
ea728d23
...
@@ -15,7 +15,6 @@ type Store struct {
...
@@ -15,7 +15,6 @@ type Store struct {
systemSettingCache
sync
.
Map
// map[string]*systemSettingRaw
systemSettingCache
sync
.
Map
// map[string]*systemSettingRaw
userCache
sync
.
Map
// map[int]*userRaw
userCache
sync
.
Map
// map[int]*userRaw
userSettingCache
sync
.
Map
// map[string]*userSettingRaw
userSettingCache
sync
.
Map
// map[string]*userSettingRaw
memoCache
sync
.
Map
// map[int]*memoRaw
shortcutCache
sync
.
Map
// map[int]*shortcutRaw
shortcutCache
sync
.
Map
// map[int]*shortcutRaw
idpCache
sync
.
Map
// map[int]*identityProviderMessage
idpCache
sync
.
Map
// map[int]*identityProviderMessage
}
}
...
...
store/user.go
View file @
ea728d23
...
@@ -11,34 +11,20 @@ import (
...
@@ -11,34 +11,20 @@ import (
)
)
func
(
s
*
Store
)
SeedDataForNewUser
(
ctx
context
.
Context
,
user
*
api
.
User
)
error
{
func
(
s
*
Store
)
SeedDataForNewUser
(
ctx
context
.
Context
,
user
*
api
.
User
)
error
{
tx
,
err
:=
s
.
db
.
BeginTx
(
ctx
,
nil
)
if
err
!=
nil
{
return
FormatError
(
err
)
}
defer
tx
.
Rollback
()
// Create a memo for the user.
// Create a memo for the user.
_
,
err
=
createMemoRaw
(
ctx
,
tx
,
&
api
.
MemoCreat
e
{
_
,
err
:=
s
.
CreateMemo
(
ctx
,
&
MemoMessag
e
{
CreatorID
:
user
.
ID
,
CreatorID
:
user
.
ID
,
Content
:
"#inbox Welcome to Memos!"
,
Content
:
"#inbox Welcome to Memos!"
,
Visibility
:
api
.
Private
,
Visibility
:
Private
,
})
})
if
err
!=
nil
{
if
err
!=
nil
{
return
err
return
err
}
}
_
,
err
=
upsertTag
(
ctx
,
tx
,
&
api
.
TagUpsert
{
_
,
err
=
s
.
UpsertTag
(
c
tx
,
&
api
.
TagUpsert
{
CreatorID
:
user
.
ID
,
CreatorID
:
user
.
ID
,
Name
:
"inbox"
,
Name
:
"inbox"
,
})
})
if
err
!=
nil
{
return
err
return
err
}
if
err
:=
tx
.
Commit
();
err
!=
nil
{
return
FormatError
(
err
)
}
return
nil
}
}
// userRaw is the store model for an User.
// userRaw is the store model for an User.
...
@@ -79,22 +65,6 @@ func (raw *userRaw) toUser() *api.User {
...
@@ -79,22 +65,6 @@ func (raw *userRaw) toUser() *api.User {
}
}
}
}
func
(
s
*
Store
)
ComposeMemoCreator
(
ctx
context
.
Context
,
memo
*
api
.
Memo
)
error
{
user
,
err
:=
s
.
FindUser
(
ctx
,
&
api
.
UserFind
{
ID
:
&
memo
.
CreatorID
,
})
if
err
!=
nil
{
return
err
}
if
user
.
Nickname
!=
""
{
memo
.
CreatorName
=
user
.
Nickname
}
else
{
memo
.
CreatorName
=
user
.
Username
}
return
nil
}
func
(
s
*
Store
)
CreateUser
(
ctx
context
.
Context
,
create
*
api
.
UserCreate
)
(
*
api
.
User
,
error
)
{
func
(
s
*
Store
)
CreateUser
(
ctx
context
.
Context
,
create
*
api
.
UserCreate
)
(
*
api
.
User
,
error
)
{
tx
,
err
:=
s
.
db
.
BeginTx
(
ctx
,
nil
)
tx
,
err
:=
s
.
db
.
BeginTx
(
ctx
,
nil
)
if
err
!=
nil
{
if
err
!=
nil
{
...
...
test/server/memo_relation_test.go
View file @
ea728d23
...
@@ -28,12 +28,12 @@ func TestMemoRelationServer(t *testing.T) {
...
@@ -28,12 +28,12 @@ func TestMemoRelationServer(t *testing.T) {
memoList
,
err
:=
s
.
getMemoList
()
memoList
,
err
:=
s
.
getMemoList
()
require
.
NoError
(
t
,
err
)
require
.
NoError
(
t
,
err
)
require
.
Len
(
t
,
memoList
,
1
)
require
.
Len
(
t
,
memoList
,
1
)
memo
,
err
:=
s
.
postMemoCreate
(
&
api
.
MemoCreate
{
memo
,
err
:=
s
.
postMemoCreate
(
&
api
.
CreateMemoRequest
{
Content
:
"test memo"
,
Content
:
"test memo"
,
})
})
require
.
NoError
(
t
,
err
)
require
.
NoError
(
t
,
err
)
require
.
Equal
(
t
,
"test memo"
,
memo
.
Content
)
require
.
Equal
(
t
,
"test memo"
,
memo
.
Content
)
memo2
,
err
:=
s
.
postMemoCreate
(
&
api
.
MemoCreate
{
memo2
,
err
:=
s
.
postMemoCreate
(
&
api
.
CreateMemoRequest
{
Content
:
"test memo2"
,
Content
:
"test memo2"
,
RelationList
:
[]
*
api
.
MemoRelationUpsert
{
RelationList
:
[]
*
api
.
MemoRelationUpsert
{
{
{
...
...
test/server/memo_test.go
View file @
ea728d23
...
@@ -28,7 +28,7 @@ func TestMemoServer(t *testing.T) {
...
@@ -28,7 +28,7 @@ func TestMemoServer(t *testing.T) {
memoList
,
err
:=
s
.
getMemoList
()
memoList
,
err
:=
s
.
getMemoList
()
require
.
NoError
(
t
,
err
)
require
.
NoError
(
t
,
err
)
require
.
Len
(
t
,
memoList
,
1
)
require
.
Len
(
t
,
memoList
,
1
)
memo
,
err
:=
s
.
postMemoCreate
(
&
api
.
MemoCreate
{
memo
,
err
:=
s
.
postMemoCreate
(
&
api
.
CreateMemoRequest
{
Content
:
"test memo"
,
Content
:
"test memo"
,
})
})
require
.
NoError
(
t
,
err
)
require
.
NoError
(
t
,
err
)
...
@@ -37,7 +37,7 @@ func TestMemoServer(t *testing.T) {
...
@@ -37,7 +37,7 @@ func TestMemoServer(t *testing.T) {
require
.
NoError
(
t
,
err
)
require
.
NoError
(
t
,
err
)
require
.
Len
(
t
,
memoList
,
2
)
require
.
Len
(
t
,
memoList
,
2
)
updatedContent
:=
"updated memo"
updatedContent
:=
"updated memo"
memo
,
err
=
s
.
patchMemo
(
&
api
.
MemoPatch
{
memo
,
err
=
s
.
patchMemo
(
&
api
.
PatchMemoRequest
{
ID
:
memo
.
ID
,
ID
:
memo
.
ID
,
Content
:
&
updatedContent
,
Content
:
&
updatedContent
,
})
})
...
@@ -50,23 +50,21 @@ func TestMemoServer(t *testing.T) {
...
@@ -50,23 +50,21 @@ func TestMemoServer(t *testing.T) {
Pinned
:
true
,
Pinned
:
true
,
})
})
require
.
NoError
(
t
,
err
)
require
.
NoError
(
t
,
err
)
memo
,
err
=
s
.
patchMemo
(
&
api
.
MemoPatch
{
memo
,
err
=
s
.
patchMemo
(
&
api
.
PatchMemoRequest
{
ID
:
memo
.
ID
,
ID
:
memo
.
ID
,
Content
:
&
updatedContent
,
Content
:
&
updatedContent
,
})
})
require
.
NoError
(
t
,
err
)
require
.
NoError
(
t
,
err
)
require
.
Equal
(
t
,
updatedContent
,
memo
.
Content
)
require
.
Equal
(
t
,
updatedContent
,
memo
.
Content
)
require
.
Equal
(
t
,
true
,
memo
.
Pinned
)
require
.
Equal
(
t
,
true
,
memo
.
Pinned
)
err
=
s
.
deleteMemo
(
&
api
.
MemoDelete
{
err
=
s
.
deleteMemo
(
memo
.
ID
)
ID
:
memo
.
ID
,
})
require
.
NoError
(
t
,
err
)
require
.
NoError
(
t
,
err
)
memoList
,
err
=
s
.
getMemoList
()
memoList
,
err
=
s
.
getMemoList
()
require
.
NoError
(
t
,
err
)
require
.
NoError
(
t
,
err
)
require
.
Len
(
t
,
memoList
,
1
)
require
.
Len
(
t
,
memoList
,
1
)
}
}
func
(
s
*
TestingServer
)
getMemo
(
memoID
int
)
(
*
api
.
Memo
,
error
)
{
func
(
s
*
TestingServer
)
getMemo
(
memoID
int
)
(
*
api
.
Memo
Response
,
error
)
{
body
,
err
:=
s
.
get
(
fmt
.
Sprintf
(
"/api/memo/%d"
,
memoID
),
nil
)
body
,
err
:=
s
.
get
(
fmt
.
Sprintf
(
"/api/memo/%d"
,
memoID
),
nil
)
if
err
!=
nil
{
if
err
!=
nil
{
return
nil
,
err
return
nil
,
err
...
@@ -79,7 +77,7 @@ func (s *TestingServer) getMemo(memoID int) (*api.Memo, error) {
...
@@ -79,7 +77,7 @@ func (s *TestingServer) getMemo(memoID int) (*api.Memo, error) {
}
}
type
MemoCreateResponse
struct
{
type
MemoCreateResponse
struct
{
Data
*
api
.
Memo
`json:"data"`
Data
*
api
.
Memo
Response
`json:"data"`
}
}
res
:=
new
(
MemoCreateResponse
)
res
:=
new
(
MemoCreateResponse
)
if
err
=
json
.
Unmarshal
(
buf
.
Bytes
(),
res
);
err
!=
nil
{
if
err
=
json
.
Unmarshal
(
buf
.
Bytes
(),
res
);
err
!=
nil
{
...
@@ -88,7 +86,7 @@ func (s *TestingServer) getMemo(memoID int) (*api.Memo, error) {
...
@@ -88,7 +86,7 @@ func (s *TestingServer) getMemo(memoID int) (*api.Memo, error) {
return
res
.
Data
,
nil
return
res
.
Data
,
nil
}
}
func
(
s
*
TestingServer
)
getMemoList
()
([]
*
api
.
Memo
,
error
)
{
func
(
s
*
TestingServer
)
getMemoList
()
([]
*
api
.
Memo
Response
,
error
)
{
body
,
err
:=
s
.
get
(
"/api/memo"
,
nil
)
body
,
err
:=
s
.
get
(
"/api/memo"
,
nil
)
if
err
!=
nil
{
if
err
!=
nil
{
return
nil
,
err
return
nil
,
err
...
@@ -101,7 +99,7 @@ func (s *TestingServer) getMemoList() ([]*api.Memo, error) {
...
@@ -101,7 +99,7 @@ func (s *TestingServer) getMemoList() ([]*api.Memo, error) {
}
}
type
MemoCreateResponse
struct
{
type
MemoCreateResponse
struct
{
Data
[]
*
api
.
Memo
`json:"data"`
Data
[]
*
api
.
Memo
Response
`json:"data"`
}
}
res
:=
new
(
MemoCreateResponse
)
res
:=
new
(
MemoCreateResponse
)
if
err
=
json
.
Unmarshal
(
buf
.
Bytes
(),
res
);
err
!=
nil
{
if
err
=
json
.
Unmarshal
(
buf
.
Bytes
(),
res
);
err
!=
nil
{
...
@@ -110,7 +108,7 @@ func (s *TestingServer) getMemoList() ([]*api.Memo, error) {
...
@@ -110,7 +108,7 @@ func (s *TestingServer) getMemoList() ([]*api.Memo, error) {
return
res
.
Data
,
nil
return
res
.
Data
,
nil
}
}
func
(
s
*
TestingServer
)
postMemoCreate
(
memoCreate
*
api
.
MemoCreate
)
(
*
api
.
Memo
,
error
)
{
func
(
s
*
TestingServer
)
postMemoCreate
(
memoCreate
*
api
.
CreateMemoRequest
)
(
*
api
.
MemoResponse
,
error
)
{
rawData
,
err
:=
json
.
Marshal
(
&
memoCreate
)
rawData
,
err
:=
json
.
Marshal
(
&
memoCreate
)
if
err
!=
nil
{
if
err
!=
nil
{
return
nil
,
errors
.
Wrap
(
err
,
"failed to marshal memo create"
)
return
nil
,
errors
.
Wrap
(
err
,
"failed to marshal memo create"
)
...
@@ -128,7 +126,7 @@ func (s *TestingServer) postMemoCreate(memoCreate *api.MemoCreate) (*api.Memo, e
...
@@ -128,7 +126,7 @@ func (s *TestingServer) postMemoCreate(memoCreate *api.MemoCreate) (*api.Memo, e
}
}
type
MemoCreateResponse
struct
{
type
MemoCreateResponse
struct
{
Data
*
api
.
Memo
`json:"data"`
Data
*
api
.
Memo
Response
`json:"data"`
}
}
res
:=
new
(
MemoCreateResponse
)
res
:=
new
(
MemoCreateResponse
)
if
err
=
json
.
Unmarshal
(
buf
.
Bytes
(),
res
);
err
!=
nil
{
if
err
=
json
.
Unmarshal
(
buf
.
Bytes
(),
res
);
err
!=
nil
{
...
@@ -137,7 +135,7 @@ func (s *TestingServer) postMemoCreate(memoCreate *api.MemoCreate) (*api.Memo, e
...
@@ -137,7 +135,7 @@ func (s *TestingServer) postMemoCreate(memoCreate *api.MemoCreate) (*api.Memo, e
return
res
.
Data
,
nil
return
res
.
Data
,
nil
}
}
func
(
s
*
TestingServer
)
patchMemo
(
memoPatch
*
api
.
MemoPatch
)
(
*
api
.
Memo
,
error
)
{
func
(
s
*
TestingServer
)
patchMemo
(
memoPatch
*
api
.
PatchMemoRequest
)
(
*
api
.
MemoResponse
,
error
)
{
rawData
,
err
:=
json
.
Marshal
(
&
memoPatch
)
rawData
,
err
:=
json
.
Marshal
(
&
memoPatch
)
if
err
!=
nil
{
if
err
!=
nil
{
return
nil
,
errors
.
Wrap
(
err
,
"failed to marshal memo patch"
)
return
nil
,
errors
.
Wrap
(
err
,
"failed to marshal memo patch"
)
...
@@ -155,7 +153,7 @@ func (s *TestingServer) patchMemo(memoPatch *api.MemoPatch) (*api.Memo, error) {
...
@@ -155,7 +153,7 @@ func (s *TestingServer) patchMemo(memoPatch *api.MemoPatch) (*api.Memo, error) {
}
}
type
MemoPatchResponse
struct
{
type
MemoPatchResponse
struct
{
Data
*
api
.
Memo
`json:"data"`
Data
*
api
.
Memo
Response
`json:"data"`
}
}
res
:=
new
(
MemoPatchResponse
)
res
:=
new
(
MemoPatchResponse
)
if
err
=
json
.
Unmarshal
(
buf
.
Bytes
(),
res
);
err
!=
nil
{
if
err
=
json
.
Unmarshal
(
buf
.
Bytes
(),
res
);
err
!=
nil
{
...
@@ -164,12 +162,12 @@ func (s *TestingServer) patchMemo(memoPatch *api.MemoPatch) (*api.Memo, error) {
...
@@ -164,12 +162,12 @@ func (s *TestingServer) patchMemo(memoPatch *api.MemoPatch) (*api.Memo, error) {
return
res
.
Data
,
nil
return
res
.
Data
,
nil
}
}
func
(
s
*
TestingServer
)
deleteMemo
(
memo
Delete
*
api
.
MemoDelete
)
error
{
func
(
s
*
TestingServer
)
deleteMemo
(
memo
ID
int
)
error
{
_
,
err
:=
s
.
delete
(
fmt
.
Sprintf
(
"/api/memo/%d"
,
memo
Delete
.
ID
),
nil
)
_
,
err
:=
s
.
delete
(
fmt
.
Sprintf
(
"/api/memo/%d"
,
memoID
),
nil
)
return
err
return
err
}
}
func
(
s
*
TestingServer
)
postMemosOrganizer
(
memosOrganizer
*
api
.
MemoOrganizerUpsert
)
(
*
api
.
Memo
,
error
)
{
func
(
s
*
TestingServer
)
postMemosOrganizer
(
memosOrganizer
*
api
.
MemoOrganizerUpsert
)
(
*
api
.
Memo
Response
,
error
)
{
rawData
,
err
:=
json
.
Marshal
(
&
memosOrganizer
)
rawData
,
err
:=
json
.
Marshal
(
&
memosOrganizer
)
if
err
!=
nil
{
if
err
!=
nil
{
return
nil
,
errors
.
Wrap
(
err
,
"failed to marshal memos organizer"
)
return
nil
,
errors
.
Wrap
(
err
,
"failed to marshal memos organizer"
)
...
@@ -187,7 +185,7 @@ func (s *TestingServer) postMemosOrganizer(memosOrganizer *api.MemoOrganizerUpse
...
@@ -187,7 +185,7 @@ func (s *TestingServer) postMemosOrganizer(memosOrganizer *api.MemoOrganizerUpse
}
}
type
MemoOrganizerResponse
struct
{
type
MemoOrganizerResponse
struct
{
Data
*
api
.
Memo
`json:"data"`
Data
*
api
.
Memo
Response
`json:"data"`
}
}
res
:=
new
(
MemoOrganizerResponse
)
res
:=
new
(
MemoOrganizerResponse
)
if
err
=
json
.
Unmarshal
(
buf
.
Bytes
(),
res
);
err
!=
nil
{
if
err
=
json
.
Unmarshal
(
buf
.
Bytes
(),
res
);
err
!=
nil
{
...
...
test/store/memo_relation_test.go
View file @
ea728d23
...
@@ -5,7 +5,6 @@ import (
...
@@ -5,7 +5,6 @@ import (
"testing"
"testing"
"github.com/stretchr/testify/require"
"github.com/stretchr/testify/require"
"github.com/usememos/memos/api"
"github.com/usememos/memos/store"
"github.com/usememos/memos/store"
)
)
...
@@ -14,22 +13,22 @@ func TestMemoRelationStore(t *testing.T) {
...
@@ -14,22 +13,22 @@ func TestMemoRelationStore(t *testing.T) {
ts
:=
NewTestingStore
(
ctx
,
t
)
ts
:=
NewTestingStore
(
ctx
,
t
)
user
,
err
:=
createTestingHostUser
(
ctx
,
ts
)
user
,
err
:=
createTestingHostUser
(
ctx
,
ts
)
require
.
NoError
(
t
,
err
)
require
.
NoError
(
t
,
err
)
memoCreate
:=
&
api
.
MemoCreat
e
{
memoCreate
:=
&
store
.
MemoMessag
e
{
CreatorID
:
user
.
ID
,
CreatorID
:
user
.
ID
,
Content
:
"test_content"
,
Content
:
"test_content"
,
Visibility
:
api
.
Public
,
Visibility
:
store
.
Public
,
}
}
memo
,
err
:=
ts
.
CreateMemo
(
ctx
,
memoCreate
)
memo
,
err
:=
ts
.
CreateMemo
(
ctx
,
memoCreate
)
require
.
NoError
(
t
,
err
)
require
.
NoError
(
t
,
err
)
require
.
Equal
(
t
,
memoCreate
.
Content
,
memo
.
Content
)
require
.
Equal
(
t
,
memoCreate
.
Content
,
memo
.
Content
)
memo
Create
=
&
api
.
MemoCreat
e
{
memo
2Create
:=
&
store
.
MemoMessag
e
{
CreatorID
:
user
.
ID
,
CreatorID
:
user
.
ID
,
Content
:
"test_content_2"
,
Content
:
"test_content_2"
,
Visibility
:
api
.
Public
,
Visibility
:
store
.
Public
,
}
}
memo2
,
err
:=
ts
.
CreateMemo
(
ctx
,
memoCreate
)
memo2
,
err
:=
ts
.
CreateMemo
(
ctx
,
memo
2
Create
)
require
.
NoError
(
t
,
err
)
require
.
NoError
(
t
,
err
)
require
.
Equal
(
t
,
memoCreate
.
Content
,
memo2
.
Content
)
require
.
Equal
(
t
,
memo
2
Create
.
Content
,
memo2
.
Content
)
memoRelationMessage
:=
&
store
.
MemoRelationMessage
{
memoRelationMessage
:=
&
store
.
MemoRelationMessage
{
MemoID
:
memo
.
ID
,
MemoID
:
memo
.
ID
,
RelatedMemoID
:
memo2
.
ID
,
RelatedMemoID
:
memo2
.
ID
,
...
@@ -45,7 +44,7 @@ func TestMemoRelationStore(t *testing.T) {
...
@@ -45,7 +44,7 @@ func TestMemoRelationStore(t *testing.T) {
require
.
Equal
(
t
,
memo2
.
ID
,
memoRelation
[
0
]
.
RelatedMemoID
)
require
.
Equal
(
t
,
memo2
.
ID
,
memoRelation
[
0
]
.
RelatedMemoID
)
require
.
Equal
(
t
,
memo
.
ID
,
memoRelation
[
0
]
.
MemoID
)
require
.
Equal
(
t
,
memo
.
ID
,
memoRelation
[
0
]
.
MemoID
)
require
.
Equal
(
t
,
store
.
MemoRelationReference
,
memoRelation
[
0
]
.
Type
)
require
.
Equal
(
t
,
store
.
MemoRelationReference
,
memoRelation
[
0
]
.
Type
)
err
=
ts
.
DeleteMemo
(
ctx
,
&
api
.
MemoDelet
e
{
err
=
ts
.
DeleteMemo
(
ctx
,
&
store
.
DeleteMemoMessag
e
{
ID
:
memo2
.
ID
,
ID
:
memo2
.
ID
,
})
})
require
.
NoError
(
t
,
err
)
require
.
NoError
(
t
,
err
)
...
...
test/store/memo_test.go
View file @
ea728d23
...
@@ -5,37 +5,40 @@ import (
...
@@ -5,37 +5,40 @@ import (
"testing"
"testing"
"github.com/stretchr/testify/require"
"github.com/stretchr/testify/require"
"github.com/usememos/memos/
api
"
"github.com/usememos/memos/
store
"
)
)
func
TestMemoStore
(
t
*
testing
.
T
)
{
func
TestMemoStore
(
t
*
testing
.
T
)
{
ctx
:=
context
.
Background
()
ctx
:=
context
.
Background
()
store
:=
NewTestingStore
(
ctx
,
t
)
ts
:=
NewTestingStore
(
ctx
,
t
)
user
,
err
:=
createTestingHostUser
(
ctx
,
store
)
user
,
err
:=
createTestingHostUser
(
ctx
,
ts
)
require
.
NoError
(
t
,
err
)
require
.
NoError
(
t
,
err
)
memoCreate
:=
&
api
.
MemoCreat
e
{
memoCreate
:=
&
store
.
MemoMessag
e
{
CreatorID
:
user
.
ID
,
CreatorID
:
user
.
ID
,
Content
:
"test_content"
,
Content
:
"test_content"
,
Visibility
:
api
.
Public
,
Visibility
:
store
.
Public
,
}
}
memo
,
err
:=
store
.
CreateMemo
(
ctx
,
memoCreate
)
memo
,
err
:=
ts
.
CreateMemo
(
ctx
,
memoCreate
)
require
.
NoError
(
t
,
err
)
require
.
NoError
(
t
,
err
)
require
.
Equal
(
t
,
memoCreate
.
Content
,
memo
.
Content
)
require
.
Equal
(
t
,
memoCreate
.
Content
,
memo
.
Content
)
memoPatchContent
:=
"test_content_2"
memoPatchContent
:=
"test_content_2"
memoPatch
:=
&
api
.
MemoPatch
{
memoPatch
:=
&
store
.
UpdateMemoMessage
{
ID
:
memo
.
ID
,
ID
:
memo
.
ID
,
Content
:
&
memoPatchContent
,
Content
:
&
memoPatchContent
,
}
}
memo
,
err
=
store
.
Patch
Memo
(
ctx
,
memoPatch
)
err
=
ts
.
Update
Memo
(
ctx
,
memoPatch
)
require
.
NoError
(
t
,
err
)
require
.
NoError
(
t
,
err
)
require
.
Equal
(
t
,
memoPatchContent
,
memo
.
Content
)
memo
,
err
=
ts
.
GetMemo
(
ctx
,
&
store
.
FindMemoMessage
{
memoList
,
err
:=
store
.
FindMemoList
(
ctx
,
&
api
.
MemoFind
{
ID
:
&
memo
.
ID
,
})
require
.
NoError
(
t
,
err
)
memoList
,
err
:=
ts
.
ListMemos
(
ctx
,
&
store
.
FindMemoMessage
{
CreatorID
:
&
user
.
ID
,
CreatorID
:
&
user
.
ID
,
})
})
require
.
NoError
(
t
,
err
)
require
.
NoError
(
t
,
err
)
require
.
Equal
(
t
,
2
,
len
(
memoList
))
require
.
Equal
(
t
,
2
,
len
(
memoList
))
require
.
Equal
(
t
,
memo
,
memoList
[
1
])
require
.
Equal
(
t
,
memo
,
memoList
[
1
])
err
=
store
.
DeleteMemo
(
ctx
,
&
api
.
MemoDelet
e
{
err
=
ts
.
DeleteMemo
(
ctx
,
&
store
.
DeleteMemoMessag
e
{
ID
:
memo
.
ID
,
ID
:
memo
.
ID
,
})
})
require
.
NoError
(
t
,
err
)
require
.
NoError
(
t
,
err
)
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment