first commit
Some checks failed
Publish NPM Package / Publish Job (push) Failing after 1m34s

This commit is contained in:
lendry
2026-05-21 21:49:32 +03:00
commit fbe3b0327c
48 changed files with 5523 additions and 0 deletions

View File

@@ -0,0 +1,107 @@
syntax = "proto3";
package glifa.media.v1;
import "glifa/common/v1/types.proto";
import "glifa/media/v1/types.proto";
option go_package = "glifa/contracts/gen/go/glifa/media/v1;mediav1";
service MediaService {
rpc InitiateUpload(InitiateUploadRequest) returns (InitiateUploadResponse);
rpc PresignPartUpload(PresignPartUploadRequest) returns (PresignPartUploadResponse);
rpc CompletePart(CompletePartRequest) returns (CompletePartResponse);
rpc FinalizeUpload(FinalizeUploadRequest) returns (FinalizeUploadResponse);
rpc AbortUpload(AbortUploadRequest) returns (AbortUploadResponse);
rpc GetMediaObject(GetMediaObjectRequest) returns (GetMediaObjectResponse);
rpc CreateAccessGrant(CreateAccessGrantRequest) returns (CreateAccessGrantResponse);
rpc ResolveDownload(ResolveDownloadRequest) returns (ResolveDownloadResponse);
}
message InitiateUploadRequest {
glifa.common.v1.RequestMeta meta = 1; // Метаданные запроса, такие как идентификатор корреляции, язык и т.д.
string file_name = 2; // Исходное имя файла, который будет загружен
string declared_mime_type = 3; // MIME-тип файла, который будет загружен (например, "image/jpeg", "video/mp4")
uint64 expected_size = 4; // Ожидаемый размер файла в байтах, который будет загружен
bool multipart = 5; // Флаг, указывающий, будет ли загрузка выполняться в несколько частей (multipart upload)
MediaVisibility visibility = 6; // Видимость медиа-объекта (публичный или приватный)
}
message InitiateUploadResponse {
UploadIntent upload_intent = 1; // Намерение загрузки, содержащее информацию о процессе загрузки и его статусе
}
message PresignPartUploadRequest {
glifa.common.v1.RequestMeta meta = 1; // Метаданные запроса, такие как идентификатор корреляции, язык и т.д.
string upload_intent_id = 2; // UUID намерения загрузки, к которому относится эта часть
int32 part_number = 3; // Номер части в последовательности загрузки (начинается с 1)
}
message PresignPartUploadResponse {
string url = 1; // Предварительно подписанный URL для загрузки части файла в хранилище
map<string, string> headers = 2; // Дополнительные заголовки, которые должны быть включены в запрос загрузки части (например, для аутентификации или указания типа контента)
}
message CompletePartRequest {
glifa.common.v1.RequestMeta meta = 1; // Метаданные запроса, такие как идентификатор корреляции, язык и т.д.
string upload_intent_id = 2; // UUID намерения загрузки, к которому относится эта часть
int32 part_number = 3; // Номер части в последовательности загрузки (начинается с 1)
string etag = 4; // ETag, возвращаемый хранилищем после успешной загрузки части, который будет использоваться для финализации загрузки
uint64 size = 5; // Размер части в байтах
}
message CompletePartResponse {
UploadPart part = 1; // Информация о загруженной части, включая номер части, ETag и размер
}
message FinalizeUploadRequest {
glifa.common.v1.RequestMeta meta = 1; // Метаданные запроса, такие как идентификатор корреляции, язык и т.д.
string upload_intent_id = 2; // UUID намерения загрузки, который будет финализирован
string checksum = 3; // Контрольная сумма (например, MD5 или SHA-256) всего файла, который был загружен, для проверки целостности данных
}
message FinalizeUploadResponse {
UploadIntent upload_intent = 1; // Намерение загрузки с обновленным статусом, указывающим, что загрузка была успешно завершена
MediaObject media_object = 2; // Информация о созданном медиа-объекте, включая его UUID, размер, MIME-тип и т.д.
}
message AbortUploadRequest {
glifa.common.v1.RequestMeta meta = 1; // Метаданные запроса, такие как идентификатор корреляции, язык и т.д.
string upload_intent_id = 2; // UUID намерения загрузки, который будет прерван
}
message AbortUploadResponse {
bool success = 1; // Флаг, указывающий, была ли операция прерывания успешной
}
message GetMediaObjectRequest {
glifa.common.v1.RequestMeta meta = 1; // Метаданные запроса, такие как идентификатор корреляции, язык и т.д.
string media_object_id = 2; // UUID медиа-объекта, который пользователь хочет получить
}
message GetMediaObjectResponse {
MediaObject media_object = 1; // Информация о запрошенном медиа-объекте, включая его UUID, размер, MIME-тип, статус и т.д.
}
message CreateAccessGrantRequest {
glifa.common.v1.RequestMeta meta = 1; // Метаданные запроса, такие как идентификатор корреляции, язык и т.д.
string media_object_id = 2; // UUID медиа-объекта, для которого создается грант доступа
string subject_user_id = 3; // UUID пользователя, которому предоставляется доступ к медиа-объекту
bool single_use = 4; // Флаг, указывающий, является ли грант доступа одноразовым (может быть использован только один раз для доступа к медиа-объекту)
}
message CreateAccessGrantResponse {
MediaAccessGrant grant = 1; // Информация о созданном гранте доступа, включая его UUID, связанный медиа-объект, субъект доступа и т.д.
}
message ResolveDownloadRequest {
glifa.common.v1.RequestMeta meta = 1; // Метаданные запроса, такие как идентификатор корреляции, язык и т.д.
string media_object_id = 2; // UUID медиа-объекта, который пользователь хочет скачать
string access_grant_id = 3; // UUID гранта доступа, который будет использоваться для авторизации доступа к медиа-объекту при скачивании
}
message ResolveDownloadResponse {
string url = 1; // Предварительно подписанный URL для скачивания файла медиа-объекта из хранилища
map<string, string> headers = 2; // Дополнительные заголовки, которые должны быть включены в запрос скачивания файла (например, для аутентификации или указания типа контента)
string method = 3; // HTTP-метод, который должен быть использован для скачивания файла (например, "GET", "POST")
}

View File

@@ -0,0 +1,80 @@
syntax = "proto3";
package glifa.media.v1;
import "google/protobuf/timestamp.proto";
option go_package = "glifa/contracts/gen/go/glifa/media/v1;mediav1";
enum UploadIntentStatus{
UPLOAD_INTENT_STATUS_UNSPECIFIED = 0; // Неопределенный статус намерения загрузки
UPLOAD_INTENT_STATUS_INITIATED = 1; // Намерение загрузки было инициализировано, но загрузка еще не началась
UPLOAD_INTENT_STATUS_UPLOADING = 2; // Процесс загрузки медиа-объекта начался, но еще не завершился
UPLOAD_INTENT_STATUS_FINALIZED = 3; // Процесс загрузки медиа-объекта успешно завершился, и медиа-объект был создан
UPLOAD_INTENT_STATUS_ABORTED = 4; // Процесс загрузки был прерван или отменен до его завершения
UPLOAD_INTENT_STATUS_EXPIRED = 5; // Намерение загрузки истекло, и загрузка не может быть завершена
}
enum MediaObjectStatus {
MEDIA_OBJECT_STATUS_UNSPECIFIED = 0; // Неопределенный статус медиа-объекта
MEDIA_OBJECT_STATUS_PENDING = 1; // Медиа-объект находится в ожидании обработки (например, конвертации или проверки)
MEDIA_OBJECT_STATUS_ACTIVE = 2; // Медиа-объект активен и доступен для использования
MEDIA_OBJECT_STATUS_QUARANTINED = 3; // Медиа-объект помещен в карантин из-за подозрения на нарушение правил (например, неподобающий контент)
MEDIA_OBJECT_STATUS_DELETED = 4; // Медиа-объект удален и больше не доступен
}
enum MediaVisibility {
MEDIA_VISIBILITY_UNSPECIFIED = 0; // Неопределенная видимость медиа-объекта
MEDIA_VISIBILITY_PUBLIC = 1; // Медиа-объект публичный и доступен всем пользователям
MEDIA_VISIBILITY_PRIVATE = 2; // Медиа-объект приватный и доступен только владельцу
}
message UploadIntent {
string id = 1; // UUID намерения загрузки, который будет использоваться для идентификации процесса загрузки
string owner_user_id = 2; // UUID пользователя, который инициализировал
string file_name = 3; // Исходное имя файла, который будет загружен
string declared_mime_type = 4; // MIME-тип файла, который будет загружен (например, "image/jpeg", "video/mp4")
uint64 expected_size = 5; // Ожидаемый размер файла в байтах, который будет загружен
bool multipart = 6; // Флаг, указывающий, будет ли загрузка выполняться в несколько частей (multipart upload)
UploadIntentStatus status = 7; // Текущий статус намерения загрузки
google.protobuf.Timestamp expires_at = 8; // Временная метка, указывающая, когда намерение загрузки истекает и больше не может быть использовано для загрузки файла
google.protobuf.Timestamp created_at = 9; // Временная метка создания намерения загрузки
google.protobuf.Timestamp updated_at = 10; // Временная метка последнего обновления намерения загрузки
}
message UploadPart {
string upload_intent_id = 1; // UUID намерения загрузки, к которому относится эта часть
int32 part_number = 2; // Номер части в последовательности загрузки (начинается с 1)
string etag = 3; // ETag, возвращаемый хранилищем после успешной загрузки части, который будет использоваться для финализации загрузки
uint64 size = 4; // Размер части в байтах
google.protobuf.Timestamp completed_at = 5; // Временная метка, указывающая, когда эта часть была успешно загружена
}
message MediaObject {
string id = 1; // UUID медиа-объекта, который будет использоваться для идентификации и доступа к медиа-объекту
string owner_user_id = 2; // UUID пользователя, которому принадлежит этот медиа-объект
string object_key = 3; // Ключ объекта в хранилище, который указывает на местоположение файла медиа-объекта
string checksum = 4; // Контрольная сумма (например, MD5 или SHA-256) файла медиа-объекта, которая может использоваться для проверки целостности данных
uint64 size = 5; // Размер файла медиа-объекта в бай
string detected_mime_type = 6; // MIME-тип, определенный после загрузки и анализа файла медиа-объекта
MediaVisibility visibility = 7; // Видимость медиа-объекта (публичный или приватный)
MediaObjectStatus status = 8; // Текущий статус медиа-объекта (например, ожидает обработки, активен, в карантине, удален)
string encryption_key_ref = 9; // Ссылка на ключ шифрования, если медиа-объект зашифрован
string link_resource_type = 10; // Тип ресурса, с которым связан этот медиа-объект (например, "post", "profile_picture", "document")
string link_resource_id = 11; // UUID ресурса, с которым связан этот медиа-объект (например, идентификатор поста, идентификатор профиля пользователя, идентификатор документа)
google.protobuf.Timestamp created_at = 12; // Временная метка создания медиа-объекта
google.protobuf.Timestamp updated_at = 13; // Временная метка последнего обновления медиа-объекта
}
message MediaAccessGrant{
string id = 1; // UUID разрешения доступа, который будет использоваться для идентификации и управления разрешением доступа
string media_object_id = 2; // UUID медиа-объекта, к
string subject_user_id = 3; // UUID пользователя, которому предоставлено разрешение доступа к медиа-объекту
bool single_use = 4; // Флаг, указывающий, является ли это разрешение одноразовым (single-use), которое может быть использовано только один раз для доступа к медиа-объекту
google.protobuf.Timestamp expires_at = 5; // Временная метка, указывающая, когда разрешение доступа истекает и больше не может быть использовано для доступа к медиа-объекту
google.protobuf.Timestamp consumed_at = 6; // Временная метка, указывающая, когда это разрешение доступа было использовано для доступа к медиа-объекту (для одноразовых разрешений)
google.protobuf.Timestamp created_at = 7; // Временная метка создания разрешения доступа
}