feat(dbfs): set default share shortcut for new users
This commit is contained in:
@@ -719,7 +719,7 @@ func (f *DBFS) getFileByPath(ctx context.Context, navigator Navigator, path *fs.
|
||||
// initFs initializes the file system for the user.
|
||||
func (f *DBFS) initFs(ctx context.Context, uid int) error {
|
||||
f.l.Info("Initialize database file system for user %q", f.user.Email)
|
||||
_, err := f.fileClient.CreateFolder(ctx, nil,
|
||||
parent, err := f.fileClient.CreateFolder(ctx, nil,
|
||||
&inventory.CreateFolderParameters{
|
||||
Owner: uid,
|
||||
Name: inventory.RootFolderName,
|
||||
@@ -728,6 +728,58 @@ func (f *DBFS) initFs(ctx context.Context, uid int) error {
|
||||
return fmt.Errorf("failed to create root folder: %w", err)
|
||||
}
|
||||
|
||||
// Create default symbolics
|
||||
symbolics := f.settingClient.DefaultSymbolics(ctx)
|
||||
if len(symbolics) == 0 {
|
||||
return nil
|
||||
}
|
||||
|
||||
user, err := f.userClient.GetLoginUserByID(ctx, uid)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to get user: %w", err)
|
||||
}
|
||||
|
||||
parent.SetOwner(user)
|
||||
|
||||
ctx = context.WithValue(ctx, inventory.LoadShareFile{}, true)
|
||||
ctx = context.WithValue(ctx, inventory.LoadShareUser{}, true)
|
||||
shares, err := f.shareClient.GetByIDs(ctx, symbolics)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to get shares: %w", err)
|
||||
}
|
||||
|
||||
for _, share := range shares {
|
||||
if share.Edges.File == nil || share.Edges.User == nil {
|
||||
continue
|
||||
}
|
||||
|
||||
shareOwner := hashid.EncodeUserID(f.hasher, share.Edges.User.ID)
|
||||
shareUri := fs.NewShareUri(hashid.EncodeShareID(f.hasher, share.ID), share.Password)
|
||||
shareUriParsed, err := fs.NewUriFromString(shareUri)
|
||||
if err != nil {
|
||||
continue
|
||||
}
|
||||
|
||||
if share.Edges.File.Type == int(types.FileTypeFile) {
|
||||
shareUriParsed.Join(share.Edges.File.Name)
|
||||
}
|
||||
|
||||
parentFile := newFile(nil, parent)
|
||||
parentFile.OwnerModel = user
|
||||
if _, err := f.createFile(ctx, parentFile, share.Edges.File.Name, types.FileType(share.Edges.File.Type), &dbfsOption{
|
||||
FsOption: &fs.FsOption{
|
||||
Metadata: map[string]string{
|
||||
MetadataSharedRedirect: shareUriParsed.String(),
|
||||
MetadataSharedOwner: shareOwner,
|
||||
},
|
||||
},
|
||||
errOnConflict: true,
|
||||
isSymbolicLink: true,
|
||||
}); err != nil {
|
||||
f.l.Warning("Failed to create default symbolic link %q for user %q: %s", shareUriParsed, uid, err)
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
|
||||
@@ -53,6 +53,7 @@ const (
|
||||
MetadataSharedRedirect = MetadataSysPrefix + "shared_redirect"
|
||||
MetadataRestoreUri = MetadataSysPrefix + "restore_uri"
|
||||
MetadataExpectedCollectTime = MetadataSysPrefix + "expected_collect_time"
|
||||
MetadataSharedOwner = MetadataSysPrefix + "shared_owner"
|
||||
|
||||
ThumbMetadataPrefix = "thumb:"
|
||||
ThumbDisabledKey = ThumbMetadataPrefix + "disabled"
|
||||
|
||||
@@ -184,6 +184,8 @@ type (
|
||||
AvatarProcess(ctx context.Context) *AvatarProcess
|
||||
// UseFirstSiteUrl returns the first site URL.
|
||||
AllSiteURLs(ctx context.Context) []*url.URL
|
||||
// DefaultSymbolics returns the default symbolics for new users.
|
||||
DefaultSymbolics(ctx context.Context) []int
|
||||
}
|
||||
UseFirstSiteUrlCtxKey = struct{}
|
||||
)
|
||||
@@ -211,6 +213,16 @@ type (
|
||||
}
|
||||
)
|
||||
|
||||
func (s *settingProvider) DefaultSymbolics(ctx context.Context) []int {
|
||||
raw := s.getString(ctx, "default_symbolics", "[]")
|
||||
var symbolics []int
|
||||
if err := json.Unmarshal([]byte(raw), &symbolics); err != nil {
|
||||
return []int{}
|
||||
}
|
||||
|
||||
return symbolics
|
||||
}
|
||||
|
||||
func (s *settingProvider) License(ctx context.Context) string {
|
||||
return s.getString(ctx, "license", "")
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user