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
4ea78fa1
Commit
4ea78fa1
authored
Oct 27, 2023
by
Steven
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
chore: impl inbox store methods
parent
93b8e221
Changes
4
Show whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
170 additions
and
8 deletions
+170
-8
common.go
store/db/sqlite/common.go
+9
-0
inbox.go
store/db/sqlite/inbox.go
+105
-7
LATEST__SCHEMA.sql
store/db/sqlite/migration/dev/LATEST__SCHEMA.sql
+1
-1
inbox_test.go
test/store/inbox_test.go
+55
-0
No files found.
store/db/sqlite/common.go
0 → 100644
View file @
4ea78fa1
package
sqlite
import
"google.golang.org/protobuf/encoding/protojson"
var
(
protojsonUnmarshaler
=
protojson
.
UnmarshalOptions
{
DiscardUnknown
:
true
,
}
)
store/db/sqlite/inbox.go
View file @
4ea78fa1
...
@@ -2,26 +2,124 @@ package sqlite
...
@@ -2,26 +2,124 @@ package sqlite
import
(
import
(
"context"
"context"
"strings"
"github.com/pkg/errors"
"google.golang.org/protobuf/encoding/protojson"
storepb
"github.com/usememos/memos/proto/gen/store"
"github.com/usememos/memos/store"
"github.com/usememos/memos/store"
)
)
// nolint
func
(
d
*
DB
)
CreateInbox
(
ctx
context
.
Context
,
create
*
store
.
Inbox
)
(
*
store
.
Inbox
,
error
)
{
func
(
d
*
DB
)
CreateInbox
(
ctx
context
.
Context
,
create
*
store
.
Inbox
)
(
*
store
.
Inbox
,
error
)
{
return
nil
,
nil
messageString
:=
"{}"
if
create
.
Message
!=
nil
{
bytes
,
err
:=
protojson
.
Marshal
(
create
.
Message
)
if
err
!=
nil
{
return
nil
,
errors
.
Wrap
(
err
,
"failed to marshal inbox message"
)
}
messageString
=
string
(
bytes
)
}
fields
:=
[]
string
{
"`sender_id`"
,
"`receiver_id`"
,
"`status`"
,
"`message`"
}
placeholder
:=
[]
string
{
"?"
,
"?"
,
"?"
,
"?"
}
args
:=
[]
any
{
create
.
SenderID
,
create
.
ReceiverID
,
create
.
Status
,
messageString
}
stmt
:=
"INSERT INTO inbox ("
+
strings
.
Join
(
fields
,
", "
)
+
") VALUES ("
+
strings
.
Join
(
placeholder
,
", "
)
+
") RETURNING `id`, `created_ts`"
if
err
:=
d
.
db
.
QueryRowContext
(
ctx
,
stmt
,
args
...
)
.
Scan
(
&
create
.
ID
,
&
create
.
CreatedTs
,
);
err
!=
nil
{
return
nil
,
err
}
return
create
,
nil
}
}
// nolint
func
(
d
*
DB
)
ListInboxes
(
ctx
context
.
Context
,
find
*
store
.
FindInbox
)
([]
*
store
.
Inbox
,
error
)
{
func
(
d
*
DB
)
ListInboxes
(
ctx
context
.
Context
,
find
*
store
.
FindInbox
)
([]
*
store
.
Inbox
,
error
)
{
return
nil
,
nil
where
,
args
:=
[]
string
{
"1 = 1"
},
[]
any
{}
if
find
.
ID
!=
nil
{
where
,
args
=
append
(
where
,
"`id` = ?"
),
append
(
args
,
*
find
.
ID
)
}
if
find
.
SenderID
!=
nil
{
where
,
args
=
append
(
where
,
"`sender_id` = ?"
),
append
(
args
,
*
find
.
SenderID
)
}
if
find
.
ReceiverID
!=
nil
{
where
,
args
=
append
(
where
,
"`receiver_id` = ?"
),
append
(
args
,
*
find
.
ReceiverID
)
}
if
find
.
Status
!=
nil
{
where
,
args
=
append
(
where
,
"`status` = ?"
),
append
(
args
,
*
find
.
Status
)
}
query
:=
"SELECT `id`, `created_ts`, `sender_id`, `receiver_id`, `status`, `message` FROM `inbox` WHERE "
+
strings
.
Join
(
where
,
" AND "
)
rows
,
err
:=
d
.
db
.
QueryContext
(
ctx
,
query
,
args
...
)
if
err
!=
nil
{
return
nil
,
err
}
defer
rows
.
Close
()
list
:=
[]
*
store
.
Inbox
{}
for
rows
.
Next
()
{
inbox
:=
&
store
.
Inbox
{}
var
messageBytes
[]
byte
if
err
:=
rows
.
Scan
(
&
inbox
.
ID
,
&
inbox
.
CreatedTs
,
&
inbox
.
SenderID
,
&
inbox
.
ReceiverID
,
&
inbox
.
Status
,
&
messageBytes
,
);
err
!=
nil
{
return
nil
,
err
}
message
:=
&
storepb
.
InboxMessage
{}
if
err
:=
protojsonUnmarshaler
.
Unmarshal
(
messageBytes
,
message
);
err
!=
nil
{
return
nil
,
err
}
inbox
.
Message
=
message
list
=
append
(
list
,
inbox
)
}
if
err
:=
rows
.
Err
();
err
!=
nil
{
return
nil
,
err
}
return
list
,
nil
}
}
// nolint
func
(
d
*
DB
)
UpdateInbox
(
ctx
context
.
Context
,
update
*
store
.
UpdateInbox
)
(
*
store
.
Inbox
,
error
)
{
func
(
d
*
DB
)
UpdateInbox
(
ctx
context
.
Context
,
update
*
store
.
UpdateInbox
)
(
*
store
.
Inbox
,
error
)
{
return
nil
,
nil
set
,
args
:=
[]
string
{
"status"
},
[]
any
{
update
.
Status
}
args
=
append
(
args
,
update
.
ID
)
query
:=
"UPDATE inbox SET "
+
strings
.
Join
(
set
,
" = ?, "
)
+
" = ? WHERE id = ? RETURNING `id`, `created_ts`, `sender_id`, `receiver_id`, `status`, `message`"
inbox
:=
&
store
.
Inbox
{}
var
messageBytes
[]
byte
if
err
:=
d
.
db
.
QueryRowContext
(
ctx
,
query
,
args
...
)
.
Scan
(
&
inbox
.
ID
,
&
inbox
.
CreatedTs
,
&
inbox
.
SenderID
,
&
inbox
.
ReceiverID
,
&
inbox
.
Status
,
&
messageBytes
,
);
err
!=
nil
{
return
nil
,
err
}
message
:=
&
storepb
.
InboxMessage
{}
if
err
:=
protojsonUnmarshaler
.
Unmarshal
(
messageBytes
,
message
);
err
!=
nil
{
return
nil
,
err
}
inbox
.
Message
=
message
return
inbox
,
nil
}
}
// nolint
func
(
d
*
DB
)
DeleteInbox
(
ctx
context
.
Context
,
delete
*
store
.
DeleteInbox
)
error
{
func
(
d
*
DB
)
DeleteInbox
(
ctx
context
.
Context
,
delete
*
store
.
DeleteInbox
)
error
{
result
,
err
:=
d
.
db
.
ExecContext
(
ctx
,
"DELETE FROM inbox WHERE id = ?"
,
delete
.
ID
)
if
err
!=
nil
{
return
err
}
if
_
,
err
:=
result
.
RowsAffected
();
err
!=
nil
{
return
err
}
return
nil
return
nil
}
}
store/db/sqlite/migration/dev/LATEST__SCHEMA.sql
View file @
4ea78fa1
...
@@ -141,6 +141,6 @@ CREATE TABLE inbox (
...
@@ -141,6 +141,6 @@ CREATE TABLE inbox (
created_ts
BIGINT
NOT
NULL
DEFAULT
(
strftime
(
'%s'
,
'now'
)),
created_ts
BIGINT
NOT
NULL
DEFAULT
(
strftime
(
'%s'
,
'now'
)),
sender_id
INTEGER
NOT
NULL
,
sender_id
INTEGER
NOT
NULL
,
receiver_id
INTEGER
NOT
NULL
,
receiver_id
INTEGER
NOT
NULL
,
status
TEXT
NOT
NULL
CHECK
(
status
IN
(
'UNREAD'
,
'READ'
,
'ARCHIVED'
))
DEFAULT
'UNREAD'
,
status
TEXT
NOT
NULL
,
message
TEXT
NOT
NULL
DEFAULT
'{}'
message
TEXT
NOT
NULL
DEFAULT
'{}'
);
);
test/store/inbox_test.go
0 → 100644
View file @
4ea78fa1
package
teststore
import
(
"context"
"testing"
"github.com/stretchr/testify/require"
storepb
"github.com/usememos/memos/proto/gen/store"
"github.com/usememos/memos/store"
)
func
TestInboxStore
(
t
*
testing
.
T
)
{
ctx
:=
context
.
Background
()
ts
:=
NewTestingStore
(
ctx
,
t
)
user
,
err
:=
createTestingHostUser
(
ctx
,
ts
)
require
.
NoError
(
t
,
err
)
const
systemBotID
int32
=
0
create
:=
&
store
.
Inbox
{
SenderID
:
systemBotID
,
ReceiverID
:
user
.
ID
,
Status
:
store
.
UNREAD
,
Message
:
&
storepb
.
InboxMessage
{
Title
:
"title"
,
Content
:
"content"
,
Link
:
"link"
,
},
}
inbox
,
err
:=
ts
.
CreateInbox
(
ctx
,
create
)
require
.
NoError
(
t
,
err
)
require
.
NotNil
(
t
,
inbox
)
require
.
Equal
(
t
,
create
.
Message
,
inbox
.
Message
)
inboxes
,
err
:=
ts
.
ListInboxes
(
ctx
,
&
store
.
FindInbox
{
ReceiverID
:
&
user
.
ID
,
})
require
.
NoError
(
t
,
err
)
require
.
Equal
(
t
,
1
,
len
(
inboxes
))
require
.
Equal
(
t
,
inbox
,
inboxes
[
0
])
updatedInbox
,
err
:=
ts
.
UpdateInbox
(
ctx
,
&
store
.
UpdateInbox
{
ID
:
inbox
.
ID
,
Status
:
store
.
READ
,
})
require
.
NoError
(
t
,
err
)
require
.
NotNil
(
t
,
updatedInbox
)
require
.
Equal
(
t
,
store
.
READ
,
updatedInbox
.
Status
)
err
=
ts
.
DeleteInbox
(
ctx
,
&
store
.
DeleteInbox
{
ID
:
inbox
.
ID
,
})
require
.
NoError
(
t
,
err
)
inboxes
,
err
=
ts
.
ListInboxes
(
ctx
,
&
store
.
FindInbox
{
ReceiverID
:
&
user
.
ID
,
})
require
.
NoError
(
t
,
err
)
require
.
Equal
(
t
,
0
,
len
(
inboxes
))
}
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