memos/store/migrator.go
Lincoln Nogueira 369b8af109
chore: improve resource internal_path migrator (#2698)
* chore: improve internal path migrator
- handle mixed path styles
- handle Windows paths
- add tests

* chore: fix goimports error
2024-01-03 08:31:59 +08:00

57 lines
1.3 KiB
Go

package store
import (
"context"
"fmt"
"os"
"time"
"strings"
"github.com/pkg/errors"
"github.com/usememos/memos/internal/log"
)
// MigrateResourceInternalPath migrates resource internal path from absolute path to relative path.
func (s *Store) MigrateResourceInternalPath(ctx context.Context) error {
resources, err := s.ListResources(ctx, &FindResource{})
if err != nil {
return errors.Wrap(err, "failed to list resources")
}
dataPath := strings.ReplaceAll(s.Profile.Data, `\`, "/")
migrateStartTime := time.Now()
migratedCount := 0
for _, resource := range resources {
if resource.InternalPath == "" {
continue
}
internalPath := strings.ReplaceAll(resource.InternalPath, `\`, "/")
if !strings.HasPrefix(internalPath, dataPath) {
continue
}
internalPath = strings.TrimPrefix(internalPath, dataPath)
for os.IsPathSeparator(internalPath[0]) {
internalPath = internalPath[1:]
}
_, err := s.UpdateResource(ctx, &UpdateResource{
ID: resource.ID,
InternalPath: &internalPath,
})
if err != nil {
return errors.Wrap(err, "failed to update local resource path")
}
migratedCount++
}
if migratedCount > 0 {
log.Info(fmt.Sprintf("migrated %d local resource paths in %s", migratedCount, time.Since(migrateStartTime)))
}
return nil
}