@barupost/contracts 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. package/dist/events/account/email-changed.interface.d.ts +4 -0
  2. package/dist/events/account/email-changed.interface.js +2 -0
  3. package/dist/events/account/index.d.ts +2 -0
  4. package/dist/events/account/index.js +18 -0
  5. package/dist/events/account/phone-changed.interface.d.ts +4 -0
  6. package/dist/events/account/phone-changed.interface.js +2 -0
  7. package/dist/events/auth/index.d.ts +1 -0
  8. package/dist/events/auth/index.js +17 -0
  9. package/dist/events/auth/otp-requested.interface.d.ts +5 -0
  10. package/dist/events/auth/otp-requested.interface.js +2 -0
  11. package/dist/events/index.d.ts +2 -0
  12. package/dist/events/index.js +18 -0
  13. package/dist/generated/account.d.ts +70 -0
  14. package/dist/generated/account.js +45 -0
  15. package/dist/generated/auth.d.ts +83 -0
  16. package/dist/generated/auth.js +34 -0
  17. package/dist/generated/google/protobuf/empty.d.ts +13 -0
  18. package/dist/generated/google/protobuf/empty.js +11 -0
  19. package/dist/generated/google/protobuf/timestamp.d.ts +109 -0
  20. package/dist/generated/google/protobuf/timestamp.js +11 -0
  21. package/dist/generated/index.d.ts +6 -0
  22. package/dist/generated/index.js +22 -0
  23. package/dist/generated/media.d.ts +124 -0
  24. package/dist/generated/media.js +35 -0
  25. package/dist/generated/posts.d.ts +259 -0
  26. package/dist/generated/posts.js +57 -0
  27. package/dist/generated/session.d.ts +56 -0
  28. package/dist/generated/session.js +32 -0
  29. package/dist/generated/users.d.ts +87 -0
  30. package/dist/generated/users.js +40 -0
  31. package/dist/index.d.ts +3 -0
  32. package/dist/index.js +19 -0
  33. package/dist/proto/index.d.ts +1 -0
  34. package/dist/proto/index.js +17 -0
  35. package/dist/proto/paths.d.ts +8 -0
  36. package/dist/proto/paths.js +12 -0
  37. package/gen/go/.gitkeep +0 -0
  38. package/gen/go/media/media.pb.go +1545 -0
  39. package/gen/go/media/media_grpc.pb.go +342 -0
  40. package/gen/ts/.gitkeep +0 -0
  41. package/gen/ts/account.ts +133 -0
  42. package/gen/ts/auth.ts +135 -0
  43. package/gen/ts/google/protobuf/empty.ts +23 -0
  44. package/gen/ts/google/protobuf/struct.ts +197 -0
  45. package/gen/ts/google/protobuf/timestamp.ts +119 -0
  46. package/gen/ts/media.ts +205 -0
  47. package/gen/ts/posts.ts +417 -0
  48. package/gen/ts/session.ts +110 -0
  49. package/gen/ts/users.ts +140 -0
  50. package/package.json +28 -0
  51. package/proto/account.proto +75 -0
  52. package/proto/auth.proto +91 -0
  53. package/proto/media.proto +120 -0
  54. package/proto/posts.proto +270 -0
  55. package/proto/session.proto +61 -0
  56. package/proto/users.proto +105 -0
@@ -0,0 +1,75 @@
1
+ syntax = "proto3";
2
+
3
+ package account.v1;
4
+
5
+ service AccountService {
6
+ rpc GetAccount (GetAccountRequest) returns (GetAccountResponse);
7
+
8
+ rpc InitEmailChange (InitEmailChangeRequest) returns (InitEmailChangeResponse);
9
+ rpc ConfirmEmailChange (ConfirmEmailChangeRequest) returns (ConfirmEmailChangeResponse);
10
+
11
+ rpc InitPhoneChange (InitPhoneChangeRequest) returns (InitPhoneChangeResponse);
12
+ rpc ConfirmPhoneChange (ConfirmPhoneChangeRequest) returns (ConfirmPhoneChangeResponse);
13
+ }
14
+
15
+ message GetAccountRequest {
16
+ string id = 1;
17
+ }
18
+
19
+ message GetAccountResponse {
20
+ string id = 1;
21
+ string phone = 2;
22
+ string email = 3;
23
+ bool is_phone_verified = 4;
24
+ bool is_email_verified = 5;
25
+ Role role = 6;
26
+ }
27
+
28
+ message InitEmailChangeRequest {
29
+ string email = 1;
30
+ string user_id = 2;
31
+ }
32
+
33
+ message InitEmailChangeResponse {
34
+ bool ok = 1;
35
+ }
36
+
37
+ message ConfirmEmailChangeRequest {
38
+ string email = 1;
39
+ string code = 2;
40
+ string user_id = 3;
41
+ }
42
+
43
+ message ConfirmEmailChangeResponse {
44
+ bool ok = 1;
45
+ }
46
+
47
+ message InitPhoneChangeRequest {
48
+ string phone = 1;
49
+ string user_id = 2;
50
+ }
51
+
52
+ message InitPhoneChangeResponse {
53
+ bool ok = 1;
54
+ }
55
+
56
+ message ConfirmPhoneChangeRequest {
57
+ string phone = 1;
58
+ string code = 2;
59
+ string user_id = 3;
60
+ }
61
+
62
+ message ConfirmPhoneChangeResponse {
63
+ bool ok = 1;
64
+ }
65
+
66
+ enum Role {
67
+ GUEST = 0;
68
+ USER = 1;
69
+ PREMIUM = 2;
70
+ EDITOR = 3;
71
+ SUPPORT = 4;
72
+ MODERATOR = 5;
73
+ ADMIN = 6;
74
+ SUPERADMIN = 7;
75
+ }
@@ -0,0 +1,91 @@
1
+ syntax = "proto3";
2
+
3
+ package auth.v1;
4
+
5
+ import "google/protobuf/empty.proto";
6
+
7
+ service AuthService {
8
+ rpc SendOtp (SendOtpRequest) returns (SendOtpResponse);
9
+ rpc VerifyOtp (VerifyOtpRequest) returns (VerifyOtpResponse);
10
+ rpc Refresh (RefreshRequest) returns (RefreshResponse);
11
+ rpc Logout (LogoutRequest) returns (LogoutResponse);
12
+
13
+ rpc VkInit (google.protobuf.Empty) returns (VkInitResponse);
14
+ rpc VkVerify (VkVerifyRequest) returns (VkVerifyResponse);
15
+ }
16
+
17
+ message SendOtpRequest {
18
+ string identifier = 1;
19
+ string type = 2;
20
+ }
21
+
22
+ message SendOtpResponse {
23
+ bool ok = 1;
24
+ }
25
+
26
+ message VerifyOtpRequest {
27
+ string identifier = 1;
28
+ string type = 2;
29
+ string code = 3;
30
+ SessionMetadata session_metadata = 4;
31
+ }
32
+
33
+ message VerifyOtpResponse {
34
+ string access_token = 1;
35
+ string refresh_token = 2;
36
+ string session_token = 3;
37
+ }
38
+
39
+ message RefreshRequest {
40
+ string refresh_token = 1;
41
+ string session_token = 2;
42
+ }
43
+
44
+ message RefreshResponse {
45
+ string access_token = 1;
46
+ string refresh_token = 2;
47
+ }
48
+
49
+ message LogoutRequest {
50
+ string session_token = 2;
51
+ }
52
+
53
+ message LogoutResponse {
54
+ bool ok = 1;
55
+ }
56
+
57
+ message VkInitResponse {
58
+ string url = 1;
59
+ }
60
+
61
+ message VkVerifyRequest {
62
+ string code = 1;
63
+ string state = 2;
64
+ string device_id = 3;
65
+ SessionMetadata metadata = 4;
66
+ }
67
+
68
+ message VkVerifyResponse {
69
+ string access_token = 1;
70
+ string refresh_token = 2;
71
+ string session_token = 3;
72
+ }
73
+
74
+ message SessionMetadata {
75
+ LocationInfo location = 1;
76
+ DeviceInfo device = 2;
77
+ string ip = 3;
78
+ }
79
+
80
+ message LocationInfo {
81
+ string country = 1;
82
+ string city = 2;
83
+ int32 latidute = 3;
84
+ int32 longitude = 4;
85
+ }
86
+
87
+ message DeviceInfo {
88
+ string browser = 1;
89
+ string os = 2;
90
+ string type = 3;
91
+ }
@@ -0,0 +1,120 @@
1
+ syntax = "proto3";
2
+
3
+ package media.v1;
4
+
5
+ option go_package = "github.com/barumetric/contracts/gen/go/media;media";
6
+ option java_multiple_files = true;
7
+
8
+ service MediaService {
9
+ // Существующие методы
10
+ rpc Upload (UploadRequest) returns (UploadResponse);
11
+ rpc Get (GetRequest) returns (GetResponse);
12
+ rpc Delete (DeleteRequest) returns (DeleteResponse);
13
+
14
+ // Новые методы для presigned Urls
15
+ rpc GetPresignedUrls (GetPresignedUrlsRequest) returns (GetPresignedUrlsResponse);
16
+ rpc CreateMultipartUpload (CreateMultipartUploadRequest) returns (CreateMultipartUploadResponse);
17
+ rpc GetPresignedPartUrls (GetPresignedPartUrlsRequest) returns (GetPresignedPartUrlsResponse);
18
+ rpc CompleteMultipartUpload (CompleteMultipartUploadRequest) returns (CompleteMultipartUploadResponse);
19
+ }
20
+
21
+ message UploadRequest {
22
+ string file_name = 1;
23
+ string folder = 2;
24
+ string content_type = 3;
25
+ bytes data = 4;
26
+ optional int32 resize_width = 5;
27
+ optional int32 resize_height = 6;
28
+ optional bool watermark = 7;
29
+ }
30
+
31
+ message UploadResponse {
32
+ string key = 1;
33
+ }
34
+
35
+ message GetRequest {
36
+ string key = 1;
37
+ }
38
+
39
+ message GetResponse {
40
+ bytes data = 1;
41
+ string content_type = 2;
42
+ }
43
+
44
+ message DeleteRequest {
45
+ string key = 1;
46
+ }
47
+
48
+ message DeleteResponse {
49
+ bool ok = 1;
50
+ }
51
+
52
+ // === Presigned Urls ===
53
+ message GetPresignedUrlsRequest {
54
+ repeated FileUploadInfo files = 1;
55
+ }
56
+
57
+ message FileUploadInfo {
58
+ string file_name = 1;
59
+ string folder = 2;
60
+ string content_type = 3;
61
+ int64 size = 4; // Размер файла в байтах
62
+ }
63
+
64
+ message GetPresignedUrlsResponse {
65
+ repeated PresignedUrlInfo urls = 1;
66
+ }
67
+
68
+ message PresignedUrlInfo {
69
+ string field = 1; // Идентификатор файла (file0, file1, ...)
70
+ string url = 2; // Presigned Url для загрузки
71
+ string method = 3; // HTTP метод (PUT)
72
+ int64 size_limit = 4; // Максимальный размер в байтах
73
+ string content_type = 5; // Content-Type для загрузки
74
+ }
75
+
76
+ // === Multipart Upload ===
77
+ message CreateMultipartUploadRequest {
78
+ string file_name = 1;
79
+ string folder = 2;
80
+ string content_type = 3;
81
+ }
82
+
83
+ message CreateMultipartUploadResponse {
84
+ string upload_id = 1;
85
+ string key = 2; // S3 key для файла
86
+ }
87
+
88
+ message GetPresignedPartUrlsRequest {
89
+ string upload_id = 1;
90
+ string key = 2;
91
+ int32 part_count = 3; // Количество частей
92
+ string content_type = 4;
93
+ }
94
+
95
+ message GetPresignedPartUrlsResponse {
96
+ repeated PresignedPartUrl parts = 1;
97
+ }
98
+
99
+ message PresignedPartUrl {
100
+ int32 part_number = 1; // Номер части (начинается с 1)
101
+ string url = 2; // Presigned Url для загрузки части
102
+ string method = 3; // HTTP метод (PUT)
103
+ }
104
+
105
+ message CompleteMultipartUploadRequest {
106
+ string upload_id = 1;
107
+ string key = 2;
108
+ repeated CompletedPart parts = 3; // Список загруженных частей с ETag
109
+ }
110
+
111
+ message CompletedPart {
112
+ int32 part_number = 1;
113
+ string etag = 2; // ETag полученный после загрузки части
114
+ }
115
+
116
+ message CompleteMultipartUploadResponse {
117
+ bool ok = 1;
118
+ string key = 2; // Финальный S3 key
119
+ string url = 3; // Публичный Url файла
120
+ }
@@ -0,0 +1,270 @@
1
+ syntax = "proto3";
2
+
3
+ package posts.v1;
4
+
5
+ import "google/protobuf/timestamp.proto";
6
+
7
+ service PostsService {
8
+ // Инициализация и финализация поста
9
+ rpc CreatePostInit (CreatePostInitRequest) returns (CreatePostInitResponse);
10
+ rpc GetPostUploadUrls (GetPostUploadUrlsRequest) returns (GetPostUploadUrlsResponse);
11
+ rpc FinalizePost (FinalizePostRequest) returns (FinalizePostResponse);
12
+
13
+ // CRUD постов
14
+ rpc GetPost (GetPostRequest) returns (GetPostResponse);
15
+ rpc UpdatePost (UpdatePostRequest) returns (UpdatePostResponse);
16
+ rpc DeletePost (DeletePostRequest) returns (DeletePostResponse);
17
+
18
+ // Лента постов
19
+ rpc GetFeed (GetFeedRequest) returns (GetFeedResponse);
20
+ rpc GetUserPosts (GetUserPostsRequest) returns (GetUserPostsResponse);
21
+
22
+ // Лайки
23
+ rpc LikePost (LikePostRequest) returns (LikePostResponse);
24
+ rpc UnlikePost (UnlikePostRequest) returns (UnlikePostResponse);
25
+ rpc GetPostLikes (GetPostLikesRequest) returns (GetPostLikesResponse);
26
+ rpc CheckLike (CheckLikeRequest) returns (CheckLikeResponse);
27
+
28
+ // Просмотры
29
+ rpc TrackView (TrackViewRequest) returns (TrackViewResponse);
30
+ rpc GetPostViews (GetPostViewsRequest) returns (GetPostViewsResponse);
31
+ }
32
+
33
+ // === Инициализация поста ===
34
+ message CreatePostInitRequest {
35
+ string author_id = 1;
36
+ optional string caption = 2;
37
+ repeated FileInfo files = 3; // Метаданные файлов (до 10 элементов)
38
+ }
39
+
40
+ message FileInfo {
41
+ string name = 1;
42
+ int64 size = 2; // Размер в байтах
43
+ string type = 3; // MIME type (image/jpeg, video/mp4, etc.)
44
+ }
45
+
46
+ message CreatePostInitResponse {
47
+ string post_id = 1;
48
+ PostStatus status = 2;
49
+ }
50
+
51
+ // === Получение presigned Urls для загрузки медиа ===
52
+ message GetPostUploadUrlsRequest {
53
+ string post_id = 1;
54
+ string author_id = 2; // Для проверки прав
55
+ }
56
+
57
+ message GetPostUploadUrlsResponse {
58
+ string post_id = 1;
59
+ repeated MediaUploadInfo upload_info = 2;
60
+ }
61
+
62
+ message MediaUploadInfo {
63
+ string media_id = 1;
64
+ MediaType type = 2;
65
+ int32 order = 3;
66
+
67
+ // Для простого PUT загрузки
68
+ optional string presigned_url = 4;
69
+ optional string method = 5; // "PUT"
70
+ optional int64 size_limit = 6;
71
+ optional string content_type = 7;
72
+
73
+ // Для multipart загрузки
74
+ optional string upload_id = 8;
75
+ optional string key = 9; // S3 key
76
+ repeated PresignedPartUrl part_urls = 10;
77
+ }
78
+
79
+ message PresignedPartUrl {
80
+ int32 part_number = 1;
81
+ string url = 2;
82
+ string method = 3; // "PUT"
83
+ }
84
+
85
+ // === Финализация поста ===
86
+ message FinalizePostRequest {
87
+ string post_id = 1;
88
+ string author_id = 2; // Для проверки прав
89
+ repeated MediaFinalizeInfo media = 3; // Информация о загруженных файлах
90
+ }
91
+
92
+ message MediaFinalizeInfo {
93
+ string media_id = 1;
94
+ string media_key = 2; // S3 key после загрузки
95
+ optional string upload_id = 3; // Для multipart upload
96
+ repeated CompletedPart parts = 4; // Для multipart upload
97
+ }
98
+
99
+ message CompletedPart {
100
+ int32 part_number = 1;
101
+ string etag = 2;
102
+ }
103
+
104
+ message FinalizePostResponse {
105
+ Post post = 1;
106
+ }
107
+
108
+ // === Получение поста ===
109
+ message GetPostRequest {
110
+ string post_id = 1;
111
+ optional string user_id = 2; // Для проверки лайка текущего пользователя
112
+ }
113
+
114
+ message GetPostResponse {
115
+ Post post = 1;
116
+ }
117
+
118
+ // === Обновление поста ===
119
+ message UpdatePostRequest {
120
+ string post_id = 1;
121
+ string author_id = 2; // Для проверки прав
122
+ optional string caption = 3;
123
+ }
124
+
125
+ message UpdatePostResponse {
126
+ Post post = 1;
127
+ }
128
+
129
+ // === Удаление поста ===
130
+ message DeletePostRequest {
131
+ string post_id = 1;
132
+ string author_id = 2; // Для проверки прав
133
+ }
134
+
135
+ message DeletePostResponse {
136
+ bool ok = 1;
137
+ }
138
+
139
+ // === Лента постов ===
140
+ message GetFeedRequest {
141
+ string user_id = 1; // Для фильтрации и проверки лайков
142
+ int32 page = 2;
143
+ int32 limit = 3; // Максимум 50
144
+ optional string cursor = 4; // Для пагинации
145
+ }
146
+
147
+ message GetFeedResponse {
148
+ repeated Post posts = 1;
149
+ optional string next_cursor = 2;
150
+ bool has_more = 3;
151
+ }
152
+
153
+ // === Посты пользователя ===
154
+ message GetUserPostsRequest {
155
+ string user_id = 1; // ID пользователя, чьи посты запрашиваем
156
+ string current_user_id = 2; // Для проверки лайков
157
+ int32 page = 3;
158
+ int32 limit = 4;
159
+ optional string cursor = 5;
160
+ }
161
+
162
+ message GetUserPostsResponse {
163
+ repeated Post posts = 1;
164
+ optional string next_cursor = 2;
165
+ bool has_more = 3;
166
+ }
167
+
168
+ // === Лайки ===
169
+ message LikePostRequest {
170
+ string post_id = 1;
171
+ string user_id = 2;
172
+ }
173
+
174
+ message LikePostResponse {
175
+ bool ok = 1;
176
+ int64 likes_count = 2;
177
+ }
178
+
179
+ message UnlikePostRequest {
180
+ string post_id = 1;
181
+ string user_id = 2;
182
+ }
183
+
184
+ message UnlikePostResponse {
185
+ bool ok = 1;
186
+ int64 likes_count = 2;
187
+ }
188
+
189
+ message GetPostLikesRequest {
190
+ string post_id = 1;
191
+ int32 page = 2;
192
+ int32 limit = 3;
193
+ }
194
+
195
+ message GetPostLikesResponse {
196
+ repeated UserLite users = 1; // Из users-service
197
+ int64 total_count = 2;
198
+ }
199
+
200
+ message CheckLikeRequest {
201
+ string post_id = 1;
202
+ string user_id = 2;
203
+ }
204
+
205
+ message CheckLikeResponse {
206
+ bool is_liked = 1;
207
+ }
208
+
209
+ // === Просмотры ===
210
+ message TrackViewRequest {
211
+ string post_id = 1;
212
+ string user_id = 2; // Может быть пустым для анонимных просмотров
213
+ optional string ip = 3;
214
+ }
215
+
216
+ message TrackViewResponse {
217
+ bool ok = 1;
218
+ int64 views_count = 2;
219
+ }
220
+
221
+ message GetPostViewsRequest {
222
+ string post_id = 1;
223
+ }
224
+
225
+ message GetPostViewsResponse {
226
+ int64 views_count = 1;
227
+ }
228
+
229
+ // === Модель поста ===
230
+ message Post {
231
+ string id = 1;
232
+ string author_id = 2;
233
+ optional string caption = 3;
234
+ repeated PostMedia media = 4;
235
+ PostStatus status = 5;
236
+
237
+ // Статистика
238
+ int64 likes_count = 6;
239
+ int64 views_count = 7;
240
+ bool is_liked = 8; // Для текущего пользователя
241
+
242
+ google.protobuf.Timestamp created_at = 9;
243
+ google.protobuf.Timestamp updated_at = 10;
244
+ }
245
+
246
+ message PostMedia {
247
+ string id = 1;
248
+ string media_key = 2; // Ключ из S3
249
+ MediaType type = 3; // PHOTO или VIDEO
250
+ int32 order = 4; // Порядок отображения
251
+ }
252
+
253
+ enum PostStatus {
254
+ POST_STATUS_UNSPECIFIED = 0;
255
+ DRAFT = 1;
256
+ PUBLISHED = 2;
257
+ DELETED = 3;
258
+ }
259
+
260
+ enum MediaType {
261
+ MEDIA_TYPE_UNSPECIFIED = 0;
262
+ PHOTO = 1;
263
+ VIDEO = 2;
264
+ }
265
+
266
+ message UserLite {
267
+ string id = 1;
268
+ optional string name = 2;
269
+ optional string avatar = 3;
270
+ }
@@ -0,0 +1,61 @@
1
+ syntax = "proto3";
2
+
3
+ package session.v1;
4
+
5
+ import "google/protobuf/timestamp.proto";
6
+
7
+ service SessionService {
8
+ rpc ListSessions (ListSessionsRequest) returns (ListSessionsResponse);
9
+ rpc RevokeSession (RevokeSessionRequest) returns (RevokeSessionResponse);
10
+ rpc RevokeAllOtherSessions (RevokeAllOtherSessionsRequest) returns (RevokeAllOtherSessionsResponse);
11
+
12
+ rpc GetSession (GetSessionRequest) returns (GetSessionResponse);
13
+ }
14
+
15
+ message ListSessionsRequest {
16
+ string user_id = 1;
17
+ string session_token = 2;
18
+ }
19
+
20
+ message ListSessionsResponse {
21
+ repeated Session sessions = 1;
22
+ }
23
+
24
+ message GetSessionRequest {
25
+ optional string id = 1;
26
+ string user_id = 2;
27
+ optional string session_token = 3;
28
+ }
29
+
30
+ message GetSessionResponse {
31
+ Session session = 1;
32
+ }
33
+
34
+ message RevokeSessionRequest {
35
+ string id = 1;
36
+ string user_id = 2;
37
+ optional string session_token = 3;
38
+ }
39
+
40
+ message RevokeSessionResponse {
41
+ bool ok = 1;
42
+ }
43
+
44
+ message RevokeAllOtherSessionsRequest {
45
+ string user_id = 1;
46
+ optional string session_token = 2;
47
+ }
48
+
49
+ message RevokeAllOtherSessionsResponse {
50
+ bool ok = 1;
51
+ }
52
+
53
+ message Session {
54
+ string id = 1;
55
+ google.protobuf.Timestamp created_at = 2;
56
+ string country = 3;
57
+ string city = 4;
58
+ string browser = 5;
59
+ string os = 6;
60
+ string ip = 7;
61
+ }
@@ -0,0 +1,105 @@
1
+ syntax = "proto3";
2
+
3
+ package users.v1;
4
+
5
+ import "google/protobuf/timestamp.proto";
6
+
7
+ service UsersService {
8
+ rpc GetMe (GetMeRequest) returns (GetMeResponse);
9
+
10
+ rpc CreateUser (CreateUserRequest) returns (CreateUserResponse);
11
+ rpc PatchUser (PatchUserRequest) returns (PatchUserResponse);
12
+
13
+ rpc GetUsersByIdsLite (GetUsersByIdsLiteRequest) returns (GetUsersByIdsLiteResponse);
14
+ }
15
+
16
+ message GetMeRequest {
17
+ string id = 1;
18
+ }
19
+
20
+ message GetMeResponse {
21
+ User user = 1;
22
+ }
23
+
24
+ message CreateUserRequest {
25
+ string id = 1;
26
+
27
+ optional string name = 2;
28
+ optional string avatar = 3;
29
+ }
30
+
31
+ message CreateUserResponse {
32
+ bool ok = 1;
33
+ }
34
+
35
+ message PatchUserRequest {
36
+ string user_id = 1;
37
+
38
+ // Базовые поля
39
+ optional string name = 2;
40
+ optional string avatar = 3;
41
+
42
+ // Новые поля профиля
43
+ optional string bio = 4;
44
+ optional google.protobuf.Timestamp birth_date = 5;
45
+ optional Gender gender = 6;
46
+
47
+ // Контакты (дополнительные)
48
+ optional string website = 7;
49
+ optional string vk_url = 8;
50
+ optional string telegram_username = 9;
51
+ }
52
+
53
+ message PatchUserResponse {
54
+ bool ok = 1;
55
+ }
56
+
57
+ message GetUsersByIdsLiteRequest {
58
+ repeated string ids = 1;
59
+ }
60
+
61
+ message GetUsersByIdsLiteResponse {
62
+ repeated UserLite users = 1;
63
+ }
64
+
65
+ message UserLite {
66
+ string id = 1;
67
+
68
+ optional string name = 2;
69
+ optional string avatar = 3;
70
+ }
71
+
72
+ message User {
73
+ string id = 1;
74
+
75
+ optional string name = 2;
76
+ optional string phone = 3;
77
+ optional string email = 4;
78
+ optional string avatar = 5;
79
+
80
+ optional string bio = 6;
81
+ optional google.protobuf.Timestamp birth_date = 7;
82
+ optional Gender gender = 8;
83
+
84
+ optional string website = 9;
85
+ optional string vk_url = 10;
86
+ optional string telegram_username = 11;
87
+
88
+ optional bool is_premium = 12;
89
+ optional bool is_banned = 13;
90
+ optional string ban_reason = 14;
91
+ optional google.protobuf.Timestamp banned_until = 15;
92
+
93
+ optional google.protobuf.Timestamp last_active_at = 16;
94
+ optional string registration_source = 17;
95
+
96
+ google.protobuf.Timestamp created_at = 18;
97
+ google.protobuf.Timestamp updated_at = 19;
98
+ }
99
+
100
+ enum Gender {
101
+ UNSPECIFIED = 0;
102
+ MALE = 1;
103
+ FEMALE = 2;
104
+ OTHER = 3;
105
+ }