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
697d01e3
Unverified
Commit
697d01e3
authored
Jul 08, 2022
by
boojack
Committed by
GitHub
Jul 08, 2022
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
feat: add `visibility` field to memo (#109)
* feat: add `visibility` field to memo * chore: fix typo
parent
aed13747
Changes
6
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
67 additions
and
24 deletions
+67
-24
memo.go
api/memo.go
+28
-4
memo.go
server/memo.go
+3
-0
01__memo_visibility.sql
store/db/migration/0.2/01__memo_visibility.sql
+1
-0
LATEST__SCHEMA.sql
store/db/migration/LATEST__SCHEMA.sql
+1
-0
10002__memo.sql
store/db/seed/10002__memo.sql
+5
-3
memo.go
store/memo.go
+29
-17
No files found.
api/memo.go
View file @
697d01e3
package
api
// Visibility is the type of a visibility.
type
Visibility
string
const
(
// Public is the PUBLIC visibility.
Public
Visibility
=
"PUBLIC"
// Privite is the PRIVATE visibility.
Privite
Visibility
=
"PRIVATE"
)
func
(
e
Visibility
)
String
()
string
{
switch
e
{
case
Public
:
return
"PUBLIC"
case
Privite
:
return
"PRIVATE"
}
return
"PRIVATE"
}
type
Memo
struct
{
ID
int
`json:"id"`
...
...
@@ -10,8 +30,9 @@ type Memo struct {
UpdatedTs
int64
`json:"updatedTs"`
// Domain specific fields
Content
string
`json:"content"`
Pinned
bool
`json:"pinned"`
Content
string
`json:"content"`
Visibility
Visibility
`json:"visibility"`
Pinned
bool
`json:"pinned"`
}
type
MemoCreate
struct
{
...
...
@@ -21,7 +42,8 @@ type MemoCreate struct {
CreatedTs
*
int64
`json:"createdTs"`
// Domain specific fields
Content
string
`json:"content"`
Content
string
`json:"content"`
Visibility
Visibility
`json:"visibility"`
}
type
MemoPatch
struct
{
...
...
@@ -31,7 +53,8 @@ type MemoPatch struct {
RowStatus
*
RowStatus
`json:"rowStatus"`
// Domain specific fields
Content
*
string
`json:"content"`
Content
*
string
`json:"content"`
Visibility
*
Visibility
`json:"visibility"`
}
type
MemoFind
struct
{
...
...
@@ -44,6 +67,7 @@ type MemoFind struct {
// Domain specific fields
Pinned
*
bool
ContentSearch
*
string
Visibility
*
Visibility
// Pagination
Limit
int
...
...
server/memo.go
View file @
697d01e3
...
...
@@ -22,6 +22,9 @@ func (s *Server) registerMemoRoutes(g *echo.Group) {
return
echo
.
NewHTTPError
(
http
.
StatusBadRequest
,
"Malformatted post memo request"
)
.
SetInternal
(
err
)
}
// TODO(steven): remove this line after frontend is ready
memoCreate
.
Visibility
=
api
.
Privite
memo
,
err
:=
s
.
Store
.
CreateMemo
(
memoCreate
)
if
err
!=
nil
{
return
echo
.
NewHTTPError
(
http
.
StatusInternalServerError
,
"Failed to create memo"
)
.
SetInternal
(
err
)
...
...
store/db/migration/0.2/01__memo_visibility.sql
0 → 100644
View file @
697d01e3
ALTER
TABLE
memo
ADD
visibility
TEXT
NOT
NULL
CHECK
(
visibility
IN
(
'PUBLIC'
,
'PRIVATE'
))
DEFAULT
'PRIVATE'
;
store/db/migration/LATEST__SCHEMA.sql
View file @
697d01e3
...
...
@@ -44,6 +44,7 @@ CREATE TABLE memo (
updated_ts
BIGINT
NOT
NULL
DEFAULT
(
strftime
(
'%s'
,
'now'
)),
row_status
TEXT
NOT
NULL
CHECK
(
row_status
IN
(
'NORMAL'
,
'ARCHIVED'
))
DEFAULT
'NORMAL'
,
content
TEXT
NOT
NULL
DEFAULT
''
,
visibility
TEXT
NOT
NULL
CHECK
(
visibility
IN
(
'PUBLIC'
,
'PRIVATE'
))
DEFAULT
'PRIVATE'
,
FOREIGN
KEY
(
creator_id
)
REFERENCES
user
(
id
)
ON
DELETE
CASCADE
);
...
...
store/db/seed/10002__memo.sql
View file @
697d01e3
...
...
@@ -34,13 +34,15 @@ INSERT INTO
memo
(
`id`
,
`content`
,
`creator_id`
`creator_id`
,
`visibility`
)
VALUES
(
103
,
'好好学习,天天向上。🤜🤛'
,
101
'好好学习,天天向上。🤜🤛'
,
101
,
'PUBLIC'
);
INSERT
INTO
...
...
store/memo.go
View file @
697d01e3
...
...
@@ -21,7 +21,8 @@ type memoRaw struct {
UpdatedTs
int64
// Domain specific fields
Content
string
Content
string
Visibility
api
.
Visibility
}
// toMemo creates an instance of Memo based on the memoRaw.
...
...
@@ -37,7 +38,8 @@ func (raw *memoRaw) toMemo() *api.Memo {
UpdatedTs
:
raw
.
UpdatedTs
,
// Domain specific fields
Content
:
raw
.
Content
,
Content
:
raw
.
Content
,
Visibility
:
raw
.
Visibility
,
}
}
...
...
@@ -116,21 +118,21 @@ func (s *Store) DeleteMemo(delete *api.MemoDelete) error {
}
func
createMemoRaw
(
db
*
sql
.
DB
,
create
*
api
.
MemoCreate
)
(
*
memoRaw
,
error
)
{
set
:=
[]
string
{
"creator_id"
,
"content"
}
placeholder
:=
[]
string
{
"?"
,
"?"
}
args
:=
[]
interface
{}{
create
.
CreatorID
,
create
.
Content
}
set
:=
[]
string
{
"creator_id"
,
"content"
,
"visibility"
}
placeholder
:=
[]
string
{
"?"
,
"?"
,
"?"
}
args
:=
[]
interface
{}{
create
.
CreatorID
,
create
.
Content
,
create
.
Visibility
}
if
v
:=
create
.
CreatedTs
;
v
!=
nil
{
set
,
placeholder
,
args
=
append
(
set
,
"created_ts"
),
append
(
placeholder
,
"?"
),
append
(
args
,
*
v
)
}
row
,
err
:=
db
.
Query
(
`
INSERT INTO memo (
`
+
strings
.
Join
(
set
,
", "
)
+
`
)
VALUES (`
+
strings
.
Join
(
placeholder
,
","
)
+
`)
RETURNING id, creator_id, created_ts, updated_ts, content, row_status
`
,
query
:=
`
INSERT INTO memo (
`
+
strings
.
Join
(
set
,
", "
)
+
`
)
VALUES (`
+
strings
.
Join
(
placeholder
,
","
)
+
`)
RETURNING id, creator_id, created_ts, updated_ts, row_status, content, visibility`
row
,
err
:=
db
.
Query
(
query
,
args
...
,
)
if
err
!=
nil
{
...
...
@@ -145,8 +147,9 @@ func createMemoRaw(db *sql.DB, create *api.MemoCreate) (*memoRaw, error) {
&
memoRaw
.
CreatorID
,
&
memoRaw
.
CreatedTs
,
&
memoRaw
.
UpdatedTs
,
&
memoRaw
.
Content
,
&
memoRaw
.
RowStatus
,
&
memoRaw
.
Content
,
&
memoRaw
.
Visibility
,
);
err
!=
nil
{
return
nil
,
FormatError
(
err
)
}
...
...
@@ -163,6 +166,9 @@ func patchMemoRaw(db *sql.DB, patch *api.MemoPatch) (*memoRaw, error) {
if
v
:=
patch
.
RowStatus
;
v
!=
nil
{
set
,
args
=
append
(
set
,
"row_status = ?"
),
append
(
args
,
*
v
)
}
if
v
:=
patch
.
Visibility
;
v
!=
nil
{
set
,
args
=
append
(
set
,
"visibility = ?"
),
append
(
args
,
*
v
)
}
args
=
append
(
args
,
patch
.
ID
)
...
...
@@ -170,7 +176,7 @@ func patchMemoRaw(db *sql.DB, patch *api.MemoPatch) (*memoRaw, error) {
UPDATE memo
SET `
+
strings
.
Join
(
set
,
", "
)
+
`
WHERE id = ?
RETURNING id, creator_id, created_ts, updated_ts,
content, row_status
RETURNING id, creator_id, created_ts, updated_ts,
row_status, content, visibility
`
,
args
...
)
if
err
!=
nil
{
return
nil
,
FormatError
(
err
)
...
...
@@ -187,8 +193,9 @@ func patchMemoRaw(db *sql.DB, patch *api.MemoPatch) (*memoRaw, error) {
&
memoRaw
.
CreatorID
,
&
memoRaw
.
CreatedTs
,
&
memoRaw
.
UpdatedTs
,
&
memoRaw
.
Content
,
&
memoRaw
.
RowStatus
,
&
memoRaw
.
Content
,
&
memoRaw
.
Visibility
,
);
err
!=
nil
{
return
nil
,
FormatError
(
err
)
}
...
...
@@ -214,6 +221,9 @@ func findMemoRawList(db *sql.DB, find *api.MemoFind) ([]*memoRaw, error) {
if
v
:=
find
.
ContentSearch
;
v
!=
nil
{
where
,
args
=
append
(
where
,
"content LIKE ?"
),
append
(
args
,
"%"
+*
v
+
"%"
)
}
if
v
:=
find
.
Visibility
;
v
!=
nil
{
where
,
args
=
append
(
where
,
"visibility = ?"
),
append
(
args
,
*
v
)
}
pagination
:=
""
if
find
.
Limit
>
0
{
...
...
@@ -229,8 +239,9 @@ func findMemoRawList(db *sql.DB, find *api.MemoFind) ([]*memoRaw, error) {
creator_id,
created_ts,
updated_ts,
row_status,
content,
row_status
visibility
FROM memo
WHERE `
+
strings
.
Join
(
where
,
" AND "
)
+
`
ORDER BY created_ts DESC`
+
pagination
,
...
...
@@ -249,8 +260,9 @@ func findMemoRawList(db *sql.DB, find *api.MemoFind) ([]*memoRaw, error) {
&
memoRaw
.
CreatorID
,
&
memoRaw
.
CreatedTs
,
&
memoRaw
.
UpdatedTs
,
&
memoRaw
.
Content
,
&
memoRaw
.
RowStatus
,
&
memoRaw
.
Content
,
&
memoRaw
.
Visibility
,
);
err
!=
nil
{
return
nil
,
FormatError
(
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