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
9577f6db
Unverified
Commit
9577f6db
authored
Feb 27, 2023
by
boojack
Committed by
GitHub
Feb 27, 2023
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
feat: add resource visibility to user setting (#1190)
parent
ae61ade2
Changes
7
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
100 additions
and
17 deletions
+100
-17
user_setting.go
api/user_setting.go
+18
-4
memo.go
server/memo.go
+1
-2
resource.go
server/resource.go
+49
-8
user_setting.go
store/user_setting.go
+2
-2
PreferencesSection.tsx
web/src/components/Settings/PreferencesSection.tsx
+22
-0
user.ts
web/src/store/module/user.ts
+1
-0
setting.d.ts
web/src/types/modules/setting.d.ts
+7
-1
No files found.
api/user_setting.go
View file @
9577f6db
...
...
@@ -16,6 +16,8 @@ const (
UserSettingAppearanceKey
UserSettingKey
=
"appearance"
// UserSettingMemoVisibilityKey is the key type for user preference memo default visibility.
UserSettingMemoVisibilityKey
UserSettingKey
=
"memoVisibility"
// UserSettingResourceVisibilityKey is the key type for user preference resource default visibility.
UserSettingResourceVisibilityKey
UserSettingKey
=
"resourceVisibility"
)
// String returns the string format of UserSettingKey type.
...
...
@@ -27,14 +29,17 @@ func (key UserSettingKey) String() string {
return
"appearance"
case
UserSettingMemoVisibilityKey
:
return
"memoVisibility"
case
UserSettingResourceVisibilityKey
:
return
"resourceVisibility"
}
return
""
}
var
(
UserSettingLocaleValue
=
[]
string
{
"en"
,
"zh"
,
"vi"
,
"fr"
,
"nl"
,
"sv"
,
"de"
,
"es"
,
"uk"
,
"ru"
,
"it"
,
"hant"
,
"ko"
}
UserSettingAppearanceValue
=
[]
string
{
"system"
,
"light"
,
"dark"
}
UserSettingMemoVisibilityValue
=
[]
Visibility
{
Private
,
Protected
,
Public
}
UserSettingLocaleValue
=
[]
string
{
"en"
,
"zh"
,
"vi"
,
"fr"
,
"nl"
,
"sv"
,
"de"
,
"es"
,
"uk"
,
"ru"
,
"it"
,
"hant"
,
"ko"
}
UserSettingAppearanceValue
=
[]
string
{
"system"
,
"light"
,
"dark"
}
UserSettingMemoVisibilityValue
=
[]
Visibility
{
Private
,
Protected
,
Public
}
UserSettingResourceVisibilityValue
=
[]
Visibility
{
Private
,
Protected
,
Public
}
)
type
UserSetting
struct
{
...
...
@@ -78,6 +83,15 @@ func (upsert UserSettingUpsert) Validate() error {
if
!
slices
.
Contains
(
UserSettingMemoVisibilityValue
,
memoVisibilityValue
)
{
return
fmt
.
Errorf
(
"invalid user setting memo visibility value"
)
}
}
else
if
upsert
.
Key
==
UserSettingResourceVisibilityKey
{
resourceVisibilityValue
:=
Private
err
:=
json
.
Unmarshal
([]
byte
(
upsert
.
Value
),
&
resourceVisibilityValue
)
if
err
!=
nil
{
return
fmt
.
Errorf
(
"failed to unmarshal user setting resource visibility value"
)
}
if
!
slices
.
Contains
(
UserSettingResourceVisibilityValue
,
resourceVisibilityValue
)
{
return
fmt
.
Errorf
(
"invalid user setting resource visibility value"
)
}
}
else
{
return
fmt
.
Errorf
(
"invalid user setting key"
)
}
...
...
@@ -88,7 +102,7 @@ func (upsert UserSettingUpsert) Validate() error {
type
UserSettingFind
struct
{
UserID
int
Key
*
UserSettingKey
`json:"key"`
Key
UserSettingKey
`json:"key"`
}
type
UserSettingDelete
struct
{
...
...
server/memo.go
View file @
9577f6db
...
...
@@ -30,10 +30,9 @@ func (s *Server) registerMemoRoutes(g *echo.Group) {
}
if
memoCreate
.
Visibility
==
""
{
userSettingMemoVisibilityKey
:=
api
.
UserSettingMemoVisibilityKey
userMemoVisibilitySetting
,
err
:=
s
.
Store
.
FindUserSetting
(
ctx
,
&
api
.
UserSettingFind
{
UserID
:
userID
,
Key
:
&
u
serSettingMemoVisibilityKey
,
Key
:
api
.
U
serSettingMemoVisibilityKey
,
})
if
err
!=
nil
{
return
echo
.
NewHTTPError
(
http
.
StatusInternalServerError
,
"Failed to find user setting"
)
.
SetInternal
(
err
)
...
...
server/resource.go
View file @
9577f6db
...
...
@@ -42,7 +42,28 @@ func (s *Server) registerResourceRoutes(g *echo.Group) {
if
resourceCreate
.
ExternalLink
!=
""
&&
!
strings
.
HasPrefix
(
resourceCreate
.
ExternalLink
,
"http"
)
{
return
echo
.
NewHTTPError
(
http
.
StatusBadRequest
,
"Invalid external link"
)
}
resourceCreate
.
Visibility
=
api
.
Private
if
resourceCreate
.
Visibility
==
""
{
userResourceVisibilitySetting
,
err
:=
s
.
Store
.
FindUserSetting
(
ctx
,
&
api
.
UserSettingFind
{
UserID
:
userID
,
Key
:
api
.
UserSettingResourceVisibilityKey
,
})
if
err
!=
nil
{
return
echo
.
NewHTTPError
(
http
.
StatusInternalServerError
,
"Failed to find user setting"
)
.
SetInternal
(
err
)
}
if
userResourceVisibilitySetting
!=
nil
{
resourceVisibility
:=
api
.
Private
err
:=
json
.
Unmarshal
([]
byte
(
userResourceVisibilitySetting
.
Value
),
&
resourceVisibility
)
if
err
!=
nil
{
return
echo
.
NewHTTPError
(
http
.
StatusInternalServerError
,
"Failed to unmarshal user setting value"
)
.
SetInternal
(
err
)
}
resourceCreate
.
Visibility
=
resourceVisibility
}
else
{
// Private is the default resource visibility.
resourceCreate
.
Visibility
=
api
.
Private
}
}
resource
,
err
:=
s
.
Store
.
CreateResource
(
ctx
,
resourceCreate
)
if
err
!=
nil
{
return
echo
.
NewHTTPError
(
http
.
StatusInternalServerError
,
"Failed to create resource"
)
.
SetInternal
(
err
)
...
...
@@ -100,12 +121,11 @@ func (s *Server) registerResourceRoutes(g *echo.Group) {
return
echo
.
NewHTTPError
(
http
.
StatusInternalServerError
,
"Failed to read file"
)
.
SetInternal
(
err
)
}
resourceCreate
=
&
api
.
ResourceCreate
{
CreatorID
:
userID
,
Filename
:
filename
,
Type
:
filetype
,
Size
:
size
,
Blob
:
fileBytes
,
Visibility
:
api
.
Private
,
CreatorID
:
userID
,
Filename
:
filename
,
Type
:
filetype
,
Size
:
size
,
Blob
:
fileBytes
,
}
}
else
{
storage
,
err
:=
s
.
Store
.
FindStorage
(
ctx
,
&
api
.
StorageFind
{
ID
:
&
storageServiceID
})
...
...
@@ -136,13 +156,34 @@ func (s *Server) registerResourceRoutes(g *echo.Group) {
Filename
:
filename
,
Type
:
filetype
,
ExternalLink
:
link
,
Visibility
:
api
.
Private
,
}
}
else
{
return
echo
.
NewHTTPError
(
http
.
StatusInternalServerError
,
"Unsupported storage type"
)
}
}
if
resourceCreate
.
Visibility
==
""
{
userResourceVisibilitySetting
,
err
:=
s
.
Store
.
FindUserSetting
(
ctx
,
&
api
.
UserSettingFind
{
UserID
:
userID
,
Key
:
api
.
UserSettingResourceVisibilityKey
,
})
if
err
!=
nil
{
return
echo
.
NewHTTPError
(
http
.
StatusInternalServerError
,
"Failed to find user setting"
)
.
SetInternal
(
err
)
}
if
userResourceVisibilitySetting
!=
nil
{
resourceVisibility
:=
api
.
Private
err
:=
json
.
Unmarshal
([]
byte
(
userResourceVisibilitySetting
.
Value
),
&
resourceVisibility
)
if
err
!=
nil
{
return
echo
.
NewHTTPError
(
http
.
StatusInternalServerError
,
"Failed to unmarshal user setting value"
)
.
SetInternal
(
err
)
}
resourceCreate
.
Visibility
=
resourceVisibility
}
else
{
// Private is the default resource visibility.
resourceCreate
.
Visibility
=
api
.
Private
}
}
resource
,
err
:=
s
.
Store
.
CreateResource
(
ctx
,
resourceCreate
)
if
err
!=
nil
{
return
echo
.
NewHTTPError
(
http
.
StatusInternalServerError
,
"Failed to create resource"
)
.
SetInternal
(
err
)
...
...
store/user_setting.go
View file @
9577f6db
...
...
@@ -120,8 +120,8 @@ func upsertUserSetting(ctx context.Context, tx *sql.Tx, upsert *api.UserSettingU
func
findUserSettingList
(
ctx
context
.
Context
,
tx
*
sql
.
Tx
,
find
*
api
.
UserSettingFind
)
([]
*
userSettingRaw
,
error
)
{
where
,
args
:=
[]
string
{
"1 = 1"
},
[]
interface
{}{}
if
v
:=
find
.
Key
;
v
!=
nil
{
where
,
args
=
append
(
where
,
"key = ?"
),
append
(
args
,
v
.
String
()
)
if
v
:=
find
.
Key
.
String
();
v
!=
""
{
where
,
args
=
append
(
where
,
"key = ?"
),
append
(
args
,
v
)
}
where
,
args
=
append
(
where
,
"user_id = ?"
),
append
(
args
,
find
.
UserID
)
...
...
web/src/components/Settings/PreferencesSection.tsx
View file @
9577f6db
...
...
@@ -34,6 +34,10 @@ const PreferencesSection = () => {
await
userStore
.
upsertUserSetting
(
"memoVisibility"
,
value
);
};
const
handleDefaultResourceVisibilityChanged
=
async
(
value
:
string
)
=>
{
await
userStore
.
upsertUserSetting
(
"resourceVisibility"
,
value
);
};
const
handleIsFoldingEnabledChanged
=
(
event
:
React
.
ChangeEvent
<
HTMLInputElement
>
)
=>
{
userStore
.
upsertLocalSetting
({
...
localSetting
,
enableFoldMemo
:
event
.
target
.
checked
});
};
...
...
@@ -72,6 +76,24 @@ const PreferencesSection = () => {
))
}
</
Select
>
</
div
>
<
div
className=
"form-label selector"
>
<
span
className=
"normal-text"
>
Default resource visibility
</
span
>
<
Select
className=
"!min-w-[10rem] w-auto text-sm"
value=
{
setting
.
resourceVisibility
}
onChange=
{
(
_
,
visibility
)
=>
{
if
(
visibility
)
{
handleDefaultResourceVisibilityChanged
(
visibility
);
}
}
}
>
{
visibilitySelectorItems
.
map
((
item
)
=>
(
<
Option
key=
{
item
.
value
}
value=
{
item
.
value
}
className=
"whitespace-nowrap"
>
{
item
.
text
}
</
Option
>
))
}
</
Select
>
</
div
>
<
label
className=
"form-label selector"
>
<
span
className=
"normal-text"
>
{
t
(
"setting.preference-section.enable-folding-memo"
)
}
</
span
>
<
Switch
className=
"ml-2"
checked=
{
localSetting
.
enableFoldMemo
}
onChange=
{
handleIsFoldingEnabledChanged
}
/>
...
...
web/src/store/module/user.ts
View file @
9577f6db
...
...
@@ -10,6 +10,7 @@ const defaultSetting: Setting = {
locale
:
"en"
,
appearance
:
getSystemColorScheme
(),
memoVisibility
:
"PRIVATE"
,
resourceVisibility
:
"PRIVATE"
,
};
const
defaultLocalSetting
:
LocalSetting
=
{
...
...
web/src/types/modules/setting.d.ts
View file @
9577f6db
...
...
@@ -4,6 +4,7 @@ interface Setting {
locale
:
Locale
;
appearance
:
Appearance
;
memoVisibility
:
Visibility
;
resourceVisibility
:
Visibility
;
}
interface
LocalSetting
{
...
...
@@ -26,7 +27,12 @@ interface UserMemoVisibilitySetting {
value
:
Visibility
;
}
type
UserSetting
=
UserLocaleSetting
|
UserAppearanceSetting
|
UserMemoVisibilitySetting
;
interface
UserResourceVisibilitySetting
{
key
:
"resourceVisibility"
;
value
:
Visibility
;
}
type
UserSetting
=
UserLocaleSetting
|
UserAppearanceSetting
|
UserMemoVisibilitySetting
|
UserResourceVisibilitySetting
;
interface
UserSettingUpsert
{
key
:
keyof
Setting
;
...
...
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