feat(dbfs): set default share shortcut for new users

This commit is contained in:
Aaron Liu
2025-05-23 15:39:57 +08:00
parent 9f5ebe11b6
commit c6ee3e5dcd
7 changed files with 104 additions and 7 deletions

View File

@@ -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
}

View File

@@ -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"

View File

@@ -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", "")
}