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
e3a4f49c
Commit
e3a4f49c
authored
Mar 11, 2025
by
Johnny
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
feat: implement creator_id factor
parent
ba52a786
Changes
6
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
75 additions
and
5 deletions
+75
-5
filter.go
plugin/filter/filter.go
+1
-0
memo_service.go
server/router/api/v1/memo_service.go
+15
-2
memo_filter.go
store/db/mysql/memo_filter.go
+18
-1
memo_filter.go
store/db/postgres/memo_filter.go
+18
-1
memo_filter.go
store/db/sqlite/memo_filter.go
+18
-1
memo_filter_test.go
store/db/sqlite/memo_filter_test.go
+5
-0
No files found.
plugin/filter/filter.go
View file @
e3a4f49c
...
...
@@ -9,6 +9,7 @@ import (
// MemoFilterCELAttributes are the CEL attributes for memo.
var
MemoFilterCELAttributes
=
[]
cel
.
EnvOption
{
cel
.
Variable
(
"content"
,
cel
.
StringType
),
cel
.
Variable
(
"creator_id"
,
cel
.
IntType
),
// As the built-in timestamp type is deprecated, we use string type for now.
// e.g., "2021-01-01T00:00:00Z"
cel
.
Variable
(
"create_time"
,
cel
.
StringType
),
...
...
server/router/api/v1/memo_service.go
View file @
e3a4f49c
...
...
@@ -120,6 +120,9 @@ func (s *APIV1Service) ListMemos(ctx context.Context, request *v1pb.ListMemosReq
memoFind
.
OrderByTimeAsc
=
true
}
if
request
.
Filter
!=
""
{
if
err
:=
s
.
validateFilter
(
ctx
,
request
.
Filter
);
err
!=
nil
{
return
nil
,
status
.
Errorf
(
codes
.
InvalidArgument
,
"invalid filter: %v"
,
err
)
}
memoFind
.
Filter
=
&
request
.
Filter
}
...
...
@@ -129,8 +132,18 @@ func (s *APIV1Service) ListMemos(ctx context.Context, request *v1pb.ListMemosReq
}
if
currentUser
==
nil
{
memoFind
.
VisibilityList
=
[]
store
.
Visibility
{
store
.
Public
}
}
else
if
memoFind
.
CreatorID
==
nil
||
*
memoFind
.
CreatorID
!=
currentUser
.
ID
{
memoFind
.
VisibilityList
=
[]
store
.
Visibility
{
store
.
Public
,
store
.
Protected
}
}
else
{
if
memoFind
.
CreatorID
==
nil
{
internalFilter
:=
fmt
.
Sprintf
(
`creator_id == %d || visibility in ["PUBLIC", "Protected"]`
,
currentUser
.
ID
)
if
memoFind
.
Filter
!=
nil
{
filter
:=
fmt
.
Sprintf
(
"(%s) && (%s)"
,
*
memoFind
.
Filter
,
internalFilter
)
memoFind
.
Filter
=
&
filter
}
else
{
memoFind
.
Filter
=
&
internalFilter
}
}
else
if
*
memoFind
.
CreatorID
!=
currentUser
.
ID
{
memoFind
.
VisibilityList
=
[]
store
.
Visibility
{
store
.
Public
,
store
.
Protected
}
}
}
workspaceMemoRelatedSetting
,
err
:=
s
.
Store
.
GetWorkspaceMemoRelatedSetting
(
ctx
)
...
...
store/db/mysql/memo_filter.go
View file @
e3a4f49c
...
...
@@ -59,7 +59,7 @@ func (d *DB) ConvertExprToSQL(ctx *filter.ConvertContext, expr *exprv1.Expr) err
if
err
!=
nil
{
return
err
}
if
!
slices
.
Contains
([]
string
{
"creat
e_time"
,
"update_time
"
},
identifier
)
{
if
!
slices
.
Contains
([]
string
{
"creat
or_id"
,
"create_time"
,
"update_time"
,
"visibility"
,
"content
"
},
identifier
)
{
return
errors
.
Errorf
(
"invalid identifier for %s"
,
v
.
CallExpr
.
Function
)
}
value
,
err
:=
filter
.
GetConstValue
(
v
.
CallExpr
.
Args
[
1
])
...
...
@@ -121,6 +121,23 @@ func (d *DB) ConvertExprToSQL(ctx *filter.ConvertContext, expr *exprv1.Expr) err
return
err
}
ctx
.
Args
=
append
(
ctx
.
Args
,
valueStr
)
}
else
if
identifier
==
"creator_id"
{
if
operator
!=
"="
&&
operator
!=
"!="
{
return
errors
.
Errorf
(
"invalid operator for %s"
,
v
.
CallExpr
.
Function
)
}
valueInt
,
ok
:=
value
.
(
int64
)
if
!
ok
{
return
errors
.
New
(
"invalid int value"
)
}
var
factor
string
if
identifier
==
"creator_id"
{
factor
=
"`memo`.`creator_id`"
}
if
_
,
err
:=
ctx
.
Buffer
.
WriteString
(
fmt
.
Sprintf
(
"%s %s ?"
,
factor
,
operator
));
err
!=
nil
{
return
err
}
ctx
.
Args
=
append
(
ctx
.
Args
,
valueInt
)
}
case
"@in"
:
if
len
(
v
.
CallExpr
.
Args
)
!=
2
{
...
...
store/db/postgres/memo_filter.go
View file @
e3a4f49c
...
...
@@ -59,7 +59,7 @@ func (d *DB) ConvertExprToSQL(ctx *filter.ConvertContext, expr *exprv1.Expr) err
if
err
!=
nil
{
return
err
}
if
!
slices
.
Contains
([]
string
{
"create_time"
,
"update_time"
,
"visibility"
,
"content"
},
identifier
)
{
if
!
slices
.
Contains
([]
string
{
"creat
or_id"
,
"creat
e_time"
,
"update_time"
,
"visibility"
,
"content"
},
identifier
)
{
return
errors
.
Errorf
(
"invalid identifier for %s"
,
v
.
CallExpr
.
Function
)
}
value
,
err
:=
filter
.
GetConstValue
(
v
.
CallExpr
.
Args
[
1
])
...
...
@@ -121,6 +121,23 @@ func (d *DB) ConvertExprToSQL(ctx *filter.ConvertContext, expr *exprv1.Expr) err
return
err
}
ctx
.
Args
=
append
(
ctx
.
Args
,
valueStr
)
}
else
if
identifier
==
"creator_id"
{
if
operator
!=
"="
&&
operator
!=
"!="
{
return
errors
.
Errorf
(
"invalid operator for %s"
,
v
.
CallExpr
.
Function
)
}
valueInt
,
ok
:=
value
.
(
int64
)
if
!
ok
{
return
errors
.
New
(
"invalid int value"
)
}
var
factor
string
if
identifier
==
"creator_id"
{
factor
=
"memo.creator_id"
}
if
_
,
err
:=
ctx
.
Buffer
.
WriteString
(
fmt
.
Sprintf
(
"%s %s ?"
,
factor
,
operator
));
err
!=
nil
{
return
err
}
ctx
.
Args
=
append
(
ctx
.
Args
,
valueInt
)
}
case
"@in"
:
if
len
(
v
.
CallExpr
.
Args
)
!=
2
{
...
...
store/db/sqlite/memo_filter.go
View file @
e3a4f49c
...
...
@@ -59,7 +59,7 @@ func (d *DB) ConvertExprToSQL(ctx *filter.ConvertContext, expr *exprv1.Expr) err
if
err
!=
nil
{
return
err
}
if
!
slices
.
Contains
([]
string
{
"create_time"
,
"update_time"
,
"visibility"
,
"content"
},
identifier
)
{
if
!
slices
.
Contains
([]
string
{
"creat
or_id"
,
"creat
e_time"
,
"update_time"
,
"visibility"
,
"content"
},
identifier
)
{
return
errors
.
Errorf
(
"invalid identifier for %s"
,
v
.
CallExpr
.
Function
)
}
value
,
err
:=
filter
.
GetConstValue
(
v
.
CallExpr
.
Args
[
1
])
...
...
@@ -121,6 +121,23 @@ func (d *DB) ConvertExprToSQL(ctx *filter.ConvertContext, expr *exprv1.Expr) err
return
err
}
ctx
.
Args
=
append
(
ctx
.
Args
,
valueStr
)
}
else
if
identifier
==
"creator_id"
{
if
operator
!=
"="
&&
operator
!=
"!="
{
return
errors
.
Errorf
(
"invalid operator for %s"
,
v
.
CallExpr
.
Function
)
}
valueInt
,
ok
:=
value
.
(
int64
)
if
!
ok
{
return
errors
.
New
(
"invalid int value"
)
}
var
factor
string
if
identifier
==
"creator_id"
{
factor
=
"`memo`.`creator_id`"
}
if
_
,
err
:=
ctx
.
Buffer
.
WriteString
(
fmt
.
Sprintf
(
"%s %s ?"
,
factor
,
operator
));
err
!=
nil
{
return
err
}
ctx
.
Args
=
append
(
ctx
.
Args
,
valueInt
)
}
case
"@in"
:
if
len
(
v
.
CallExpr
.
Args
)
!=
2
{
...
...
store/db/sqlite/memo_filter_test.go
View file @
e3a4f49c
...
...
@@ -69,6 +69,11 @@ func TestConvertExprToSQL(t *testing.T) {
want
:
"NOT (`memo`.`pinned` IS TRUE)"
,
args
:
[]
any
{},
},
{
filter
:
`creator_id == 101 || visibility in ["PUBLIC", "PRIVATE"]`
,
want
:
"(`memo`.`creator_id` = ? OR `memo`.`visibility` IN (?,?))"
,
args
:
[]
any
{
int64
(
101
),
"PUBLIC"
,
"PRIVATE"
},
},
}
for
_
,
tt
:=
range
tests
{
...
...
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