Skip to content
Snippets Groups Projects
Commit 63c7e1a0 authored by Pavel Antonov's avatar Pavel Antonov :asterisk:
Browse files

SaveFile method

parent 957a224e
No related branches found
No related tags found
No related merge requests found
...@@ -150,10 +150,10 @@ tasks: ...@@ -150,10 +150,10 @@ tasks:
Примеры использования: Примеры использования:
Перегенерация всех middleware только для пакета items: Перегенерация всех middleware только для пакета items:
task regen:middleware DIR=pkg/items task gen:middleware DIR=pkg/items
Перегенерация всех recovery middleware для всех пакетов: Перегенерация всех recovery middleware для всех пакетов:
task regen:middleware MIDDLEWARE_NAME=recovering_middleware task gen:middleware MIDDLEWARE_NAME=recovering_middleware
Перегенерация middleware телеметрии для пакета collections: Перегенерация middleware телеметрии для пакета collections:
task gen:middleware DIR=pkg/collections MIDDLEWARE_NAME=recovering_middleware task gen:middleware DIR=pkg/collections MIDDLEWARE_NAME=recovering_middleware
......
...@@ -2,7 +2,6 @@ package files ...@@ -2,7 +2,6 @@ package files
import ( import (
"context" "context"
"errors"
"fmt" "fmt"
"io" "io"
"net/url" "net/url"
...@@ -132,17 +131,15 @@ func (t FileType) PreSave(ctx context.Context, fld *field.Field, v interface{}, ...@@ -132,17 +131,15 @@ func (t FileType) PreSave(ctx context.Context, fld *field.Field, v interface{},
return nil, false, nil return nil, false, nil
} }
f := v.(*File) f := v.(*File)
if f.ID == "" {
return nil, false, errors.New("FileType: file id required")
}
if !f.Temporary {
return f, false, nil
}
f, err := t.fs.MoveUpload(ctx, &MultipartUpload{File: *f}) // Выполняет проверка и сохранение файла в постоянное хранилище
// Если файл уже находится в постоянном хранилище, то ничего не делаем
f, err := t.fs.SaveFile(ctx, f)
if err != nil { if err != nil {
return nil, false, err return nil, false, err
} }
return f, true, nil return f, true, nil
} }
......
package middleware
// Code generated by gowrap. DO NOT EDIT. // Code generated by gowrap. DO NOT EDIT.
// template: ../../../assets/templates/middleware/access_log.tmpl // template: ../../../assets/templates/middleware/access_log.tmpl
// gowrap: http://github.com/hexdigest/gowrap // gowrap: http://github.com/hexdigest/gowrap
package middleware
//go:generate gowrap gen -p git.perx.ru/perxis/perxis-go/pkg/files -i Files -t ../../../assets/templates/middleware/access_log.tmpl -o access_logging_middleware.go -l "" //go:generate gowrap gen -p git.perx.ru/perxis/perxis-go/pkg/files -i Files -t ../../../assets/templates/middleware/access_log.tmpl -o access_logging_middleware.go -l ""
import ( import (
...@@ -124,6 +124,25 @@ func (m *accessLoggingMiddleware) MoveUpload(ctx context.Context, upload *files. ...@@ -124,6 +124,25 @@ func (m *accessLoggingMiddleware) MoveUpload(ctx context.Context, upload *files.
return file, err return file, err
} }
func (m *accessLoggingMiddleware) SaveFile(ctx context.Context, file *files.File) (f *files.File, err error) {
begin := time.Now()
m.logger.Debug("SaveFile.Request",
zap.Reflect("principal", auth.GetPrincipal(ctx)),
zap.Reflect("file", file),
)
f, err = m.next.SaveFile(ctx, file)
m.logger.Debug("SaveFile.Response",
zap.Duration("time", time.Since(begin)),
zap.Reflect("f", f),
zap.Error(err),
)
return f, err
}
func (m *accessLoggingMiddleware) StartUpload(ctx context.Context, upload *files.MultipartUpload) (u *files.MultipartUpload, err error) { func (m *accessLoggingMiddleware) StartUpload(ctx context.Context, upload *files.MultipartUpload) (u *files.MultipartUpload, err error) {
begin := time.Now() begin := time.Now()
......
package middleware
// Code generated by gowrap. DO NOT EDIT. // Code generated by gowrap. DO NOT EDIT.
// template: ../../../assets/templates/middleware/error_log // template: ../../../assets/templates/middleware/error_log
// gowrap: http://github.com/hexdigest/gowrap // gowrap: http://github.com/hexdigest/gowrap
package middleware
//go:generate gowrap gen -p git.perx.ru/perxis/perxis-go/pkg/files -i Files -t ../../../assets/templates/middleware/error_log -o error_logging_middleware.go -l "" //go:generate gowrap gen -p git.perx.ru/perxis/perxis-go/pkg/files -i Files -t ../../../assets/templates/middleware/error_log -o error_logging_middleware.go -l ""
import ( import (
...@@ -79,6 +79,16 @@ func (m *errorLoggingMiddleware) MoveUpload(ctx context.Context, upload *files.M ...@@ -79,6 +79,16 @@ func (m *errorLoggingMiddleware) MoveUpload(ctx context.Context, upload *files.M
return m.next.MoveUpload(ctx, upload) return m.next.MoveUpload(ctx, upload)
} }
func (m *errorLoggingMiddleware) SaveFile(ctx context.Context, file *files.File) (f *files.File, err error) {
logger := m.logger
defer func() {
if err != nil {
logger.Warn("response error", zap.Error(err))
}
}()
return m.next.SaveFile(ctx, file)
}
func (m *errorLoggingMiddleware) StartUpload(ctx context.Context, upload *files.MultipartUpload) (u *files.MultipartUpload, err error) { func (m *errorLoggingMiddleware) StartUpload(ctx context.Context, upload *files.MultipartUpload) (u *files.MultipartUpload, err error) {
logger := m.logger logger := m.logger
defer func() { defer func() {
......
package middleware
// Code generated by gowrap. DO NOT EDIT. // Code generated by gowrap. DO NOT EDIT.
// template: ../../../assets/templates/middleware/middleware.tmpl // template: ../../../assets/templates/middleware/middleware.tmpl
// gowrap: http://github.com/hexdigest/gowrap // gowrap: http://github.com/hexdigest/gowrap
package middleware
//go:generate gowrap gen -p git.perx.ru/perxis/perxis-go/pkg/files -i Files -t ../../../assets/templates/middleware/middleware.tmpl -o middleware.go -l "" //go:generate gowrap gen -p git.perx.ru/perxis/perxis-go/pkg/files -i Files -t ../../../assets/templates/middleware/middleware.tmpl -o middleware.go -l ""
import ( import (
......
package middleware
// Code generated by gowrap. DO NOT EDIT. // Code generated by gowrap. DO NOT EDIT.
// template: ../../../assets/templates/middleware/recovery // template: ../../../assets/templates/middleware/recovery
// gowrap: http://github.com/hexdigest/gowrap // gowrap: http://github.com/hexdigest/gowrap
package middleware
//go:generate gowrap gen -p git.perx.ru/perxis/perxis-go/pkg/files -i Files -t ../../../assets/templates/middleware/recovery -o recovering_middleware.go -l "" //go:generate gowrap gen -p git.perx.ru/perxis/perxis-go/pkg/files -i Files -t ../../../assets/templates/middleware/recovery -o recovering_middleware.go -l ""
import ( import (
...@@ -90,6 +90,18 @@ func (m *recoveringMiddleware) MoveUpload(ctx context.Context, upload *files.Mul ...@@ -90,6 +90,18 @@ func (m *recoveringMiddleware) MoveUpload(ctx context.Context, upload *files.Mul
return m.next.MoveUpload(ctx, upload) return m.next.MoveUpload(ctx, upload)
} }
func (m *recoveringMiddleware) SaveFile(ctx context.Context, file *files.File) (f *files.File, err error) {
logger := m.logger
defer func() {
if r := recover(); r != nil {
logger.Error("panic", zap.Error(fmt.Errorf("%v", r)))
err = fmt.Errorf("%v", r)
}
}()
return m.next.SaveFile(ctx, file)
}
func (m *recoveringMiddleware) StartUpload(ctx context.Context, upload *files.MultipartUpload) (u *files.MultipartUpload, err error) { func (m *recoveringMiddleware) StartUpload(ctx context.Context, upload *files.MultipartUpload) (u *files.MultipartUpload, err error) {
logger := m.logger logger := m.logger
defer func() { defer func() {
......
package middleware
// Code generated by gowrap. DO NOT EDIT. // Code generated by gowrap. DO NOT EDIT.
// template: ../../../assets/templates/middleware/telemetry_default // template: ../../../assets/templates/middleware/telemetry_default
// gowrap: http://github.com/hexdigest/gowrap // gowrap: http://github.com/hexdigest/gowrap
package middleware
//go:generate gowrap gen -p git.perx.ru/perxis/perxis-go/pkg/files -i Files -t ../../../assets/templates/middleware/telemetry_default -o telemetry_middleware.go -l "" //go:generate gowrap gen -p git.perx.ru/perxis/perxis-go/pkg/files -i Files -t ../../../assets/templates/middleware/telemetry_default -o telemetry_middleware.go -l ""
import ( import (
...@@ -250,6 +250,46 @@ func (_d telemetryMiddleware) MoveUpload(ctx context.Context, upload *files.Mult ...@@ -250,6 +250,46 @@ func (_d telemetryMiddleware) MoveUpload(ctx context.Context, upload *files.Mult
return file, err return file, err
} }
// SaveFile implements files.Files
func (_d telemetryMiddleware) SaveFile(ctx context.Context, file *files.File) (f *files.File, err error) {
var att = []attribute.KeyValue{
attribute.String("service", "Files"),
attribute.String("method", "SaveFile"),
}
attributes := otelmetric.WithAttributeSet(attribute.NewSet(att...))
start := time.Now()
ctx, _span := otel.Tracer(_d._instance).Start(ctx, "Files.SaveFile")
defer _span.End()
f, err = _d.Files.SaveFile(ctx, file)
_d.requestMetrics.DurationMilliseconds.Record(ctx, time.Since(start).Milliseconds(), attributes)
caller, _ := pkgId.NewObjectId(auth.GetPrincipal(ctx))
if caller != nil {
att = append(att, attribute.String("caller", caller.String()))
}
_d.requestMetrics.Total.Add(ctx, 1, otelmetric.WithAttributeSet(attribute.NewSet(att...)))
if _d._spanDecorator != nil {
_d._spanDecorator(_span, map[string]interface{}{
"ctx": ctx,
"file": file}, map[string]interface{}{
"f": f,
"err": err})
} else if err != nil {
_d.requestMetrics.FailedTotal.Add(ctx, 1, attributes)
_span.RecordError(err)
_span.SetAttributes(attribute.String("event", "error"))
_span.SetAttributes(attribute.String("message", err.Error()))
}
return f, err
}
// StartUpload implements files.Files // StartUpload implements files.Files
func (_d telemetryMiddleware) StartUpload(ctx context.Context, upload *files.MultipartUpload) (u *files.MultipartUpload, err error) { func (_d telemetryMiddleware) StartUpload(ctx context.Context, upload *files.MultipartUpload) (u *files.MultipartUpload, err error) {
var att = []attribute.KeyValue{ var att = []attribute.KeyValue{
......
...@@ -23,6 +23,9 @@ type Files interface { ...@@ -23,6 +23,9 @@ type Files interface {
// После перемещение загрузки хранилище выдает новый идентификатор постоянного файла // После перемещение загрузки хранилище выдает новый идентификатор постоянного файла
MoveUpload(ctx context.Context, upload *MultipartUpload) (file *File, err error) MoveUpload(ctx context.Context, upload *MultipartUpload) (file *File, err error)
// SaveFile - сохраняет файл в хранилище, выполняет перемещение в постоянное хранилище
SaveFile(ctx context.Context, file *File) (f *File, err error)
// Upload - инициация загрузки файла в хранилище. Возвращает объект, содержащий подписанный URL. // Upload - инициация загрузки файла в хранилище. Возвращает объект, содержащий подписанный URL.
// Завершение загрузки файла осуществляется выполнением POST-запроса // Завершение загрузки файла осуществляется выполнением POST-запроса
Upload(ctx context.Context, file *File) (u *Upload, err error) Upload(ctx context.Context, file *File) (u *Upload, err error)
......
...@@ -5,6 +5,7 @@ package transport ...@@ -5,6 +5,7 @@ package transport
import ( import (
"context" "context"
"git.perx.ru/perxis/perxis-go/pkg/errors"
files "git.perx.ru/perxis/perxis-go/pkg/files" files "git.perx.ru/perxis/perxis-go/pkg/files"
) )
...@@ -44,6 +45,10 @@ func (set EndpointsSet) MoveUpload(arg0 context.Context, arg1 *files.MultipartUp ...@@ -44,6 +45,10 @@ func (set EndpointsSet) MoveUpload(arg0 context.Context, arg1 *files.MultipartUp
return response.(*MoveUploadResponse).File, res1 return response.(*MoveUploadResponse).File, res1
} }
func (set EndpointsSet) SaveFile(arg0 context.Context, f *files.File) (res0 *files.File, res1 error) {
return nil, errors.New("internal method")
}
func (set EndpointsSet) Upload(arg0 context.Context, arg1 *files.File) (res0 *files.Upload, res1 error) { func (set EndpointsSet) Upload(arg0 context.Context, arg1 *files.File) (res0 *files.Upload, res1 error) {
request := UploadRequest{File: arg1} request := UploadRequest{File: arg1}
response, res1 := set.UploadEndpoint(arg0, &request) response, res1 := set.UploadEndpoint(arg0, &request)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment