Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(server): Add data deletion process [VIZ-1419] #1520

Merged
merged 2 commits into from
Mar 25, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions server/internal/infrastructure/adapter/plugin.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import (
"context"
"errors"

"github.com/reearth/reearth/server/internal/usecase/gateway"
"github.com/reearth/reearth/server/internal/usecase/repo"
"github.com/reearth/reearth/server/pkg/id"
"github.com/reearth/reearth/server/pkg/plugin"
Expand Down Expand Up @@ -75,3 +76,10 @@ func (r *pluginRepo) Remove(ctx context.Context, p id.PluginID) error {
}
return r.writer.Remove(ctx, p)
}

func (r *pluginRepo) RemoveBySceneWithFile(ctx context.Context, sid id.SceneID, f gateway.File) error {
if r.writer == nil {
return errors.New("cannot write")
}
return r.writer.RemoveBySceneWithFile(ctx, sid, f)
}
7 changes: 7 additions & 0 deletions server/internal/infrastructure/adapter/property_schema.go
Original file line number Diff line number Diff line change
Expand Up @@ -89,3 +89,10 @@ func (r *propertySchema) RemoveAll(ctx context.Context, p []id.PropertySchemaID)
}
return r.writer.RemoveAll(ctx, p)
}

func (r *propertySchema) RemoveByScene(ctx context.Context, sceneID id.SceneID) error {
if r.writer == nil {
return rerror.ErrInternalByWithContext(ctx, errors.New("writer is not set"))
}
return r.writer.RemoveByScene(ctx, sceneID)
}
5 changes: 5 additions & 0 deletions server/internal/infrastructure/fs/plugin.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import (
"path/filepath"
"regexp"

"github.com/reearth/reearth/server/internal/usecase/gateway"
"github.com/reearth/reearth/server/internal/usecase/repo"
"github.com/reearth/reearth/server/pkg/id"
"github.com/reearth/reearth/server/pkg/plugin"
Expand Down Expand Up @@ -65,6 +66,10 @@ func (r *pluginRepo) Remove(ctx context.Context, pid id.PluginID) error {
return rerror.ErrInternalByWithContext(ctx, errors.New("read only"))
}

func (r *pluginRepo) RemoveBySceneWithFile(ctx context.Context, sid id.SceneID, f gateway.File) error {
return rerror.ErrInternalByWithContext(ctx, errors.New("read only"))
}

var translationFileNameRegexp = regexp.MustCompile(`reearth_([a-zA-Z]+(?:-[a-zA-Z]+)?).yml`)

func readPluginManifest(ctx context.Context, fs afero.Fs, pid id.PluginID) (*manifest.Manifest, error) {
Expand Down
4 changes: 4 additions & 0 deletions server/internal/infrastructure/fs/property_schema.go
Original file line number Diff line number Diff line change
Expand Up @@ -80,3 +80,7 @@ func (r *propertySchema) Remove(ctx context.Context, pid id.PropertySchemaID) er
func (r *propertySchema) RemoveAll(ctx context.Context, pid []id.PropertySchemaID) error {
return rerror.ErrInternalByWithContext(ctx, errors.New("read only"))
}

func (r *propertySchema) RemoveByScene(ctx context.Context, sceneID id.SceneID) error {
return rerror.ErrInternalByWithContext(ctx, errors.New("read only"))
}
13 changes: 13 additions & 0 deletions server/internal/infrastructure/memory/asset.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import (
"sort"
"strings"

"github.com/reearth/reearth/server/internal/usecase/gateway"
"github.com/reearth/reearth/server/internal/usecase/repo"
"github.com/reearth/reearth/server/pkg/asset"
"github.com/reearth/reearth/server/pkg/id"
Expand Down Expand Up @@ -143,3 +144,15 @@ func (r *Asset) Remove(_ context.Context, id id.AssetID) error {
r.data.Delete(id)
return nil
}

func (r *Asset) RemoveByProjectWithFile(ctx context.Context, pid id.ProjectID, f gateway.File) error {
r.data.FindAll(func(id id.AssetID, a *asset.Asset) bool {
if r.f.CanWrite(a.Workspace()) {
if a.Project() != nil && *a.Project() == pid {
r.data.Delete(id)
}
}
return true
})
return nil
}
19 changes: 19 additions & 0 deletions server/internal/infrastructure/memory/plugin.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import (
"errors"
"sync"

"github.com/reearth/reearth/server/internal/usecase/gateway"
"github.com/reearth/reearth/server/internal/usecase/repo"
"github.com/reearth/reearth/server/pkg/builtin"
"github.com/reearth/reearth/server/pkg/id"
Expand Down Expand Up @@ -117,3 +118,21 @@ func (r *Plugin) Remove(ctx context.Context, id id.PluginID) error {

return nil
}

func (r *Plugin) RemoveBySceneWithFile(cts context.Context, sid id.SceneID, f gateway.File) error {
if !r.f.CanWrite(sid) {
return nil
}

r.lock.Lock()
defer r.lock.Unlock()

newData := make([]*plugin.Plugin, 0, len(r.data))
for _, p := range r.data {
if s := p.Scene(); s == nil || *s != sid {
newData = append(newData, p)
}
}
r.data = newData
return nil
}
16 changes: 16 additions & 0 deletions server/internal/infrastructure/memory/property_schema.go
Original file line number Diff line number Diff line change
Expand Up @@ -146,3 +146,19 @@ func (r *PropertySchema) RemoveAll(ctx context.Context, ids []id.PropertySchemaI
}
return nil
}

func (r *PropertySchema) RemoveByScene(ctx context.Context, sceneID id.SceneID) error {
if !r.f.CanWrite(sceneID) {
return nil
}

r.lock.Lock()
defer r.lock.Unlock()

for lid, p := range r.data {
if s := p.Scene(); s != nil && *s == sceneID {
delete(r.data, lid)
}
}
return nil
}
39 changes: 39 additions & 0 deletions server/internal/infrastructure/mongo/asset.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,14 @@ import (
"context"
"errors"
"fmt"
"log"
"net/url"
"regexp"
"strings"

"github.com/reearth/reearth/server/internal/adapter"
"github.com/reearth/reearth/server/internal/infrastructure/mongo/mongodoc"
"github.com/reearth/reearth/server/internal/usecase/gateway"
"github.com/reearth/reearth/server/internal/usecase/repo"
"github.com/reearth/reearth/server/pkg/asset"
"github.com/reearth/reearth/server/pkg/id"
Expand Down Expand Up @@ -153,6 +156,42 @@ func (r *Asset) Remove(ctx context.Context, id id.AssetID) error {
}))
}

func (r *Asset) RemoveByProjectWithFile(ctx context.Context, pid id.ProjectID, f gateway.File) error {

projectAssets, err := r.find(ctx, bson.M{
"coresupport": true,
"project": pid.String(),
})
if err != nil {
return err
}

for _, a := range projectAssets {

if !r.f.CanWrite(a.Workspace()) {
return repo.ErrOperationDenied
}

aPath, err := url.Parse(a.URL())
if err != nil {
continue
}

err = f.RemoveAsset(ctx, aPath)
if err != nil {
log.Print(err.Error())
}

err = r.Remove(ctx, a.ID())
if err != nil {
log.Print(err.Error())
}

}

return nil
}

func (r *Asset) paginate(ctx context.Context, filter any, sort *asset.SortType, pagination *usecasex.Pagination) ([]*asset.Asset, *usecasex.PageInfo, error) {
var usort *usecasex.Sort
if sort != nil {
Expand Down
27 changes: 27 additions & 0 deletions server/internal/infrastructure/mongo/plugin.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,12 @@ package mongo
import (
"context"
"errors"
"log"

"go.mongodb.org/mongo-driver/bson"

"github.com/reearth/reearth/server/internal/infrastructure/mongo/mongodoc"
"github.com/reearth/reearth/server/internal/usecase/gateway"
"github.com/reearth/reearth/server/internal/usecase/repo"
"github.com/reearth/reearth/server/pkg/builtin"
"github.com/reearth/reearth/server/pkg/id"
Expand Down Expand Up @@ -102,6 +104,31 @@ func (r *Plugin) Remove(ctx context.Context, id id.PluginID) error {
return r.client.RemoveOne(ctx, r.writeFilter(bson.M{"id": id.String()}))
}

func (r *Plugin) RemoveBySceneWithFile(ctx context.Context, sid id.SceneID, f gateway.File) error {
plugins, err := r.find(ctx, bson.M{"scene": sid.String()})
if err != nil {
return err
}

for _, pl := range plugins {

if p := builtin.GetPlugin(pl.ID()); p != nil {
continue
}

if err := f.RemovePlugin(ctx, pl.ID()); err != nil {
log.Print(err.Error())
}

if err := r.Remove(ctx, pl.ID()); err != nil {
log.Print(err.Error())
}

}

return nil
}

func (r *Plugin) find(ctx context.Context, filter any) ([]*plugin.Plugin, error) {
c := mongodoc.NewPluginConsumer(r.f.Readable)
if err := r.client.Find(ctx, filter, c); err != nil {
Expand Down
4 changes: 4 additions & 0 deletions server/internal/infrastructure/mongo/property_schema.go
Original file line number Diff line number Diff line change
Expand Up @@ -124,6 +124,10 @@ func (r *PropertySchema) RemoveAll(ctx context.Context, ids []id.PropertySchemaI
}))
}

func (r *PropertySchema) RemoveByScene(ctx context.Context, id id.SceneID) error {
return r.client.RemoveAll(ctx, r.writeFilter(bson.M{"scene": id.String()}))
}

func (r *PropertySchema) find(ctx context.Context, dst property.SchemaList, filter any) (property.SchemaList, error) {
c := mongodoc.NewPropertySchemaConsumer(r.f.Readable)
if err := r.client.Find(ctx, filter, c); err != nil {
Expand Down
43 changes: 40 additions & 3 deletions server/internal/usecase/interactor/common.go
Original file line number Diff line number Diff line change
Expand Up @@ -143,9 +143,15 @@ func (i commonSceneLock) ReleaseSceneLock(ctx context.Context, s id.SceneID) {
}

type SceneDeleter struct {
Scene repo.Scene
SceneLock repo.SceneLock
Property repo.Property
Scene repo.Scene
SceneLock repo.SceneLock
Property repo.Property
PropertySchema repo.PropertySchema
NLSLayer repo.NLSLayer
Plugin repo.Plugin
Storytelling repo.Storytelling
Style repo.Style
File gateway.File
}

func (d SceneDeleter) Delete(ctx context.Context, s *scene.Scene, force bool) error {
Expand All @@ -164,11 +170,36 @@ func (d SceneDeleter) Delete(ctx context.Context, s *scene.Scene, force bool) er
}
}

// Delete nlsLayer
if err := d.NLSLayer.RemoveByScene(ctx, s.ID()); err != nil {
return err
}

// Delete plugin
if err := d.Plugin.RemoveBySceneWithFile(ctx, s.ID(), d.File); err != nil {
return err
}

// Delete property
if err := d.Property.RemoveByScene(ctx, s.ID()); err != nil {
return err
}

// Delete propertyschema
if err := d.PropertySchema.RemoveByScene(ctx, s.ID()); err != nil {
return err
}

// Delete storytelling
if err := d.Storytelling.RemoveByScene(ctx, s.ID()); err != nil {
return err
}

// Delete style
if err := d.Style.RemoveByScene(ctx, s.ID()); err != nil {
return err
}

// Release scene lock
if err := d.SceneLock.SaveLock(ctx, s.ID(), scene.LockModeFree); err != nil {
return err
Expand All @@ -186,6 +217,7 @@ type ProjectDeleter struct {
SceneDeleter
File gateway.File
Project repo.Project
Asset repo.Asset
}

func (d ProjectDeleter) Delete(ctx context.Context, prj *project.Project, force bool, operator *usecase.Operator) error {
Expand All @@ -199,6 +231,11 @@ func (d ProjectDeleter) Delete(ctx context.Context, prj *project.Project, force
return err
}

// Delete assets
if err := d.Asset.RemoveByProjectWithFile(ctx, prj.ID(), d.File); err != nil {
return err
}

// Delete scene
if err := d.SceneDeleter.Delete(ctx, s, force); err != nil {
return err
Expand Down
Loading