MM-60115, MM-62436, MM-62493: Compliance export downloads from local and s3; e2e tests (#29806)
* add ZipReader method to filestore and file/s3 backends to merge to merge * add WriteStreamResponse as an alternative to WriteFileResponse * add generated layers * enable download link; download job endpoint now streams export dir zips * fix MM-62493 * re-enable e2e tests--we have download links, folks * Add tests for ZipReader in filestore and s3store * remove unnecessary error return on ZipReader * little cleanup * improve tests; some refactoring: s.Nil(err) -> s.NoError(err) * blank commit * backwards compatability for pre-10.5 job downloads * compress file response; better errors; better comments; PR comments * update generated app layers * improve/widen tests; improve comments; simplify localstore ZipReader * regenerate layers * follow GoDoc conventions * update generated layers * remove unnecessary comment * in jobs/job-id/download, clean exportDir before sending to ZipReader * better comments; add an error return on ZipReader * improve file permissions * adjust tests for new error returns * linting * i18n
Этот коммит содержится в:
коммит произвёл
GitHub
родитель
396ee06dcb
Коммит
737bed311c
@@ -124,20 +124,43 @@ func fileReader(backend filestore.FileBackend, path string) (filestore.ReadClose
|
||||
return result, nil
|
||||
}
|
||||
|
||||
func zipReader(backend filestore.FileBackend, path string, deflate bool) (io.ReadCloser, *model.AppError) {
|
||||
result, err := backend.ZipReader(path, deflate)
|
||||
if err != nil {
|
||||
return nil, model.NewAppError("ZipReader", "api.file.zip_file_reader.app_error", nil, "", http.StatusInternalServerError).Wrap(err)
|
||||
}
|
||||
return result, nil
|
||||
}
|
||||
|
||||
func (s *Server) fileReader(path string) (filestore.ReadCloseSeeker, *model.AppError) {
|
||||
return fileReader(s.FileBackend(), path)
|
||||
}
|
||||
|
||||
func (s *Server) zipReader(path string, deflate bool) (io.ReadCloser, *model.AppError) {
|
||||
return zipReader(s.FileBackend(), path, deflate)
|
||||
}
|
||||
|
||||
func (s *Server) exportFileReader(path string) (filestore.ReadCloseSeeker, *model.AppError) {
|
||||
return fileReader(s.ExportFileBackend(), path)
|
||||
}
|
||||
|
||||
// Caller must close the first return value
|
||||
// FileReader returns a ReadCloseSeeker for path from the FileBackend.
|
||||
//
|
||||
// The caller is responsible for closing the returned ReadCloseSeeker.
|
||||
func (a *App) FileReader(path string) (filestore.ReadCloseSeeker, *model.AppError) {
|
||||
return a.Srv().fileReader(path)
|
||||
}
|
||||
|
||||
// Caller must close the first return value
|
||||
// ZipReader returns a ReadCloser for path. If deflate is true, the zip will use compression.
|
||||
//
|
||||
// The caller is responsible for closing the returned ReadCloser.
|
||||
func (a *App) ZipReader(path string, deflate bool) (io.ReadCloser, *model.AppError) {
|
||||
return a.Srv().zipReader(path, deflate)
|
||||
}
|
||||
|
||||
// ExportFileReader returns a ReadCloseSeeker for path from the ExportFileBackend.
|
||||
//
|
||||
// The caller is responsible for closing the returned ReadCloseSeeker.
|
||||
func (a *App) ExportFileReader(path string) (filestore.ReadCloseSeeker, *model.AppError) {
|
||||
return a.Srv().exportFileReader(path)
|
||||
}
|
||||
@@ -424,7 +447,7 @@ func parseOldFilenames(rctx request.CTX, filenames []string, channelID, userID s
|
||||
return parsed
|
||||
}
|
||||
|
||||
// Creates and stores FileInfos for a post created before the FileInfos table existed.
|
||||
// MigrateFilenamesToFileInfos creates and stores FileInfos for a post created before the FileInfos table existed.
|
||||
func (a *App) MigrateFilenamesToFileInfos(rctx request.CTX, post *model.Post) []*model.FileInfo {
|
||||
if len(post.Filenames) == 0 {
|
||||
rctx.Logger().Warn("Unable to migrate post to use FileInfos with an empty Filenames field", mlog.String("post_id", post.Id))
|
||||
|
||||
Ссылка в новой задаче
Block a user