Skip to content
Snippets Groups Projects
files.proto 5.13 KiB
syntax = "proto3";

import "google/protobuf/empty.proto";

option go_package = "git.perx.ru/perxis/perxis-go/proto/files;files";

package files;

// Сущности

message File {
  string id = 1;        // Уникальный идентификатор файла в хранилище
  string name = 2;      // Имя файла
  uint64 size = 3;      // Размер файла
  string mime_type = 4; // Mime-type файла
  string url = 5;       // Адрес для загрузки файла
  bool temporary = 6;   // Находится ли файл во временном хранилище
}

message MultipartUpload {
  File file = 1;
  string upload_id = 2;             // Идентификатор загрузки хранилища
  uint64 part_size = 3;             // Размер блока для загрузки
  repeated string part_urls = 4;    // Адреса для загрузки пол
  repeated CompletedPart parts = 5; // Идентификаторы загруженных блоков (S3 ETAGs)
}

message Upload {
  File file = 1;
  string upload_url = 2;   // URL для загрузки файлов
}

message CompletedPart {
  int32 number = 1;
  string id = 2;
}

// Запросы и ответы

message StartUploadRequest {
  MultipartUpload upload = 1;
}
message StartUploadResponse {
  MultipartUpload upload = 1;
}

message CompleteUploadRequest {
  MultipartUpload upload = 1;
}
message CompleteUploadResponse {
  MultipartUpload upload = 1;
}

message AbortUploadRequest {
  MultipartUpload upload = 1;
}
message AbortUploadResponse {}

message MoveUploadRequest {
  MultipartUpload upload = 1;
}
message MoveUploadResponse {
  File file = 1;
}

message UploadRequest {
  File file = 1;
}
message UploadResponse {
  Upload upload = 1;
}

message GetFileRequest {
  string id = 1;
}
message GetFileResponse {
  File file = 1;
}

message DeleteFileRequest {
  File file = 1;
}
message DeleteFileResponse {}

service Files {
  // StartUpload - инициирует процедуру загрузки файла в файловое хранилище.
  // Используется клиентским приложением для начала загрузки файла
  // Требуемые параметры: объект `MultipartUpload` с вложенным объектом `File`, в котором
  // обязательные поля  Name и Size.
  // Возвращает объект с заполненными полями ID, PartSize, PartURLs, MimeType, Size, UploadID.
  rpc StartUpload(StartUploadRequest) returns(StartUploadResponse) {}

  // CompleteUpload - завершает процедуру загрузку файла
  // Предполагается, что в объекте, полученном из `StartUpload`, клиент должен заполнить поле
  // Parts (идентификаторами загруженных блоков (S3 ETAGs)) и передать его в `CompleteUpload`
  rpc CompleteUpload(CompleteUploadRequest) returns(CompleteUploadResponse) {}

  // AbortUpload - прерывает процедуру загрузки файла, все загруженные части файла удаляются их хранилища
  rpc AbortUpload(AbortUploadRequest) returns(google.protobuf.Empty) {}

  // MoveUpload - перемещает загруженный файл из временного расположения в постоянное месторасположения.
  // После перемещение загрузки хранилище выдает новый идентификатор постоянного файла
  rpc MoveUpload(MoveUploadRequest) returns(MoveUploadResponse) {}

  // Upload - инициация загрузки файла в хранилище. Возвращает объект, содержащий подписанный URL.
  // Завершение загрузки файла осуществляется выполнением POST-запроса
  rpc Upload(UploadRequest) returns(UploadResponse) {}

  // GetFile - получить информацию о файле (ссылку) по ID
  rpc GetFile(GetFileRequest) returns(GetFileResponse) {}

  // DeleteFile - удаляет файл. Если происходит удаление оригинала,
  // удаляются и все связанные структуры
  // Возможны следующие ситуации:
  //  - Удаление оригинального файла. Удаляется файл и все связанные с ним файлы.
  //  - Удаление связанного файла. Для удаления конкретного файла передается 'ID', 'Type' и 'Name'
  //  - Удаления связанных файлов конкретного типа (например, все 'thumbnails'). Передается 'ID' и 'Type'
  rpc DeleteFile(DeleteFileRequest) returns(google.protobuf.Empty) {}
}

message FileEvent {
  string file_id = 1;

  message Upload {}

  message MoveUpload {}

  message Delete {}

  oneof event {
    Upload upload = 100;
    MoveUpload move_upload = 101;
    Delete delete = 102;
  }
}