diff --git a/perxis-proto b/perxis-proto
index 278f919cda5b9d9aac548f1714213eaf52c28d7f..0627c9f829178bc6de2623a0b6d42964c44de496 160000
--- a/perxis-proto
+++ b/perxis-proto
@@ -1 +1 @@
-Subproject commit 278f919cda5b9d9aac548f1714213eaf52c28d7f
+Subproject commit 0627c9f829178bc6de2623a0b6d42964c44de496
diff --git a/pkg/files/mocks/Downloader.go b/pkg/files/mocks/Downloader.go
index 4105337e56e73a344cdcd3019d0f71d229d88910..ee33624e1fa79c5ee5d98e7d2e98a78793bce9b8 100644
--- a/pkg/files/mocks/Downloader.go
+++ b/pkg/files/mocks/Downloader.go
@@ -1,4 +1,4 @@
-// Code generated by mockery v2.43.2. DO NOT EDIT.
+// Code generated by mockery v2.49.0. DO NOT EDIT.
 
 package mocks
 
diff --git a/pkg/files/mocks/Files.go b/pkg/files/mocks/Files.go
index e4f8c664ebf84a4700165e56708f70bb85d470d8..c0f0f8079b272dbb45e47f14f8c610f5a2d8c493 100644
--- a/pkg/files/mocks/Files.go
+++ b/pkg/files/mocks/Files.go
@@ -1,4 +1,4 @@
-// Code generated by mockery v2.43.2. DO NOT EDIT.
+// Code generated by mockery v2.49.0. DO NOT EDIT.
 
 package mocks
 
@@ -140,6 +140,36 @@ func (_m *Files) MoveUpload(ctx context.Context, upload *files.MultipartUpload)
 	return r0, r1
 }
 
+// SaveFile provides a mock function with given fields: ctx, file
+func (_m *Files) SaveFile(ctx context.Context, file *files.File) (*files.File, error) {
+	ret := _m.Called(ctx, file)
+
+	if len(ret) == 0 {
+		panic("no return value specified for SaveFile")
+	}
+
+	var r0 *files.File
+	var r1 error
+	if rf, ok := ret.Get(0).(func(context.Context, *files.File) (*files.File, error)); ok {
+		return rf(ctx, file)
+	}
+	if rf, ok := ret.Get(0).(func(context.Context, *files.File) *files.File); ok {
+		r0 = rf(ctx, file)
+	} else {
+		if ret.Get(0) != nil {
+			r0 = ret.Get(0).(*files.File)
+		}
+	}
+
+	if rf, ok := ret.Get(1).(func(context.Context, *files.File) error); ok {
+		r1 = rf(ctx, file)
+	} else {
+		r1 = ret.Error(1)
+	}
+
+	return r0, r1
+}
+
 // StartUpload provides a mock function with given fields: ctx, upload
 func (_m *Files) StartUpload(ctx context.Context, upload *files.MultipartUpload) (*files.MultipartUpload, error) {
 	ret := _m.Called(ctx, upload)
diff --git a/pkg/files/mocks/Middleware.go b/pkg/files/mocks/Middleware.go
index fb16e0e77d874c40d74362960259dac2d8d3ec32..ea08f381a88b00614a3f9ed07b13f8ffcbd04323 100644
--- a/pkg/files/mocks/Middleware.go
+++ b/pkg/files/mocks/Middleware.go
@@ -1,4 +1,4 @@
-// Code generated by mockery v2.43.2. DO NOT EDIT.
+// Code generated by mockery v2.49.0. DO NOT EDIT.
 
 package mocks
 
diff --git a/pkg/files/mocks/Storage.go b/pkg/files/mocks/Storage.go
index 02467f9338aaf12741f0a95f65c7a1905e4f8fbf..239f94f3a82e9cae82f2dca8bc39ebde96f760b1 100644
--- a/pkg/files/mocks/Storage.go
+++ b/pkg/files/mocks/Storage.go
@@ -1,4 +1,4 @@
-// Code generated by mockery v2.43.2. DO NOT EDIT.
+// Code generated by mockery v2.49.0. DO NOT EDIT.
 
 package mocks
 
diff --git a/pkg/files/mocks/Uploader.go b/pkg/files/mocks/Uploader.go
index 2a7c6cbc571e085d1c8f6894f5b2c72422c2800c..8270964477d9bd0a9ec9f099f4c16ca57c7c0657 100644
--- a/pkg/files/mocks/Uploader.go
+++ b/pkg/files/mocks/Uploader.go
@@ -1,4 +1,4 @@
-// Code generated by mockery v2.43.2. DO NOT EDIT.
+// Code generated by mockery v2.49.0. DO NOT EDIT.
 
 package mocks
 
diff --git a/pkg/files/mocks/spaceGetter.go b/pkg/files/mocks/spaceGetter.go
index b56dbea69d47c51f6a6755dc6a1a1d0bf0dd649a..658b7209f7a6e171bd62c4ee9d5f2b68bc7d73f3 100644
--- a/pkg/files/mocks/spaceGetter.go
+++ b/pkg/files/mocks/spaceGetter.go
@@ -1,4 +1,4 @@
-// Code generated by mockery v2.50.0. DO NOT EDIT.
+// Code generated by mockery v2.49.0. DO NOT EDIT.
 
 package mocks
 
@@ -9,7 +9,7 @@ type SpaceGetter struct {
 	mock.Mock
 }
 
-// GetSpaceID provides a mock function with no fields
+// GetSpaceID provides a mock function with given fields:
 func (_m *SpaceGetter) GetSpaceID() string {
 	ret := _m.Called()