diff --git a/bff/apollo-gateway/src/app/content/feed/feed.service.ts b/bff/apollo-gateway/src/app/content/feed/feed.service.ts index 5f9f160b..a3a323c1 100644 --- a/bff/apollo-gateway/src/app/content/feed/feed.service.ts +++ b/bff/apollo-gateway/src/app/content/feed/feed.service.ts @@ -9,7 +9,7 @@ import { Feed, FeedInput, } from 'src/graphql/types/graphql'; -import { GetFeedsRequest } from 'src/grpc/content/content_pb'; +import { GetFeedsRequest, GetFeedRequest } from 'src/grpc/content/content_pb'; import { convertTimestampToInt } from '../../../utils/timestamp'; import { GrpcContentClientService } from '../../grpc/grpc-content-client.service'; @@ -98,37 +98,55 @@ export class FeedService { } async getFeed(userId: string, input: FeedInput): Promise { - console.log('getFeed', userId, input); - return new Promise((resolve) => { - resolve({ - apiQueryParam: '', - category: { - createdAt: 0, - id: '', - name: '', - type: 0, - updatedAt: 0, - }, - createdAt: 0, - description: '', - id: '', - myFeedIds: [], - name: '', - platform: { - createdAt: 0, - faviconUrl: '', - id: '', - isEng: false, - name: '', - platformSiteType: 0, - siteUrl: '', - updatedAt: 0, - }, - rssUrl: '', - siteUrl: '', - thumbnailUrl: '', - trendPlatformType: 0, - updatedAt: 0, + const req = new GetFeedRequest(); + req.setUserId(userId); + req.setFeedId(input.id); + + return new Promise((resolve, reject) => { + const client = this.grpcContentClientService.getGrpcContentService(); + client.getFeed(req, (err, res) => { + if (err) { + reject({ + code: err?.code || 500, + message: err?.message || 'something went wrong', + }); + return; + } + + const resFeed = res.toObject().feed; + + const feed: Feed = { + apiQueryParam: resFeed?.apiQueryParam?.value, + category: { + createdAt: convertTimestampToInt(resFeed.category.createdAt), + id: resFeed.category.id, + name: resFeed.category.name, + type: resFeed.category.type, + updatedAt: convertTimestampToInt(resFeed.category.updatedAt), + }, + createdAt: convertTimestampToInt(resFeed.createdAt), + description: resFeed.description, + id: resFeed.id, + myFeedIds: resFeed.myFeedIdsList.map((myFeed) => myFeed), + name: resFeed.name, + platform: { + createdAt: convertTimestampToInt(resFeed.platform.createdAt), + faviconUrl: resFeed.platform.faviconUrl, + id: resFeed.platform.id, + isEng: resFeed.platform.isEng, + name: resFeed.platform.name, + platformSiteType: resFeed.platform.platformSiteType, + siteUrl: resFeed.platform.siteUrl, + updatedAt: convertTimestampToInt(resFeed.platform.updatedAt), + }, + rssUrl: resFeed.rssUrl, + siteUrl: resFeed.siteUrl, + thumbnailUrl: resFeed.thumbnailUrl, + trendPlatformType: resFeed.trendPlatformType, + updatedAt: convertTimestampToInt(resFeed.updatedAt), + }; + + resolve(feed); }); }); } diff --git a/bff/apollo-gateway/src/grpc/content/content_grpc_pb.d.ts b/bff/apollo-gateway/src/grpc/content/content_grpc_pb.d.ts index c290eafd..8bb73c46 100644 --- a/bff/apollo-gateway/src/grpc/content/content_grpc_pb.d.ts +++ b/bff/apollo-gateway/src/grpc/content/content_grpc_pb.d.ts @@ -14,6 +14,7 @@ interface IContentServiceService extends grpc.ServiceDefinition { @@ -52,6 +53,15 @@ interface IContentServiceService_IGetFeeds extends grpc.MethodDefinition; responseDeserialize: grpc.deserialize; } +interface IContentServiceService_IGetFeed extends grpc.MethodDefinition { + path: "/checkpicks.content.v1.ContentService/GetFeed"; + requestStream: false; + responseStream: false; + requestSerialize: grpc.serialize; + requestDeserialize: grpc.deserialize; + responseSerialize: grpc.serialize; + responseDeserialize: grpc.deserialize; +} export const ContentServiceService: IContentServiceService; @@ -60,6 +70,7 @@ export interface IContentServiceServer extends grpc.UntypedServiceImplementation createUploadArticle: grpc.handleUnaryCall; getArticleOGP: grpc.handleUnaryCall; getFeeds: grpc.handleUnaryCall; + getFeed: grpc.handleUnaryCall; } export interface IContentServiceClient { @@ -75,6 +86,9 @@ export interface IContentServiceClient { getFeeds(request: content_content_pb.GetFeedsRequest, callback: (error: grpc.ServiceError | null, response: content_content_pb.GetFeedsResponse) => void): grpc.ClientUnaryCall; getFeeds(request: content_content_pb.GetFeedsRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: content_content_pb.GetFeedsResponse) => void): grpc.ClientUnaryCall; getFeeds(request: content_content_pb.GetFeedsRequest, metadata: grpc.Metadata, options: Partial, callback: (error: grpc.ServiceError | null, response: content_content_pb.GetFeedsResponse) => void): grpc.ClientUnaryCall; + getFeed(request: content_content_pb.GetFeedRequest, callback: (error: grpc.ServiceError | null, response: content_content_pb.GetFeedResponse) => void): grpc.ClientUnaryCall; + getFeed(request: content_content_pb.GetFeedRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: content_content_pb.GetFeedResponse) => void): grpc.ClientUnaryCall; + getFeed(request: content_content_pb.GetFeedRequest, metadata: grpc.Metadata, options: Partial, callback: (error: grpc.ServiceError | null, response: content_content_pb.GetFeedResponse) => void): grpc.ClientUnaryCall; } export class ContentServiceClient extends grpc.Client implements IContentServiceClient { @@ -91,4 +105,7 @@ export class ContentServiceClient extends grpc.Client implements IContentService public getFeeds(request: content_content_pb.GetFeedsRequest, callback: (error: grpc.ServiceError | null, response: content_content_pb.GetFeedsResponse) => void): grpc.ClientUnaryCall; public getFeeds(request: content_content_pb.GetFeedsRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: content_content_pb.GetFeedsResponse) => void): grpc.ClientUnaryCall; public getFeeds(request: content_content_pb.GetFeedsRequest, metadata: grpc.Metadata, options: Partial, callback: (error: grpc.ServiceError | null, response: content_content_pb.GetFeedsResponse) => void): grpc.ClientUnaryCall; + public getFeed(request: content_content_pb.GetFeedRequest, callback: (error: grpc.ServiceError | null, response: content_content_pb.GetFeedResponse) => void): grpc.ClientUnaryCall; + public getFeed(request: content_content_pb.GetFeedRequest, metadata: grpc.Metadata, callback: (error: grpc.ServiceError | null, response: content_content_pb.GetFeedResponse) => void): grpc.ClientUnaryCall; + public getFeed(request: content_content_pb.GetFeedRequest, metadata: grpc.Metadata, options: Partial, callback: (error: grpc.ServiceError | null, response: content_content_pb.GetFeedResponse) => void): grpc.ClientUnaryCall; } diff --git a/bff/apollo-gateway/src/grpc/content/content_grpc_pb.js b/bff/apollo-gateway/src/grpc/content/content_grpc_pb.js index f1f71b3a..747a6940 100644 --- a/bff/apollo-gateway/src/grpc/content/content_grpc_pb.js +++ b/bff/apollo-gateway/src/grpc/content/content_grpc_pb.js @@ -72,6 +72,28 @@ function deserialize_checkpicks_content_v1_GetArticlesResponse(buffer_arg) { return content_content_pb.GetArticlesResponse.deserializeBinary(new Uint8Array(buffer_arg)); } +function serialize_checkpicks_content_v1_GetFeedRequest(arg) { + if (!(arg instanceof content_content_pb.GetFeedRequest)) { + throw new Error('Expected argument of type checkpicks.content.v1.GetFeedRequest'); + } + return Buffer.from(arg.serializeBinary()); +} + +function deserialize_checkpicks_content_v1_GetFeedRequest(buffer_arg) { + return content_content_pb.GetFeedRequest.deserializeBinary(new Uint8Array(buffer_arg)); +} + +function serialize_checkpicks_content_v1_GetFeedResponse(arg) { + if (!(arg instanceof content_content_pb.GetFeedResponse)) { + throw new Error('Expected argument of type checkpicks.content.v1.GetFeedResponse'); + } + return Buffer.from(arg.serializeBinary()); +} + +function deserialize_checkpicks_content_v1_GetFeedResponse(buffer_arg) { + return content_content_pb.GetFeedResponse.deserializeBinary(new Uint8Array(buffer_arg)); +} + function serialize_checkpicks_content_v1_GetFeedsRequest(arg) { if (!(arg instanceof content_content_pb.GetFeedsRequest)) { throw new Error('Expected argument of type checkpicks.content.v1.GetFeedsRequest'); @@ -140,6 +162,17 @@ var ContentServiceService = exports.ContentServiceService = { responseSerialize: serialize_checkpicks_content_v1_GetFeedsResponse, responseDeserialize: deserialize_checkpicks_content_v1_GetFeedsResponse, }, + getFeed: { + path: '/checkpicks.content.v1.ContentService/GetFeed', + requestStream: false, + responseStream: false, + requestType: content_content_pb.GetFeedRequest, + responseType: content_content_pb.GetFeedResponse, + requestSerialize: serialize_checkpicks_content_v1_GetFeedRequest, + requestDeserialize: deserialize_checkpicks_content_v1_GetFeedRequest, + responseSerialize: serialize_checkpicks_content_v1_GetFeedResponse, + responseDeserialize: deserialize_checkpicks_content_v1_GetFeedResponse, + }, }; exports.ContentServiceClient = grpc.makeGenericClientConstructor(ContentServiceService); diff --git a/bff/apollo-gateway/src/grpc/content/content_pb.d.ts b/bff/apollo-gateway/src/grpc/content/content_pb.d.ts index b2456589..476cc15e 100644 --- a/bff/apollo-gateway/src/grpc/content/content_pb.d.ts +++ b/bff/apollo-gateway/src/grpc/content/content_pb.d.ts @@ -261,6 +261,52 @@ export namespace GetFeedsRequest { } } +export class GetFeedResponse extends jspb.Message { + + hasFeed(): boolean; + clearFeed(): void; + getFeed(): Feed | undefined; + setFeed(value?: Feed): GetFeedResponse; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): GetFeedResponse.AsObject; + static toObject(includeInstance: boolean, msg: GetFeedResponse): GetFeedResponse.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; + static serializeBinaryToWriter(message: GetFeedResponse, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): GetFeedResponse; + static deserializeBinaryFromReader(message: GetFeedResponse, reader: jspb.BinaryReader): GetFeedResponse; +} + +export namespace GetFeedResponse { + export type AsObject = { + feed?: Feed.AsObject, + } +} + +export class GetFeedRequest extends jspb.Message { + getFeedId(): string; + setFeedId(value: string): GetFeedRequest; + getUserId(): string; + setUserId(value: string): GetFeedRequest; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): GetFeedRequest.AsObject; + static toObject(includeInstance: boolean, msg: GetFeedRequest): GetFeedRequest.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; + static serializeBinaryToWriter(message: GetFeedRequest, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): GetFeedRequest; + static deserializeBinaryFromReader(message: GetFeedRequest, reader: jspb.BinaryReader): GetFeedRequest; +} + +export namespace GetFeedRequest { + export type AsObject = { + feedId: string, + userId: string, + } +} + export class PageInfo extends jspb.Message { getEndCursor(): string; setEndCursor(value: string): PageInfo; diff --git a/bff/apollo-gateway/src/grpc/content/content_pb.js b/bff/apollo-gateway/src/grpc/content/content_pb.js index e6decae5..11662a77 100644 --- a/bff/apollo-gateway/src/grpc/content/content_pb.js +++ b/bff/apollo-gateway/src/grpc/content/content_pb.js @@ -36,6 +36,8 @@ goog.exportSymbol('proto.checkpicks.content.v1.GetArticleOGPRequest', null, glob goog.exportSymbol('proto.checkpicks.content.v1.GetArticleOGPResponse', null, global); goog.exportSymbol('proto.checkpicks.content.v1.GetArticlesRequest', null, global); goog.exportSymbol('proto.checkpicks.content.v1.GetArticlesResponse', null, global); +goog.exportSymbol('proto.checkpicks.content.v1.GetFeedRequest', null, global); +goog.exportSymbol('proto.checkpicks.content.v1.GetFeedResponse', null, global); goog.exportSymbol('proto.checkpicks.content.v1.GetFeedsRequest', null, global); goog.exportSymbol('proto.checkpicks.content.v1.GetFeedsResponse', null, global); goog.exportSymbol('proto.checkpicks.content.v1.OGP', null, global); @@ -209,6 +211,48 @@ if (goog.DEBUG && !COMPILED) { */ proto.checkpicks.content.v1.GetFeedsRequest.displayName = 'proto.checkpicks.content.v1.GetFeedsRequest'; } +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.checkpicks.content.v1.GetFeedResponse = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.checkpicks.content.v1.GetFeedResponse, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.checkpicks.content.v1.GetFeedResponse.displayName = 'proto.checkpicks.content.v1.GetFeedResponse'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.checkpicks.content.v1.GetFeedRequest = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.checkpicks.content.v1.GetFeedRequest, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.checkpicks.content.v1.GetFeedRequest.displayName = 'proto.checkpicks.content.v1.GetFeedRequest'; +} /** * Generated by JsPbCodeGenerator. * @param {Array=} opt_data Optional initial data array, typically from a @@ -2290,6 +2334,317 @@ proto.checkpicks.content.v1.GetFeedsRequest.prototype.setLimit = function(value) +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.checkpicks.content.v1.GetFeedResponse.prototype.toObject = function(opt_includeInstance) { + return proto.checkpicks.content.v1.GetFeedResponse.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.checkpicks.content.v1.GetFeedResponse} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.checkpicks.content.v1.GetFeedResponse.toObject = function(includeInstance, msg) { + var f, obj = { + feed: (f = msg.getFeed()) && proto.checkpicks.content.v1.Feed.toObject(includeInstance, f) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.checkpicks.content.v1.GetFeedResponse} + */ +proto.checkpicks.content.v1.GetFeedResponse.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.checkpicks.content.v1.GetFeedResponse; + return proto.checkpicks.content.v1.GetFeedResponse.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.checkpicks.content.v1.GetFeedResponse} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.checkpicks.content.v1.GetFeedResponse} + */ +proto.checkpicks.content.v1.GetFeedResponse.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = new proto.checkpicks.content.v1.Feed; + reader.readMessage(value,proto.checkpicks.content.v1.Feed.deserializeBinaryFromReader); + msg.setFeed(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.checkpicks.content.v1.GetFeedResponse.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.checkpicks.content.v1.GetFeedResponse.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.checkpicks.content.v1.GetFeedResponse} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.checkpicks.content.v1.GetFeedResponse.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getFeed(); + if (f != null) { + writer.writeMessage( + 1, + f, + proto.checkpicks.content.v1.Feed.serializeBinaryToWriter + ); + } +}; + + +/** + * optional Feed feed = 1; + * @return {?proto.checkpicks.content.v1.Feed} + */ +proto.checkpicks.content.v1.GetFeedResponse.prototype.getFeed = function() { + return /** @type{?proto.checkpicks.content.v1.Feed} */ ( + jspb.Message.getWrapperField(this, proto.checkpicks.content.v1.Feed, 1)); +}; + + +/** + * @param {?proto.checkpicks.content.v1.Feed|undefined} value + * @return {!proto.checkpicks.content.v1.GetFeedResponse} returns this +*/ +proto.checkpicks.content.v1.GetFeedResponse.prototype.setFeed = function(value) { + return jspb.Message.setWrapperField(this, 1, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.checkpicks.content.v1.GetFeedResponse} returns this + */ +proto.checkpicks.content.v1.GetFeedResponse.prototype.clearFeed = function() { + return this.setFeed(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.checkpicks.content.v1.GetFeedResponse.prototype.hasFeed = function() { + return jspb.Message.getField(this, 1) != null; +}; + + + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.checkpicks.content.v1.GetFeedRequest.prototype.toObject = function(opt_includeInstance) { + return proto.checkpicks.content.v1.GetFeedRequest.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.checkpicks.content.v1.GetFeedRequest} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.checkpicks.content.v1.GetFeedRequest.toObject = function(includeInstance, msg) { + var f, obj = { + feedId: jspb.Message.getFieldWithDefault(msg, 1, ""), + userId: jspb.Message.getFieldWithDefault(msg, 2, "") + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.checkpicks.content.v1.GetFeedRequest} + */ +proto.checkpicks.content.v1.GetFeedRequest.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.checkpicks.content.v1.GetFeedRequest; + return proto.checkpicks.content.v1.GetFeedRequest.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.checkpicks.content.v1.GetFeedRequest} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.checkpicks.content.v1.GetFeedRequest} + */ +proto.checkpicks.content.v1.GetFeedRequest.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {string} */ (reader.readString()); + msg.setFeedId(value); + break; + case 2: + var value = /** @type {string} */ (reader.readString()); + msg.setUserId(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.checkpicks.content.v1.GetFeedRequest.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.checkpicks.content.v1.GetFeedRequest.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.checkpicks.content.v1.GetFeedRequest} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.checkpicks.content.v1.GetFeedRequest.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getFeedId(); + if (f.length > 0) { + writer.writeString( + 1, + f + ); + } + f = message.getUserId(); + if (f.length > 0) { + writer.writeString( + 2, + f + ); + } +}; + + +/** + * optional string feed_id = 1; + * @return {string} + */ +proto.checkpicks.content.v1.GetFeedRequest.prototype.getFeedId = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * @param {string} value + * @return {!proto.checkpicks.content.v1.GetFeedRequest} returns this + */ +proto.checkpicks.content.v1.GetFeedRequest.prototype.setFeedId = function(value) { + return jspb.Message.setProto3StringField(this, 1, value); +}; + + +/** + * optional string user_id = 2; + * @return {string} + */ +proto.checkpicks.content.v1.GetFeedRequest.prototype.getUserId = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +}; + + +/** + * @param {string} value + * @return {!proto.checkpicks.content.v1.GetFeedRequest} returns this + */ +proto.checkpicks.content.v1.GetFeedRequest.prototype.setUserId = function(value) { + return jspb.Message.setProto3StringField(this, 2, value); +}; + + + + + if (jspb.Message.GENERATE_TO_OBJECT) { /** * Creates an object representation of this proto. diff --git a/bff/apollo-gateway/src/proto/content/content.proto b/bff/apollo-gateway/src/proto/content/content.proto index 8905348f..925521f4 100644 --- a/bff/apollo-gateway/src/proto/content/content.proto +++ b/bff/apollo-gateway/src/proto/content/content.proto @@ -15,6 +15,7 @@ service ContentService { rpc GetArticleOGP(GetArticleOGPRequest) returns (GetArticleOGPResponse); rpc GetFeeds(GetFeedsRequest) returns (GetFeedsResponse); + rpc GetFeed(GetFeedRequest) returns (GetFeedResponse); } @@ -70,6 +71,15 @@ message GetFeedsRequest { int64 limit = 6; } +message GetFeedResponse { + Feed feed = 1; +} + +message GetFeedRequest { + string feed_id = 1; + string user_id = 2; +} + message PageInfo { string end_cursor = 1; diff --git a/micro-service/bookmark-service/grpc/content/content.pb.go b/micro-service/bookmark-service/grpc/content/content.pb.go index 616ef59a..fa6021bb 100644 --- a/micro-service/bookmark-service/grpc/content/content.pb.go +++ b/micro-service/bookmark-service/grpc/content/content.pb.go @@ -550,6 +550,108 @@ func (x *GetFeedsRequest) GetLimit() int64 { return 0 } +type GetFeedResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Feed *Feed `protobuf:"bytes,1,opt,name=feed,proto3" json:"feed,omitempty"` +} + +func (x *GetFeedResponse) Reset() { + *x = GetFeedResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_content_content_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetFeedResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetFeedResponse) ProtoMessage() {} + +func (x *GetFeedResponse) ProtoReflect() protoreflect.Message { + mi := &file_content_content_proto_msgTypes[8] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetFeedResponse.ProtoReflect.Descriptor instead. +func (*GetFeedResponse) Descriptor() ([]byte, []int) { + return file_content_content_proto_rawDescGZIP(), []int{8} +} + +func (x *GetFeedResponse) GetFeed() *Feed { + if x != nil { + return x.Feed + } + return nil +} + +type GetFeedRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + FeedId string `protobuf:"bytes,1,opt,name=feed_id,json=feedId,proto3" json:"feed_id,omitempty"` + UserId string `protobuf:"bytes,2,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"` +} + +func (x *GetFeedRequest) Reset() { + *x = GetFeedRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_content_content_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetFeedRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetFeedRequest) ProtoMessage() {} + +func (x *GetFeedRequest) ProtoReflect() protoreflect.Message { + mi := &file_content_content_proto_msgTypes[9] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetFeedRequest.ProtoReflect.Descriptor instead. +func (*GetFeedRequest) Descriptor() ([]byte, []int) { + return file_content_content_proto_rawDescGZIP(), []int{9} +} + +func (x *GetFeedRequest) GetFeedId() string { + if x != nil { + return x.FeedId + } + return "" +} + +func (x *GetFeedRequest) GetUserId() string { + if x != nil { + return x.UserId + } + return "" +} + type PageInfo struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -562,7 +664,7 @@ type PageInfo struct { func (x *PageInfo) Reset() { *x = PageInfo{} if protoimpl.UnsafeEnabled { - mi := &file_content_content_proto_msgTypes[8] + mi := &file_content_content_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -575,7 +677,7 @@ func (x *PageInfo) String() string { func (*PageInfo) ProtoMessage() {} func (x *PageInfo) ProtoReflect() protoreflect.Message { - mi := &file_content_content_proto_msgTypes[8] + mi := &file_content_content_proto_msgTypes[10] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -588,7 +690,7 @@ func (x *PageInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use PageInfo.ProtoReflect.Descriptor instead. func (*PageInfo) Descriptor() ([]byte, []int) { - return file_content_content_proto_rawDescGZIP(), []int{8} + return file_content_content_proto_rawDescGZIP(), []int{10} } func (x *PageInfo) GetEndCursor() string { @@ -629,7 +731,7 @@ type Feed struct { func (x *Feed) Reset() { *x = Feed{} if protoimpl.UnsafeEnabled { - mi := &file_content_content_proto_msgTypes[9] + mi := &file_content_content_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -642,7 +744,7 @@ func (x *Feed) String() string { func (*Feed) ProtoMessage() {} func (x *Feed) ProtoReflect() protoreflect.Message { - mi := &file_content_content_proto_msgTypes[9] + mi := &file_content_content_proto_msgTypes[11] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -655,7 +757,7 @@ func (x *Feed) ProtoReflect() protoreflect.Message { // Deprecated: Use Feed.ProtoReflect.Descriptor instead. func (*Feed) Descriptor() ([]byte, []int) { - return file_content_content_proto_rawDescGZIP(), []int{9} + return file_content_content_proto_rawDescGZIP(), []int{11} } func (x *Feed) GetId() string { @@ -772,7 +874,7 @@ type Category struct { func (x *Category) Reset() { *x = Category{} if protoimpl.UnsafeEnabled { - mi := &file_content_content_proto_msgTypes[10] + mi := &file_content_content_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -785,7 +887,7 @@ func (x *Category) String() string { func (*Category) ProtoMessage() {} func (x *Category) ProtoReflect() protoreflect.Message { - mi := &file_content_content_proto_msgTypes[10] + mi := &file_content_content_proto_msgTypes[12] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -798,7 +900,7 @@ func (x *Category) ProtoReflect() protoreflect.Message { // Deprecated: Use Category.ProtoReflect.Descriptor instead. func (*Category) Descriptor() ([]byte, []int) { - return file_content_content_proto_rawDescGZIP(), []int{10} + return file_content_content_proto_rawDescGZIP(), []int{12} } func (x *Category) GetId() string { @@ -862,7 +964,7 @@ type Platform struct { func (x *Platform) Reset() { *x = Platform{} if protoimpl.UnsafeEnabled { - mi := &file_content_content_proto_msgTypes[11] + mi := &file_content_content_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -875,7 +977,7 @@ func (x *Platform) String() string { func (*Platform) ProtoMessage() {} func (x *Platform) ProtoReflect() protoreflect.Message { - mi := &file_content_content_proto_msgTypes[11] + mi := &file_content_content_proto_msgTypes[13] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -888,7 +990,7 @@ func (x *Platform) ProtoReflect() protoreflect.Message { // Deprecated: Use Platform.ProtoReflect.Descriptor instead. func (*Platform) Descriptor() ([]byte, []int) { - return file_content_content_proto_rawDescGZIP(), []int{11} + return file_content_content_proto_rawDescGZIP(), []int{13} } func (x *Platform) GetId() string { @@ -984,7 +1086,7 @@ type Article struct { func (x *Article) Reset() { *x = Article{} if protoimpl.UnsafeEnabled { - mi := &file_content_content_proto_msgTypes[12] + mi := &file_content_content_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -997,7 +1099,7 @@ func (x *Article) String() string { func (*Article) ProtoMessage() {} func (x *Article) ProtoReflect() protoreflect.Message { - mi := &file_content_content_proto_msgTypes[12] + mi := &file_content_content_proto_msgTypes[14] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1010,7 +1112,7 @@ func (x *Article) ProtoReflect() protoreflect.Message { // Deprecated: Use Article.ProtoReflect.Descriptor instead. func (*Article) Descriptor() ([]byte, []int) { - return file_content_content_proto_rawDescGZIP(), []int{12} + return file_content_content_proto_rawDescGZIP(), []int{14} } func (x *Article) GetId() string { @@ -1165,7 +1267,7 @@ type ArticleEdge struct { func (x *ArticleEdge) Reset() { *x = ArticleEdge{} if protoimpl.UnsafeEnabled { - mi := &file_content_content_proto_msgTypes[13] + mi := &file_content_content_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1178,7 +1280,7 @@ func (x *ArticleEdge) String() string { func (*ArticleEdge) ProtoMessage() {} func (x *ArticleEdge) ProtoReflect() protoreflect.Message { - mi := &file_content_content_proto_msgTypes[13] + mi := &file_content_content_proto_msgTypes[15] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1191,7 +1293,7 @@ func (x *ArticleEdge) ProtoReflect() protoreflect.Message { // Deprecated: Use ArticleEdge.ProtoReflect.Descriptor instead. func (*ArticleEdge) Descriptor() ([]byte, []int) { - return file_content_content_proto_rawDescGZIP(), []int{13} + return file_content_content_proto_rawDescGZIP(), []int{15} } func (x *ArticleEdge) GetArticle() *Article { @@ -1220,7 +1322,7 @@ type FeedEdge struct { func (x *FeedEdge) Reset() { *x = FeedEdge{} if protoimpl.UnsafeEnabled { - mi := &file_content_content_proto_msgTypes[14] + mi := &file_content_content_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1233,7 +1335,7 @@ func (x *FeedEdge) String() string { func (*FeedEdge) ProtoMessage() {} func (x *FeedEdge) ProtoReflect() protoreflect.Message { - mi := &file_content_content_proto_msgTypes[14] + mi := &file_content_content_proto_msgTypes[16] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1246,7 +1348,7 @@ func (x *FeedEdge) ProtoReflect() protoreflect.Message { // Deprecated: Use FeedEdge.ProtoReflect.Descriptor instead. func (*FeedEdge) Descriptor() ([]byte, []int) { - return file_content_content_proto_rawDescGZIP(), []int{14} + return file_content_content_proto_rawDescGZIP(), []int{16} } func (x *FeedEdge) GetFeed() *Feed { @@ -1280,7 +1382,7 @@ type OGP struct { func (x *OGP) Reset() { *x = OGP{} if protoimpl.UnsafeEnabled { - mi := &file_content_content_proto_msgTypes[15] + mi := &file_content_content_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1293,7 +1395,7 @@ func (x *OGP) String() string { func (*OGP) ProtoMessage() {} func (x *OGP) ProtoReflect() protoreflect.Message { - mi := &file_content_content_proto_msgTypes[15] + mi := &file_content_content_proto_msgTypes[17] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1306,7 +1408,7 @@ func (x *OGP) ProtoReflect() protoreflect.Message { // Deprecated: Use OGP.ProtoReflect.Descriptor instead. func (*OGP) Descriptor() ([]byte, []int) { - return file_content_content_proto_rawDescGZIP(), []int{15} + return file_content_content_proto_rawDescGZIP(), []int{17} } func (x *OGP) GetTitle() string { @@ -1455,201 +1557,215 @@ var file_content_content_proto_rawDesc = []byte{ 0x75, 0x65, 0x52, 0x07, 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x22, 0x4d, 0x0a, 0x08, 0x50, 0x61, 0x67, - 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1d, 0x0a, 0x0a, 0x65, 0x6e, 0x64, 0x5f, 0x63, 0x75, 0x72, - 0x73, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x65, 0x6e, 0x64, 0x43, 0x75, - 0x72, 0x73, 0x6f, 0x72, 0x12, 0x22, 0x0a, 0x0d, 0x68, 0x61, 0x73, 0x5f, 0x6e, 0x65, 0x78, 0x74, - 0x5f, 0x70, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x68, 0x61, 0x73, - 0x4e, 0x65, 0x78, 0x74, 0x50, 0x61, 0x67, 0x65, 0x22, 0xe6, 0x04, 0x0a, 0x04, 0x46, 0x65, 0x65, - 0x64, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, - 0x64, 0x12, 0x3b, 0x0a, 0x08, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x69, 0x63, 0x6b, 0x73, - 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x6c, 0x61, 0x74, - 0x66, 0x6f, 0x72, 0x6d, 0x52, 0x08, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x12, 0x3b, - 0x0a, 0x08, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1f, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x69, 0x63, 0x6b, 0x73, 0x2e, 0x63, 0x6f, - 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, - 0x79, 0x52, 0x08, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x12, 0x1e, 0x0a, 0x0b, 0x6d, - 0x79, 0x5f, 0x66, 0x65, 0x65, 0x64, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, - 0x52, 0x09, 0x6d, 0x79, 0x46, 0x65, 0x65, 0x64, 0x49, 0x64, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, - 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x12, 0x17, 0x0a, 0x07, 0x72, 0x73, 0x73, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x07, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x06, 0x72, 0x73, 0x73, 0x55, 0x72, 0x6c, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x69, - 0x74, 0x65, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x69, - 0x74, 0x65, 0x55, 0x72, 0x6c, 0x12, 0x23, 0x0a, 0x0d, 0x74, 0x68, 0x75, 0x6d, 0x62, 0x6e, 0x61, - 0x69, 0x6c, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x74, 0x68, - 0x75, 0x6d, 0x62, 0x6e, 0x61, 0x69, 0x6c, 0x55, 0x72, 0x6c, 0x12, 0x2e, 0x0a, 0x13, 0x74, 0x72, - 0x65, 0x6e, 0x64, 0x5f, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x5f, 0x74, 0x79, 0x70, - 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x74, 0x72, 0x65, 0x6e, 0x64, 0x50, 0x6c, - 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x12, 0x44, 0x0a, 0x0f, 0x61, 0x70, - 0x69, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x18, 0x0b, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, - 0x65, 0x52, 0x0d, 0x61, 0x70, 0x69, 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, 0x61, 0x72, 0x61, 0x6d, - 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x0c, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, - 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x75, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x75, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x64, 0x5f, 0x61, 0x74, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, - 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x41, - 0x74, 0x22, 0xf3, 0x01, 0x0a, 0x08, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x12, 0x0e, - 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, - 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x64, 0x5f, 0x61, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, - 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, - 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, - 0x70, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, - 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x64, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x64, 0x41, 0x74, 0x22, 0xe0, 0x02, 0x0a, 0x08, 0x50, 0x6c, 0x61, 0x74, - 0x66, 0x6f, 0x72, 0x6d, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x69, 0x74, 0x65, - 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x69, 0x74, 0x65, - 0x55, 0x72, 0x6c, 0x12, 0x2c, 0x0a, 0x12, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x5f, - 0x73, 0x69, 0x74, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x10, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x53, 0x69, 0x74, 0x65, 0x54, 0x79, 0x70, - 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x66, 0x61, 0x76, 0x69, 0x63, 0x6f, 0x6e, 0x5f, 0x75, 0x72, 0x6c, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x66, 0x61, 0x76, 0x69, 0x63, 0x6f, 0x6e, 0x55, - 0x72, 0x6c, 0x12, 0x15, 0x0a, 0x06, 0x69, 0x73, 0x5f, 0x65, 0x6e, 0x67, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x05, 0x69, 0x73, 0x45, 0x6e, 0x67, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, + 0x28, 0x03, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x22, 0x42, 0x0a, 0x0f, 0x47, 0x65, 0x74, + 0x46, 0x65, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2f, 0x0a, 0x04, + 0x66, 0x65, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x63, 0x68, 0x65, + 0x63, 0x6b, 0x70, 0x69, 0x63, 0x6b, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, + 0x76, 0x31, 0x2e, 0x46, 0x65, 0x65, 0x64, 0x52, 0x04, 0x66, 0x65, 0x65, 0x64, 0x22, 0x42, 0x0a, + 0x0e, 0x47, 0x65, 0x74, 0x46, 0x65, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x17, 0x0a, 0x07, 0x66, 0x65, 0x65, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x06, 0x66, 0x65, 0x65, 0x64, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, + 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, + 0x64, 0x22, 0x4d, 0x0a, 0x08, 0x50, 0x61, 0x67, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1d, 0x0a, + 0x0a, 0x65, 0x6e, 0x64, 0x5f, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x09, 0x65, 0x6e, 0x64, 0x43, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x12, 0x22, 0x0a, 0x0d, + 0x68, 0x61, 0x73, 0x5f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x0b, 0x68, 0x61, 0x73, 0x4e, 0x65, 0x78, 0x74, 0x50, 0x61, 0x67, 0x65, + 0x22, 0xe6, 0x04, 0x0a, 0x04, 0x46, 0x65, 0x65, 0x64, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x3b, 0x0a, 0x08, 0x70, 0x6c, 0x61, + 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x63, 0x68, + 0x65, 0x63, 0x6b, 0x70, 0x69, 0x63, 0x6b, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, + 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x52, 0x08, 0x70, 0x6c, + 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x12, 0x3b, 0x0a, 0x08, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, + 0x72, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, + 0x70, 0x69, 0x63, 0x6b, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x76, 0x31, + 0x2e, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x52, 0x08, 0x63, 0x61, 0x74, 0x65, 0x67, + 0x6f, 0x72, 0x79, 0x12, 0x1e, 0x0a, 0x0b, 0x6d, 0x79, 0x5f, 0x66, 0x65, 0x65, 0x64, 0x5f, 0x69, + 0x64, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x6d, 0x79, 0x46, 0x65, 0x65, 0x64, + 0x49, 0x64, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x17, 0x0a, 0x07, 0x72, 0x73, 0x73, + 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x73, 0x73, 0x55, + 0x72, 0x6c, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x69, 0x74, 0x65, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x08, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x69, 0x74, 0x65, 0x55, 0x72, 0x6c, 0x12, 0x23, 0x0a, + 0x0d, 0x74, 0x68, 0x75, 0x6d, 0x62, 0x6e, 0x61, 0x69, 0x6c, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x09, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x74, 0x68, 0x75, 0x6d, 0x62, 0x6e, 0x61, 0x69, 0x6c, 0x55, + 0x72, 0x6c, 0x12, 0x2e, 0x0a, 0x13, 0x74, 0x72, 0x65, 0x6e, 0x64, 0x5f, 0x70, 0x6c, 0x61, 0x74, + 0x66, 0x6f, 0x72, 0x6d, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x11, 0x74, 0x72, 0x65, 0x6e, 0x64, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x54, 0x79, + 0x70, 0x65, 0x12, 0x44, 0x0a, 0x0f, 0x61, 0x70, 0x69, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, + 0x70, 0x61, 0x72, 0x61, 0x6d, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0d, 0x61, 0x70, 0x69, 0x51, 0x75, + 0x65, 0x72, 0x79, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, + 0x74, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, + 0x0a, 0x0a, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x0e, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, + 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x41, 0x74, 0x22, 0xf3, 0x01, 0x0a, 0x08, 0x43, 0x61, + 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, + 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x39, + 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, + 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x75, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, - 0x61, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x5f, + 0x61, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, - 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, - 0x39, 0x0a, 0x0a, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x09, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, - 0x09, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x41, 0x74, 0x22, 0xe3, 0x06, 0x0a, 0x07, 0x41, - 0x72, 0x74, 0x69, 0x63, 0x6c, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x3b, 0x0a, 0x08, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, - 0x72, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, - 0x70, 0x69, 0x63, 0x6b, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x76, 0x31, - 0x2e, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x52, 0x08, 0x70, 0x6c, 0x61, 0x74, 0x66, - 0x6f, 0x72, 0x6d, 0x12, 0x31, 0x0a, 0x05, 0x66, 0x65, 0x65, 0x64, 0x73, 0x18, 0x03, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x69, 0x63, 0x6b, 0x73, 0x2e, - 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x46, 0x65, 0x65, 0x64, 0x52, - 0x05, 0x66, 0x65, 0x65, 0x64, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x12, 0x20, 0x0a, 0x0b, - 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1f, - 0x0a, 0x0b, 0x61, 0x72, 0x74, 0x69, 0x63, 0x6c, 0x65, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0a, 0x61, 0x72, 0x74, 0x69, 0x63, 0x6c, 0x65, 0x55, 0x72, 0x6c, 0x12, - 0x3d, 0x0a, 0x0c, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, + 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x41, 0x74, 0x22, + 0xe0, 0x02, 0x0a, 0x08, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x12, 0x0e, 0x0a, 0x02, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x12, 0x19, 0x0a, 0x08, 0x73, 0x69, 0x74, 0x65, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x07, 0x73, 0x69, 0x74, 0x65, 0x55, 0x72, 0x6c, 0x12, 0x2c, 0x0a, 0x12, 0x70, + 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x5f, 0x73, 0x69, 0x74, 0x65, 0x5f, 0x74, 0x79, 0x70, + 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, + 0x6d, 0x53, 0x69, 0x74, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x66, 0x61, 0x76, + 0x69, 0x63, 0x6f, 0x6e, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, + 0x66, 0x61, 0x76, 0x69, 0x63, 0x6f, 0x6e, 0x55, 0x72, 0x6c, 0x12, 0x15, 0x0a, 0x06, 0x69, 0x73, + 0x5f, 0x65, 0x6e, 0x67, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x69, 0x73, 0x45, 0x6e, + 0x67, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, - 0x70, 0x52, 0x0b, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x65, 0x64, 0x41, 0x74, 0x12, 0x3d, - 0x0a, 0x0b, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x08, 0x20, + 0x70, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, + 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x75, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x64, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, + 0x41, 0x74, 0x22, 0xe3, 0x06, 0x0a, 0x07, 0x41, 0x72, 0x74, 0x69, 0x63, 0x6c, 0x65, 0x12, 0x0e, + 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x3b, + 0x0a, 0x08, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1f, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x69, 0x63, 0x6b, 0x73, 0x2e, 0x63, 0x6f, + 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, + 0x6d, 0x52, 0x08, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x12, 0x31, 0x0a, 0x05, 0x66, + 0x65, 0x65, 0x64, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x63, 0x68, 0x65, + 0x63, 0x6b, 0x70, 0x69, 0x63, 0x6b, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, + 0x76, 0x31, 0x2e, 0x46, 0x65, 0x65, 0x64, 0x52, 0x05, 0x66, 0x65, 0x65, 0x64, 0x73, 0x12, 0x14, + 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, + 0x69, 0x74, 0x6c, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x72, 0x74, 0x69, 0x63, 0x6c, + 0x65, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x61, 0x72, 0x74, + 0x69, 0x63, 0x6c, 0x65, 0x55, 0x72, 0x6c, 0x12, 0x3d, 0x0a, 0x0c, 0x70, 0x75, 0x62, 0x6c, 0x69, + 0x73, 0x68, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0b, 0x70, 0x75, 0x62, 0x6c, 0x69, + 0x73, 0x68, 0x65, 0x64, 0x41, 0x74, 0x12, 0x3d, 0x0a, 0x0b, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0a, 0x61, 0x75, 0x74, 0x68, 0x6f, + 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x30, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, - 0x65, 0x52, 0x0a, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x30, 0x0a, - 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, - 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x12, - 0x23, 0x0a, 0x0d, 0x74, 0x68, 0x75, 0x6d, 0x62, 0x6e, 0x61, 0x69, 0x6c, 0x5f, 0x75, 0x72, 0x6c, - 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x74, 0x68, 0x75, 0x6d, 0x62, 0x6e, 0x61, 0x69, - 0x6c, 0x55, 0x72, 0x6c, 0x12, 0x15, 0x0a, 0x06, 0x69, 0x73, 0x5f, 0x65, 0x6e, 0x67, 0x18, 0x0b, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x69, 0x73, 0x45, 0x6e, 0x67, 0x12, 0x1d, 0x0a, 0x0a, 0x69, - 0x73, 0x5f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x09, 0x69, 0x73, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x12, 0x3d, 0x0a, 0x0b, 0x62, 0x6f, - 0x6f, 0x6b, 0x6d, 0x61, 0x72, 0x6b, 0x5f, 0x69, 0x64, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0a, 0x62, - 0x6f, 0x6f, 0x6b, 0x6d, 0x61, 0x72, 0x6b, 0x49, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x69, 0x73, 0x5f, - 0x62, 0x6f, 0x6f, 0x6b, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x64, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x0c, 0x69, 0x73, 0x42, 0x6f, 0x6f, 0x6b, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x64, 0x12, 0x21, - 0x0a, 0x0c, 0x69, 0x73, 0x5f, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x69, 0x6e, 0x67, 0x18, 0x0f, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x69, 0x73, 0x46, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x69, 0x6e, - 0x67, 0x12, 0x3d, 0x0a, 0x1b, 0x66, 0x61, 0x76, 0x6f, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x61, 0x72, - 0x74, 0x69, 0x63, 0x6c, 0x65, 0x5f, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x73, - 0x18, 0x10, 0x20, 0x03, 0x28, 0x09, 0x52, 0x18, 0x66, 0x61, 0x76, 0x6f, 0x72, 0x69, 0x74, 0x65, - 0x41, 0x72, 0x74, 0x69, 0x63, 0x6c, 0x65, 0x46, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x49, 0x64, 0x73, - 0x12, 0x1d, 0x0a, 0x0a, 0x6c, 0x69, 0x6b, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x11, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x6c, 0x69, 0x6b, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, - 0x19, 0x0a, 0x08, 0x69, 0x73, 0x5f, 0x74, 0x72, 0x65, 0x6e, 0x64, 0x18, 0x12, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x07, 0x69, 0x73, 0x54, 0x72, 0x65, 0x6e, 0x64, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x13, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, - 0x5f, 0x61, 0x74, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, - 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, - 0x22, 0x5f, 0x0a, 0x0b, 0x41, 0x72, 0x74, 0x69, 0x63, 0x6c, 0x65, 0x45, 0x64, 0x67, 0x65, 0x12, - 0x38, 0x0a, 0x07, 0x61, 0x72, 0x74, 0x69, 0x63, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1e, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x69, 0x63, 0x6b, 0x73, 0x2e, 0x63, 0x6f, - 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x72, 0x74, 0x69, 0x63, 0x6c, 0x65, - 0x52, 0x07, 0x61, 0x72, 0x74, 0x69, 0x63, 0x6c, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x75, 0x72, - 0x73, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, - 0x72, 0x22, 0x53, 0x0a, 0x08, 0x46, 0x65, 0x65, 0x64, 0x45, 0x64, 0x67, 0x65, 0x12, 0x2f, 0x0a, - 0x04, 0x66, 0x65, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x63, 0x68, + 0x65, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x74, 0x68, 0x75, 0x6d, 0x62, + 0x6e, 0x61, 0x69, 0x6c, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, + 0x74, 0x68, 0x75, 0x6d, 0x62, 0x6e, 0x61, 0x69, 0x6c, 0x55, 0x72, 0x6c, 0x12, 0x15, 0x0a, 0x06, + 0x69, 0x73, 0x5f, 0x65, 0x6e, 0x67, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x69, 0x73, + 0x45, 0x6e, 0x67, 0x12, 0x1d, 0x0a, 0x0a, 0x69, 0x73, 0x5f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, + 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x69, 0x73, 0x50, 0x72, 0x69, 0x76, 0x61, + 0x74, 0x65, 0x12, 0x3d, 0x0a, 0x0b, 0x62, 0x6f, 0x6f, 0x6b, 0x6d, 0x61, 0x72, 0x6b, 0x5f, 0x69, + 0x64, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0a, 0x62, 0x6f, 0x6f, 0x6b, 0x6d, 0x61, 0x72, 0x6b, 0x49, + 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x69, 0x73, 0x5f, 0x62, 0x6f, 0x6f, 0x6b, 0x6d, 0x61, 0x72, 0x6b, + 0x65, 0x64, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x69, 0x73, 0x42, 0x6f, 0x6f, 0x6b, + 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x69, 0x73, 0x5f, 0x66, 0x6f, 0x6c, + 0x6c, 0x6f, 0x77, 0x69, 0x6e, 0x67, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x69, 0x73, + 0x46, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x69, 0x6e, 0x67, 0x12, 0x3d, 0x0a, 0x1b, 0x66, 0x61, 0x76, + 0x6f, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x61, 0x72, 0x74, 0x69, 0x63, 0x6c, 0x65, 0x5f, 0x66, 0x6f, + 0x6c, 0x64, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x10, 0x20, 0x03, 0x28, 0x09, 0x52, 0x18, + 0x66, 0x61, 0x76, 0x6f, 0x72, 0x69, 0x74, 0x65, 0x41, 0x72, 0x74, 0x69, 0x63, 0x6c, 0x65, 0x46, + 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x49, 0x64, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x6c, 0x69, 0x6b, 0x65, + 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x11, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x6c, 0x69, + 0x6b, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x69, 0x73, 0x5f, 0x74, 0x72, + 0x65, 0x6e, 0x64, 0x18, 0x12, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x69, 0x73, 0x54, 0x72, 0x65, + 0x6e, 0x64, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, + 0x18, 0x13, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, + 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x14, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x75, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x22, 0x5f, 0x0a, 0x0b, 0x41, 0x72, 0x74, 0x69, + 0x63, 0x6c, 0x65, 0x45, 0x64, 0x67, 0x65, 0x12, 0x38, 0x0a, 0x07, 0x61, 0x72, 0x74, 0x69, 0x63, + 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, + 0x70, 0x69, 0x63, 0x6b, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x76, 0x31, + 0x2e, 0x41, 0x72, 0x74, 0x69, 0x63, 0x6c, 0x65, 0x52, 0x07, 0x61, 0x72, 0x74, 0x69, 0x63, 0x6c, + 0x65, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x22, 0x53, 0x0a, 0x08, 0x46, 0x65, 0x65, + 0x64, 0x45, 0x64, 0x67, 0x65, 0x12, 0x2f, 0x0a, 0x04, 0x66, 0x65, 0x65, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x69, 0x63, 0x6b, 0x73, + 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x46, 0x65, 0x65, 0x64, + 0x52, 0x04, 0x66, 0x65, 0x65, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x22, 0xfa, + 0x01, 0x0a, 0x03, 0x4f, 0x47, 0x50, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x12, 0x3e, 0x0a, 0x0b, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, + 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1f, 0x0a, 0x0b, + 0x61, 0x72, 0x74, 0x69, 0x63, 0x6c, 0x65, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0a, 0x61, 0x72, 0x74, 0x69, 0x63, 0x6c, 0x65, 0x55, 0x72, 0x6c, 0x12, 0x19, 0x0a, + 0x08, 0x73, 0x69, 0x74, 0x65, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x07, 0x73, 0x69, 0x74, 0x65, 0x55, 0x72, 0x6c, 0x12, 0x1b, 0x0a, 0x09, 0x73, 0x69, 0x74, 0x65, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x69, 0x74, + 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x74, 0x68, 0x75, 0x6d, 0x62, 0x6e, 0x61, + 0x69, 0x6c, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x74, 0x68, + 0x75, 0x6d, 0x62, 0x6e, 0x61, 0x69, 0x6c, 0x55, 0x72, 0x6c, 0x12, 0x1f, 0x0a, 0x0b, 0x66, 0x61, + 0x76, 0x69, 0x63, 0x6f, 0x6e, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0a, 0x66, 0x61, 0x76, 0x69, 0x63, 0x6f, 0x6e, 0x55, 0x72, 0x6c, 0x32, 0x91, 0x04, 0x0a, 0x0e, + 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x64, + 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x41, 0x72, 0x74, 0x69, 0x63, 0x6c, 0x65, 0x73, 0x12, 0x29, 0x2e, + 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x69, 0x63, 0x6b, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, + 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x72, 0x74, 0x69, 0x63, 0x6c, 0x65, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, + 0x70, 0x69, 0x63, 0x6b, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x76, 0x31, + 0x2e, 0x47, 0x65, 0x74, 0x41, 0x72, 0x74, 0x69, 0x63, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x76, 0x0a, 0x13, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, 0x70, + 0x6c, 0x6f, 0x61, 0x64, 0x41, 0x72, 0x74, 0x69, 0x63, 0x6c, 0x65, 0x12, 0x31, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x69, 0x63, 0x6b, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, - 0x2e, 0x76, 0x31, 0x2e, 0x46, 0x65, 0x65, 0x64, 0x52, 0x04, 0x66, 0x65, 0x65, 0x64, 0x12, 0x16, - 0x0a, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, - 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x22, 0xfa, 0x01, 0x0a, 0x03, 0x4f, 0x47, 0x50, 0x12, 0x14, - 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, - 0x69, 0x74, 0x6c, 0x65, 0x12, 0x3e, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x69, - 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x72, 0x74, 0x69, 0x63, 0x6c, 0x65, 0x5f, - 0x75, 0x72, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x61, 0x72, 0x74, 0x69, 0x63, - 0x6c, 0x65, 0x55, 0x72, 0x6c, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x69, 0x74, 0x65, 0x5f, 0x75, 0x72, - 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x69, 0x74, 0x65, 0x55, 0x72, 0x6c, - 0x12, 0x1b, 0x0a, 0x09, 0x73, 0x69, 0x74, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x69, 0x74, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x23, 0x0a, - 0x0d, 0x74, 0x68, 0x75, 0x6d, 0x62, 0x6e, 0x61, 0x69, 0x6c, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x74, 0x68, 0x75, 0x6d, 0x62, 0x6e, 0x61, 0x69, 0x6c, 0x55, - 0x72, 0x6c, 0x12, 0x1f, 0x0a, 0x0b, 0x66, 0x61, 0x76, 0x69, 0x63, 0x6f, 0x6e, 0x5f, 0x75, 0x72, - 0x6c, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x66, 0x61, 0x76, 0x69, 0x63, 0x6f, 0x6e, - 0x55, 0x72, 0x6c, 0x32, 0xb7, 0x03, 0x0a, 0x0e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x64, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x41, 0x72, 0x74, - 0x69, 0x63, 0x6c, 0x65, 0x73, 0x12, 0x29, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x69, 0x63, - 0x6b, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, - 0x74, 0x41, 0x72, 0x74, 0x69, 0x63, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x2a, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x69, 0x63, 0x6b, 0x73, 0x2e, 0x63, 0x6f, - 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x72, 0x74, 0x69, - 0x63, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x76, 0x0a, 0x13, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x41, 0x72, 0x74, 0x69, - 0x63, 0x6c, 0x65, 0x12, 0x31, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x69, 0x63, 0x6b, 0x73, - 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x41, 0x72, 0x74, 0x69, 0x63, 0x6c, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x69, - 0x63, 0x6b, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, 0x72, 0x74, 0x69, 0x63, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6a, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x41, 0x72, 0x74, 0x69, 0x63, - 0x6c, 0x65, 0x4f, 0x47, 0x50, 0x12, 0x2b, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x69, 0x63, - 0x6b, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, - 0x74, 0x41, 0x72, 0x74, 0x69, 0x63, 0x6c, 0x65, 0x4f, 0x47, 0x50, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x69, 0x63, 0x6b, 0x73, 0x2e, - 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x72, - 0x74, 0x69, 0x63, 0x6c, 0x65, 0x4f, 0x47, 0x50, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x5b, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x46, 0x65, 0x65, 0x64, 0x73, 0x12, 0x26, 0x2e, 0x63, - 0x68, 0x65, 0x63, 0x6b, 0x70, 0x69, 0x63, 0x6b, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, - 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x65, 0x65, 0x64, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x69, 0x63, 0x6b, + 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, + 0x41, 0x72, 0x74, 0x69, 0x63, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, + 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x69, 0x63, 0x6b, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x74, + 0x65, 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, 0x72, 0x74, + 0x69, 0x63, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6a, 0x0a, 0x0d, + 0x47, 0x65, 0x74, 0x41, 0x72, 0x74, 0x69, 0x63, 0x6c, 0x65, 0x4f, 0x47, 0x50, 0x12, 0x2b, 0x2e, + 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x69, 0x63, 0x6b, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, + 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x72, 0x74, 0x69, 0x63, 0x6c, 0x65, + 0x4f, 0x47, 0x50, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x63, 0x68, 0x65, + 0x63, 0x6b, 0x70, 0x69, 0x63, 0x6b, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, + 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x72, 0x74, 0x69, 0x63, 0x6c, 0x65, 0x4f, 0x47, 0x50, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5b, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x46, + 0x65, 0x65, 0x64, 0x73, 0x12, 0x26, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x69, 0x63, 0x6b, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, - 0x46, 0x65, 0x65, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x2d, 0x5a, - 0x2b, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x59, 0x75, 0x6b, 0x69, - 0x4f, 0x6e, 0x69, 0x73, 0x68, 0x69, 0x31, 0x31, 0x32, 0x39, 0x2f, 0x74, 0x65, 0x63, 0x68, 0x70, - 0x69, 0x63, 0x6b, 0x73, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x62, 0x06, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x33, + 0x46, 0x65, 0x65, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x63, + 0x68, 0x65, 0x63, 0x6b, 0x70, 0x69, 0x63, 0x6b, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, + 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x65, 0x65, 0x64, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x58, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x46, 0x65, 0x65, 0x64, + 0x12, 0x25, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x69, 0x63, 0x6b, 0x73, 0x2e, 0x63, 0x6f, + 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x65, 0x65, 0x64, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, + 0x69, 0x63, 0x6b, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x2e, + 0x47, 0x65, 0x74, 0x46, 0x65, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, + 0x2d, 0x5a, 0x2b, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x59, 0x75, + 0x6b, 0x69, 0x4f, 0x6e, 0x69, 0x73, 0x68, 0x69, 0x31, 0x31, 0x32, 0x39, 0x2f, 0x74, 0x65, 0x63, + 0x68, 0x70, 0x69, 0x63, 0x6b, 0x73, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x62, 0x06, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -1664,7 +1780,7 @@ func file_content_content_proto_rawDescGZIP() []byte { return file_content_content_proto_rawDescData } -var file_content_content_proto_msgTypes = make([]protoimpl.MessageInfo, 16) +var file_content_content_proto_msgTypes = make([]protoimpl.MessageInfo, 18) var file_content_content_proto_goTypes = []any{ (*GetArticlesRequest)(nil), // 0: checkpicks.content.v1.GetArticlesRequest (*GetArticlesResponse)(nil), // 1: checkpicks.content.v1.GetArticlesResponse @@ -1674,68 +1790,73 @@ var file_content_content_proto_goTypes = []any{ (*GetArticleOGPRequest)(nil), // 5: checkpicks.content.v1.GetArticleOGPRequest (*GetFeedsResponse)(nil), // 6: checkpicks.content.v1.GetFeedsResponse (*GetFeedsRequest)(nil), // 7: checkpicks.content.v1.GetFeedsRequest - (*PageInfo)(nil), // 8: checkpicks.content.v1.PageInfo - (*Feed)(nil), // 9: checkpicks.content.v1.Feed - (*Category)(nil), // 10: checkpicks.content.v1.Category - (*Platform)(nil), // 11: checkpicks.content.v1.Platform - (*Article)(nil), // 12: checkpicks.content.v1.Article - (*ArticleEdge)(nil), // 13: checkpicks.content.v1.ArticleEdge - (*FeedEdge)(nil), // 14: checkpicks.content.v1.FeedEdge - (*OGP)(nil), // 15: checkpicks.content.v1.OGP - (*wrapperspb.StringValue)(nil), // 16: google.protobuf.StringValue - (*wrapperspb.Int64Value)(nil), // 17: google.protobuf.Int64Value - (*timestamppb.Timestamp)(nil), // 18: google.protobuf.Timestamp + (*GetFeedResponse)(nil), // 8: checkpicks.content.v1.GetFeedResponse + (*GetFeedRequest)(nil), // 9: checkpicks.content.v1.GetFeedRequest + (*PageInfo)(nil), // 10: checkpicks.content.v1.PageInfo + (*Feed)(nil), // 11: checkpicks.content.v1.Feed + (*Category)(nil), // 12: checkpicks.content.v1.Category + (*Platform)(nil), // 13: checkpicks.content.v1.Platform + (*Article)(nil), // 14: checkpicks.content.v1.Article + (*ArticleEdge)(nil), // 15: checkpicks.content.v1.ArticleEdge + (*FeedEdge)(nil), // 16: checkpicks.content.v1.FeedEdge + (*OGP)(nil), // 17: checkpicks.content.v1.OGP + (*wrapperspb.StringValue)(nil), // 18: google.protobuf.StringValue + (*wrapperspb.Int64Value)(nil), // 19: google.protobuf.Int64Value + (*timestamppb.Timestamp)(nil), // 20: google.protobuf.Timestamp } var file_content_content_proto_depIdxs = []int32{ - 16, // 0: checkpicks.content.v1.GetArticlesRequest.user_id:type_name -> google.protobuf.StringValue - 17, // 1: checkpicks.content.v1.GetArticlesRequest.language_status:type_name -> google.protobuf.Int64Value - 16, // 2: checkpicks.content.v1.GetArticlesRequest.tag:type_name -> google.protobuf.StringValue - 16, // 3: checkpicks.content.v1.GetArticlesRequest.feed_ids:type_name -> google.protobuf.StringValue - 13, // 4: checkpicks.content.v1.GetArticlesResponse.articlesEdge:type_name -> checkpicks.content.v1.ArticleEdge - 8, // 5: checkpicks.content.v1.GetArticlesResponse.page_info:type_name -> checkpicks.content.v1.PageInfo - 12, // 6: checkpicks.content.v1.CreateArticleResponse.article:type_name -> checkpicks.content.v1.Article - 15, // 7: checkpicks.content.v1.GetArticleOGPResponse.ogp:type_name -> checkpicks.content.v1.OGP - 14, // 8: checkpicks.content.v1.GetFeedsResponse.feed_edge:type_name -> checkpicks.content.v1.FeedEdge - 8, // 9: checkpicks.content.v1.GetFeedsResponse.page_info:type_name -> checkpicks.content.v1.PageInfo - 17, // 10: checkpicks.content.v1.GetFeedsRequest.platform_site_type:type_name -> google.protobuf.Int64Value - 16, // 11: checkpicks.content.v1.GetFeedsRequest.platform_id:type_name -> google.protobuf.StringValue - 16, // 12: checkpicks.content.v1.GetFeedsRequest.keyword:type_name -> google.protobuf.StringValue - 11, // 13: checkpicks.content.v1.Feed.platform:type_name -> checkpicks.content.v1.Platform - 10, // 14: checkpicks.content.v1.Feed.category:type_name -> checkpicks.content.v1.Category - 16, // 15: checkpicks.content.v1.Feed.api_query_param:type_name -> google.protobuf.StringValue - 18, // 16: checkpicks.content.v1.Feed.created_at:type_name -> google.protobuf.Timestamp - 18, // 17: checkpicks.content.v1.Feed.updated_at:type_name -> google.protobuf.Timestamp - 18, // 18: checkpicks.content.v1.Feed.deleted_at:type_name -> google.protobuf.Timestamp - 18, // 19: checkpicks.content.v1.Category.created_at:type_name -> google.protobuf.Timestamp - 18, // 20: checkpicks.content.v1.Category.updated_at:type_name -> google.protobuf.Timestamp - 18, // 21: checkpicks.content.v1.Category.deleted_at:type_name -> google.protobuf.Timestamp - 18, // 22: checkpicks.content.v1.Platform.created_at:type_name -> google.protobuf.Timestamp - 18, // 23: checkpicks.content.v1.Platform.updated_at:type_name -> google.protobuf.Timestamp - 18, // 24: checkpicks.content.v1.Platform.deleted_at:type_name -> google.protobuf.Timestamp - 11, // 25: checkpicks.content.v1.Article.platform:type_name -> checkpicks.content.v1.Platform - 9, // 26: checkpicks.content.v1.Article.feeds:type_name -> checkpicks.content.v1.Feed - 18, // 27: checkpicks.content.v1.Article.published_at:type_name -> google.protobuf.Timestamp - 16, // 28: checkpicks.content.v1.Article.author_name:type_name -> google.protobuf.StringValue - 16, // 29: checkpicks.content.v1.Article.tags:type_name -> google.protobuf.StringValue - 16, // 30: checkpicks.content.v1.Article.bookmark_id:type_name -> google.protobuf.StringValue - 18, // 31: checkpicks.content.v1.Article.created_at:type_name -> google.protobuf.Timestamp - 18, // 32: checkpicks.content.v1.Article.updated_at:type_name -> google.protobuf.Timestamp - 12, // 33: checkpicks.content.v1.ArticleEdge.article:type_name -> checkpicks.content.v1.Article - 9, // 34: checkpicks.content.v1.FeedEdge.feed:type_name -> checkpicks.content.v1.Feed - 16, // 35: checkpicks.content.v1.OGP.description:type_name -> google.protobuf.StringValue - 0, // 36: checkpicks.content.v1.ContentService.GetArticles:input_type -> checkpicks.content.v1.GetArticlesRequest - 3, // 37: checkpicks.content.v1.ContentService.CreateUploadArticle:input_type -> checkpicks.content.v1.CreateUploadArticleRequest - 5, // 38: checkpicks.content.v1.ContentService.GetArticleOGP:input_type -> checkpicks.content.v1.GetArticleOGPRequest - 7, // 39: checkpicks.content.v1.ContentService.GetFeeds:input_type -> checkpicks.content.v1.GetFeedsRequest - 1, // 40: checkpicks.content.v1.ContentService.GetArticles:output_type -> checkpicks.content.v1.GetArticlesResponse - 2, // 41: checkpicks.content.v1.ContentService.CreateUploadArticle:output_type -> checkpicks.content.v1.CreateArticleResponse - 4, // 42: checkpicks.content.v1.ContentService.GetArticleOGP:output_type -> checkpicks.content.v1.GetArticleOGPResponse - 6, // 43: checkpicks.content.v1.ContentService.GetFeeds:output_type -> checkpicks.content.v1.GetFeedsResponse - 40, // [40:44] is the sub-list for method output_type - 36, // [36:40] is the sub-list for method input_type - 36, // [36:36] is the sub-list for extension type_name - 36, // [36:36] is the sub-list for extension extendee - 0, // [0:36] is the sub-list for field type_name + 18, // 0: checkpicks.content.v1.GetArticlesRequest.user_id:type_name -> google.protobuf.StringValue + 19, // 1: checkpicks.content.v1.GetArticlesRequest.language_status:type_name -> google.protobuf.Int64Value + 18, // 2: checkpicks.content.v1.GetArticlesRequest.tag:type_name -> google.protobuf.StringValue + 18, // 3: checkpicks.content.v1.GetArticlesRequest.feed_ids:type_name -> google.protobuf.StringValue + 15, // 4: checkpicks.content.v1.GetArticlesResponse.articlesEdge:type_name -> checkpicks.content.v1.ArticleEdge + 10, // 5: checkpicks.content.v1.GetArticlesResponse.page_info:type_name -> checkpicks.content.v1.PageInfo + 14, // 6: checkpicks.content.v1.CreateArticleResponse.article:type_name -> checkpicks.content.v1.Article + 17, // 7: checkpicks.content.v1.GetArticleOGPResponse.ogp:type_name -> checkpicks.content.v1.OGP + 16, // 8: checkpicks.content.v1.GetFeedsResponse.feed_edge:type_name -> checkpicks.content.v1.FeedEdge + 10, // 9: checkpicks.content.v1.GetFeedsResponse.page_info:type_name -> checkpicks.content.v1.PageInfo + 19, // 10: checkpicks.content.v1.GetFeedsRequest.platform_site_type:type_name -> google.protobuf.Int64Value + 18, // 11: checkpicks.content.v1.GetFeedsRequest.platform_id:type_name -> google.protobuf.StringValue + 18, // 12: checkpicks.content.v1.GetFeedsRequest.keyword:type_name -> google.protobuf.StringValue + 11, // 13: checkpicks.content.v1.GetFeedResponse.feed:type_name -> checkpicks.content.v1.Feed + 13, // 14: checkpicks.content.v1.Feed.platform:type_name -> checkpicks.content.v1.Platform + 12, // 15: checkpicks.content.v1.Feed.category:type_name -> checkpicks.content.v1.Category + 18, // 16: checkpicks.content.v1.Feed.api_query_param:type_name -> google.protobuf.StringValue + 20, // 17: checkpicks.content.v1.Feed.created_at:type_name -> google.protobuf.Timestamp + 20, // 18: checkpicks.content.v1.Feed.updated_at:type_name -> google.protobuf.Timestamp + 20, // 19: checkpicks.content.v1.Feed.deleted_at:type_name -> google.protobuf.Timestamp + 20, // 20: checkpicks.content.v1.Category.created_at:type_name -> google.protobuf.Timestamp + 20, // 21: checkpicks.content.v1.Category.updated_at:type_name -> google.protobuf.Timestamp + 20, // 22: checkpicks.content.v1.Category.deleted_at:type_name -> google.protobuf.Timestamp + 20, // 23: checkpicks.content.v1.Platform.created_at:type_name -> google.protobuf.Timestamp + 20, // 24: checkpicks.content.v1.Platform.updated_at:type_name -> google.protobuf.Timestamp + 20, // 25: checkpicks.content.v1.Platform.deleted_at:type_name -> google.protobuf.Timestamp + 13, // 26: checkpicks.content.v1.Article.platform:type_name -> checkpicks.content.v1.Platform + 11, // 27: checkpicks.content.v1.Article.feeds:type_name -> checkpicks.content.v1.Feed + 20, // 28: checkpicks.content.v1.Article.published_at:type_name -> google.protobuf.Timestamp + 18, // 29: checkpicks.content.v1.Article.author_name:type_name -> google.protobuf.StringValue + 18, // 30: checkpicks.content.v1.Article.tags:type_name -> google.protobuf.StringValue + 18, // 31: checkpicks.content.v1.Article.bookmark_id:type_name -> google.protobuf.StringValue + 20, // 32: checkpicks.content.v1.Article.created_at:type_name -> google.protobuf.Timestamp + 20, // 33: checkpicks.content.v1.Article.updated_at:type_name -> google.protobuf.Timestamp + 14, // 34: checkpicks.content.v1.ArticleEdge.article:type_name -> checkpicks.content.v1.Article + 11, // 35: checkpicks.content.v1.FeedEdge.feed:type_name -> checkpicks.content.v1.Feed + 18, // 36: checkpicks.content.v1.OGP.description:type_name -> google.protobuf.StringValue + 0, // 37: checkpicks.content.v1.ContentService.GetArticles:input_type -> checkpicks.content.v1.GetArticlesRequest + 3, // 38: checkpicks.content.v1.ContentService.CreateUploadArticle:input_type -> checkpicks.content.v1.CreateUploadArticleRequest + 5, // 39: checkpicks.content.v1.ContentService.GetArticleOGP:input_type -> checkpicks.content.v1.GetArticleOGPRequest + 7, // 40: checkpicks.content.v1.ContentService.GetFeeds:input_type -> checkpicks.content.v1.GetFeedsRequest + 9, // 41: checkpicks.content.v1.ContentService.GetFeed:input_type -> checkpicks.content.v1.GetFeedRequest + 1, // 42: checkpicks.content.v1.ContentService.GetArticles:output_type -> checkpicks.content.v1.GetArticlesResponse + 2, // 43: checkpicks.content.v1.ContentService.CreateUploadArticle:output_type -> checkpicks.content.v1.CreateArticleResponse + 4, // 44: checkpicks.content.v1.ContentService.GetArticleOGP:output_type -> checkpicks.content.v1.GetArticleOGPResponse + 6, // 45: checkpicks.content.v1.ContentService.GetFeeds:output_type -> checkpicks.content.v1.GetFeedsResponse + 8, // 46: checkpicks.content.v1.ContentService.GetFeed:output_type -> checkpicks.content.v1.GetFeedResponse + 42, // [42:47] is the sub-list for method output_type + 37, // [37:42] is the sub-list for method input_type + 37, // [37:37] is the sub-list for extension type_name + 37, // [37:37] is the sub-list for extension extendee + 0, // [0:37] is the sub-list for field type_name } func init() { file_content_content_proto_init() } @@ -1841,7 +1962,7 @@ func file_content_content_proto_init() { } } file_content_content_proto_msgTypes[8].Exporter = func(v any, i int) any { - switch v := v.(*PageInfo); i { + switch v := v.(*GetFeedResponse); i { case 0: return &v.state case 1: @@ -1853,7 +1974,7 @@ func file_content_content_proto_init() { } } file_content_content_proto_msgTypes[9].Exporter = func(v any, i int) any { - switch v := v.(*Feed); i { + switch v := v.(*GetFeedRequest); i { case 0: return &v.state case 1: @@ -1865,7 +1986,7 @@ func file_content_content_proto_init() { } } file_content_content_proto_msgTypes[10].Exporter = func(v any, i int) any { - switch v := v.(*Category); i { + switch v := v.(*PageInfo); i { case 0: return &v.state case 1: @@ -1877,7 +1998,7 @@ func file_content_content_proto_init() { } } file_content_content_proto_msgTypes[11].Exporter = func(v any, i int) any { - switch v := v.(*Platform); i { + switch v := v.(*Feed); i { case 0: return &v.state case 1: @@ -1889,7 +2010,7 @@ func file_content_content_proto_init() { } } file_content_content_proto_msgTypes[12].Exporter = func(v any, i int) any { - switch v := v.(*Article); i { + switch v := v.(*Category); i { case 0: return &v.state case 1: @@ -1901,7 +2022,7 @@ func file_content_content_proto_init() { } } file_content_content_proto_msgTypes[13].Exporter = func(v any, i int) any { - switch v := v.(*ArticleEdge); i { + switch v := v.(*Platform); i { case 0: return &v.state case 1: @@ -1913,7 +2034,7 @@ func file_content_content_proto_init() { } } file_content_content_proto_msgTypes[14].Exporter = func(v any, i int) any { - switch v := v.(*FeedEdge); i { + switch v := v.(*Article); i { case 0: return &v.state case 1: @@ -1925,6 +2046,30 @@ func file_content_content_proto_init() { } } file_content_content_proto_msgTypes[15].Exporter = func(v any, i int) any { + switch v := v.(*ArticleEdge); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_content_content_proto_msgTypes[16].Exporter = func(v any, i int) any { + switch v := v.(*FeedEdge); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_content_content_proto_msgTypes[17].Exporter = func(v any, i int) any { switch v := v.(*OGP); i { case 0: return &v.state @@ -1943,7 +2088,7 @@ func file_content_content_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_content_content_proto_rawDesc, NumEnums: 0, - NumMessages: 16, + NumMessages: 18, NumExtensions: 0, NumServices: 1, }, diff --git a/micro-service/bookmark-service/grpc/content/content_grpc.pb.go b/micro-service/bookmark-service/grpc/content/content_grpc.pb.go index d6c3acbf..2ee8c359 100644 --- a/micro-service/bookmark-service/grpc/content/content_grpc.pb.go +++ b/micro-service/bookmark-service/grpc/content/content_grpc.pb.go @@ -23,6 +23,7 @@ const ( ContentService_CreateUploadArticle_FullMethodName = "/checkpicks.content.v1.ContentService/CreateUploadArticle" ContentService_GetArticleOGP_FullMethodName = "/checkpicks.content.v1.ContentService/GetArticleOGP" ContentService_GetFeeds_FullMethodName = "/checkpicks.content.v1.ContentService/GetFeeds" + ContentService_GetFeed_FullMethodName = "/checkpicks.content.v1.ContentService/GetFeed" ) // ContentServiceClient is the client API for ContentService service. @@ -33,6 +34,7 @@ type ContentServiceClient interface { CreateUploadArticle(ctx context.Context, in *CreateUploadArticleRequest, opts ...grpc.CallOption) (*CreateArticleResponse, error) GetArticleOGP(ctx context.Context, in *GetArticleOGPRequest, opts ...grpc.CallOption) (*GetArticleOGPResponse, error) GetFeeds(ctx context.Context, in *GetFeedsRequest, opts ...grpc.CallOption) (*GetFeedsResponse, error) + GetFeed(ctx context.Context, in *GetFeedRequest, opts ...grpc.CallOption) (*GetFeedResponse, error) } type contentServiceClient struct { @@ -83,6 +85,16 @@ func (c *contentServiceClient) GetFeeds(ctx context.Context, in *GetFeedsRequest return out, nil } +func (c *contentServiceClient) GetFeed(ctx context.Context, in *GetFeedRequest, opts ...grpc.CallOption) (*GetFeedResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(GetFeedResponse) + err := c.cc.Invoke(ctx, ContentService_GetFeed_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + // ContentServiceServer is the server API for ContentService service. // All implementations should embed UnimplementedContentServiceServer // for forward compatibility. @@ -91,6 +103,7 @@ type ContentServiceServer interface { CreateUploadArticle(context.Context, *CreateUploadArticleRequest) (*CreateArticleResponse, error) GetArticleOGP(context.Context, *GetArticleOGPRequest) (*GetArticleOGPResponse, error) GetFeeds(context.Context, *GetFeedsRequest) (*GetFeedsResponse, error) + GetFeed(context.Context, *GetFeedRequest) (*GetFeedResponse, error) } // UnimplementedContentServiceServer should be embedded to have @@ -112,6 +125,9 @@ func (UnimplementedContentServiceServer) GetArticleOGP(context.Context, *GetArti func (UnimplementedContentServiceServer) GetFeeds(context.Context, *GetFeedsRequest) (*GetFeedsResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method GetFeeds not implemented") } +func (UnimplementedContentServiceServer) GetFeed(context.Context, *GetFeedRequest) (*GetFeedResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetFeed not implemented") +} func (UnimplementedContentServiceServer) testEmbeddedByValue() {} // UnsafeContentServiceServer may be embedded to opt out of forward compatibility for this service. @@ -204,6 +220,24 @@ func _ContentService_GetFeeds_Handler(srv interface{}, ctx context.Context, dec return interceptor(ctx, in, info, handler) } +func _ContentService_GetFeed_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetFeedRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ContentServiceServer).GetFeed(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: ContentService_GetFeed_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ContentServiceServer).GetFeed(ctx, req.(*GetFeedRequest)) + } + return interceptor(ctx, in, info, handler) +} + // ContentService_ServiceDesc is the grpc.ServiceDesc for ContentService service. // It's only intended for direct use with grpc.RegisterService, // and not to be introspected or modified (even as a copy) @@ -227,6 +261,10 @@ var ContentService_ServiceDesc = grpc.ServiceDesc{ MethodName: "GetFeeds", Handler: _ContentService_GetFeeds_Handler, }, + { + MethodName: "GetFeed", + Handler: _ContentService_GetFeed_Handler, + }, }, Streams: []grpc.StreamDesc{}, Metadata: "content/content.proto", diff --git a/micro-service/bookmark-service/internal/util/testutil/mock/content_service.go b/micro-service/bookmark-service/internal/util/testutil/mock/content_service.go index 1c1f5479..41da4cec 100644 --- a/micro-service/bookmark-service/internal/util/testutil/mock/content_service.go +++ b/micro-service/bookmark-service/internal/util/testutil/mock/content_service.go @@ -96,6 +96,26 @@ func (mr *MockContentServiceClientMockRecorder) GetArticles(ctx, in interface{}, return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetArticles", reflect.TypeOf((*MockContentServiceClient)(nil).GetArticles), varargs...) } +// GetFeed mocks base method. +func (m *MockContentServiceClient) GetFeed(ctx context.Context, in *content.GetFeedRequest, opts ...grpc.CallOption) (*content.GetFeedResponse, error) { + m.ctrl.T.Helper() + varargs := []interface{}{ctx, in} + for _, a := range opts { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "GetFeed", varargs...) + ret0, _ := ret[0].(*content.GetFeedResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetFeed indicates an expected call of GetFeed. +func (mr *MockContentServiceClientMockRecorder) GetFeed(ctx, in interface{}, opts ...interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]interface{}{ctx, in}, opts...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetFeed", reflect.TypeOf((*MockContentServiceClient)(nil).GetFeed), varargs...) +} + // GetFeeds mocks base method. func (m *MockContentServiceClient) GetFeeds(ctx context.Context, in *content.GetFeedsRequest, opts ...grpc.CallOption) (*content.GetFeedsResponse, error) { m.ctrl.T.Helper() @@ -184,6 +204,21 @@ func (mr *MockContentServiceServerMockRecorder) GetArticles(arg0, arg1 interface return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetArticles", reflect.TypeOf((*MockContentServiceServer)(nil).GetArticles), arg0, arg1) } +// GetFeed mocks base method. +func (m *MockContentServiceServer) GetFeed(arg0 context.Context, arg1 *content.GetFeedRequest) (*content.GetFeedResponse, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetFeed", arg0, arg1) + ret0, _ := ret[0].(*content.GetFeedResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetFeed indicates an expected call of GetFeed. +func (mr *MockContentServiceServerMockRecorder) GetFeed(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetFeed", reflect.TypeOf((*MockContentServiceServer)(nil).GetFeed), arg0, arg1) +} + // GetFeeds mocks base method. func (m *MockContentServiceServer) GetFeeds(arg0 context.Context, arg1 *content.GetFeedsRequest) (*content.GetFeedsResponse, error) { m.ctrl.T.Helper() diff --git a/micro-service/content-service/grpc/content/content.pb.go b/micro-service/content-service/grpc/content/content.pb.go index 616ef59a..fa6021bb 100644 --- a/micro-service/content-service/grpc/content/content.pb.go +++ b/micro-service/content-service/grpc/content/content.pb.go @@ -550,6 +550,108 @@ func (x *GetFeedsRequest) GetLimit() int64 { return 0 } +type GetFeedResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Feed *Feed `protobuf:"bytes,1,opt,name=feed,proto3" json:"feed,omitempty"` +} + +func (x *GetFeedResponse) Reset() { + *x = GetFeedResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_content_content_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetFeedResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetFeedResponse) ProtoMessage() {} + +func (x *GetFeedResponse) ProtoReflect() protoreflect.Message { + mi := &file_content_content_proto_msgTypes[8] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetFeedResponse.ProtoReflect.Descriptor instead. +func (*GetFeedResponse) Descriptor() ([]byte, []int) { + return file_content_content_proto_rawDescGZIP(), []int{8} +} + +func (x *GetFeedResponse) GetFeed() *Feed { + if x != nil { + return x.Feed + } + return nil +} + +type GetFeedRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + FeedId string `protobuf:"bytes,1,opt,name=feed_id,json=feedId,proto3" json:"feed_id,omitempty"` + UserId string `protobuf:"bytes,2,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"` +} + +func (x *GetFeedRequest) Reset() { + *x = GetFeedRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_content_content_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetFeedRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetFeedRequest) ProtoMessage() {} + +func (x *GetFeedRequest) ProtoReflect() protoreflect.Message { + mi := &file_content_content_proto_msgTypes[9] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetFeedRequest.ProtoReflect.Descriptor instead. +func (*GetFeedRequest) Descriptor() ([]byte, []int) { + return file_content_content_proto_rawDescGZIP(), []int{9} +} + +func (x *GetFeedRequest) GetFeedId() string { + if x != nil { + return x.FeedId + } + return "" +} + +func (x *GetFeedRequest) GetUserId() string { + if x != nil { + return x.UserId + } + return "" +} + type PageInfo struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -562,7 +664,7 @@ type PageInfo struct { func (x *PageInfo) Reset() { *x = PageInfo{} if protoimpl.UnsafeEnabled { - mi := &file_content_content_proto_msgTypes[8] + mi := &file_content_content_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -575,7 +677,7 @@ func (x *PageInfo) String() string { func (*PageInfo) ProtoMessage() {} func (x *PageInfo) ProtoReflect() protoreflect.Message { - mi := &file_content_content_proto_msgTypes[8] + mi := &file_content_content_proto_msgTypes[10] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -588,7 +690,7 @@ func (x *PageInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use PageInfo.ProtoReflect.Descriptor instead. func (*PageInfo) Descriptor() ([]byte, []int) { - return file_content_content_proto_rawDescGZIP(), []int{8} + return file_content_content_proto_rawDescGZIP(), []int{10} } func (x *PageInfo) GetEndCursor() string { @@ -629,7 +731,7 @@ type Feed struct { func (x *Feed) Reset() { *x = Feed{} if protoimpl.UnsafeEnabled { - mi := &file_content_content_proto_msgTypes[9] + mi := &file_content_content_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -642,7 +744,7 @@ func (x *Feed) String() string { func (*Feed) ProtoMessage() {} func (x *Feed) ProtoReflect() protoreflect.Message { - mi := &file_content_content_proto_msgTypes[9] + mi := &file_content_content_proto_msgTypes[11] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -655,7 +757,7 @@ func (x *Feed) ProtoReflect() protoreflect.Message { // Deprecated: Use Feed.ProtoReflect.Descriptor instead. func (*Feed) Descriptor() ([]byte, []int) { - return file_content_content_proto_rawDescGZIP(), []int{9} + return file_content_content_proto_rawDescGZIP(), []int{11} } func (x *Feed) GetId() string { @@ -772,7 +874,7 @@ type Category struct { func (x *Category) Reset() { *x = Category{} if protoimpl.UnsafeEnabled { - mi := &file_content_content_proto_msgTypes[10] + mi := &file_content_content_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -785,7 +887,7 @@ func (x *Category) String() string { func (*Category) ProtoMessage() {} func (x *Category) ProtoReflect() protoreflect.Message { - mi := &file_content_content_proto_msgTypes[10] + mi := &file_content_content_proto_msgTypes[12] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -798,7 +900,7 @@ func (x *Category) ProtoReflect() protoreflect.Message { // Deprecated: Use Category.ProtoReflect.Descriptor instead. func (*Category) Descriptor() ([]byte, []int) { - return file_content_content_proto_rawDescGZIP(), []int{10} + return file_content_content_proto_rawDescGZIP(), []int{12} } func (x *Category) GetId() string { @@ -862,7 +964,7 @@ type Platform struct { func (x *Platform) Reset() { *x = Platform{} if protoimpl.UnsafeEnabled { - mi := &file_content_content_proto_msgTypes[11] + mi := &file_content_content_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -875,7 +977,7 @@ func (x *Platform) String() string { func (*Platform) ProtoMessage() {} func (x *Platform) ProtoReflect() protoreflect.Message { - mi := &file_content_content_proto_msgTypes[11] + mi := &file_content_content_proto_msgTypes[13] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -888,7 +990,7 @@ func (x *Platform) ProtoReflect() protoreflect.Message { // Deprecated: Use Platform.ProtoReflect.Descriptor instead. func (*Platform) Descriptor() ([]byte, []int) { - return file_content_content_proto_rawDescGZIP(), []int{11} + return file_content_content_proto_rawDescGZIP(), []int{13} } func (x *Platform) GetId() string { @@ -984,7 +1086,7 @@ type Article struct { func (x *Article) Reset() { *x = Article{} if protoimpl.UnsafeEnabled { - mi := &file_content_content_proto_msgTypes[12] + mi := &file_content_content_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -997,7 +1099,7 @@ func (x *Article) String() string { func (*Article) ProtoMessage() {} func (x *Article) ProtoReflect() protoreflect.Message { - mi := &file_content_content_proto_msgTypes[12] + mi := &file_content_content_proto_msgTypes[14] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1010,7 +1112,7 @@ func (x *Article) ProtoReflect() protoreflect.Message { // Deprecated: Use Article.ProtoReflect.Descriptor instead. func (*Article) Descriptor() ([]byte, []int) { - return file_content_content_proto_rawDescGZIP(), []int{12} + return file_content_content_proto_rawDescGZIP(), []int{14} } func (x *Article) GetId() string { @@ -1165,7 +1267,7 @@ type ArticleEdge struct { func (x *ArticleEdge) Reset() { *x = ArticleEdge{} if protoimpl.UnsafeEnabled { - mi := &file_content_content_proto_msgTypes[13] + mi := &file_content_content_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1178,7 +1280,7 @@ func (x *ArticleEdge) String() string { func (*ArticleEdge) ProtoMessage() {} func (x *ArticleEdge) ProtoReflect() protoreflect.Message { - mi := &file_content_content_proto_msgTypes[13] + mi := &file_content_content_proto_msgTypes[15] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1191,7 +1293,7 @@ func (x *ArticleEdge) ProtoReflect() protoreflect.Message { // Deprecated: Use ArticleEdge.ProtoReflect.Descriptor instead. func (*ArticleEdge) Descriptor() ([]byte, []int) { - return file_content_content_proto_rawDescGZIP(), []int{13} + return file_content_content_proto_rawDescGZIP(), []int{15} } func (x *ArticleEdge) GetArticle() *Article { @@ -1220,7 +1322,7 @@ type FeedEdge struct { func (x *FeedEdge) Reset() { *x = FeedEdge{} if protoimpl.UnsafeEnabled { - mi := &file_content_content_proto_msgTypes[14] + mi := &file_content_content_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1233,7 +1335,7 @@ func (x *FeedEdge) String() string { func (*FeedEdge) ProtoMessage() {} func (x *FeedEdge) ProtoReflect() protoreflect.Message { - mi := &file_content_content_proto_msgTypes[14] + mi := &file_content_content_proto_msgTypes[16] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1246,7 +1348,7 @@ func (x *FeedEdge) ProtoReflect() protoreflect.Message { // Deprecated: Use FeedEdge.ProtoReflect.Descriptor instead. func (*FeedEdge) Descriptor() ([]byte, []int) { - return file_content_content_proto_rawDescGZIP(), []int{14} + return file_content_content_proto_rawDescGZIP(), []int{16} } func (x *FeedEdge) GetFeed() *Feed { @@ -1280,7 +1382,7 @@ type OGP struct { func (x *OGP) Reset() { *x = OGP{} if protoimpl.UnsafeEnabled { - mi := &file_content_content_proto_msgTypes[15] + mi := &file_content_content_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1293,7 +1395,7 @@ func (x *OGP) String() string { func (*OGP) ProtoMessage() {} func (x *OGP) ProtoReflect() protoreflect.Message { - mi := &file_content_content_proto_msgTypes[15] + mi := &file_content_content_proto_msgTypes[17] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1306,7 +1408,7 @@ func (x *OGP) ProtoReflect() protoreflect.Message { // Deprecated: Use OGP.ProtoReflect.Descriptor instead. func (*OGP) Descriptor() ([]byte, []int) { - return file_content_content_proto_rawDescGZIP(), []int{15} + return file_content_content_proto_rawDescGZIP(), []int{17} } func (x *OGP) GetTitle() string { @@ -1455,201 +1557,215 @@ var file_content_content_proto_rawDesc = []byte{ 0x75, 0x65, 0x52, 0x07, 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x22, 0x4d, 0x0a, 0x08, 0x50, 0x61, 0x67, - 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1d, 0x0a, 0x0a, 0x65, 0x6e, 0x64, 0x5f, 0x63, 0x75, 0x72, - 0x73, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x65, 0x6e, 0x64, 0x43, 0x75, - 0x72, 0x73, 0x6f, 0x72, 0x12, 0x22, 0x0a, 0x0d, 0x68, 0x61, 0x73, 0x5f, 0x6e, 0x65, 0x78, 0x74, - 0x5f, 0x70, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x68, 0x61, 0x73, - 0x4e, 0x65, 0x78, 0x74, 0x50, 0x61, 0x67, 0x65, 0x22, 0xe6, 0x04, 0x0a, 0x04, 0x46, 0x65, 0x65, - 0x64, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, - 0x64, 0x12, 0x3b, 0x0a, 0x08, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x69, 0x63, 0x6b, 0x73, - 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x6c, 0x61, 0x74, - 0x66, 0x6f, 0x72, 0x6d, 0x52, 0x08, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x12, 0x3b, - 0x0a, 0x08, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1f, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x69, 0x63, 0x6b, 0x73, 0x2e, 0x63, 0x6f, - 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, - 0x79, 0x52, 0x08, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x12, 0x1e, 0x0a, 0x0b, 0x6d, - 0x79, 0x5f, 0x66, 0x65, 0x65, 0x64, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, - 0x52, 0x09, 0x6d, 0x79, 0x46, 0x65, 0x65, 0x64, 0x49, 0x64, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, - 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x12, 0x17, 0x0a, 0x07, 0x72, 0x73, 0x73, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x07, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x06, 0x72, 0x73, 0x73, 0x55, 0x72, 0x6c, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x69, - 0x74, 0x65, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x69, - 0x74, 0x65, 0x55, 0x72, 0x6c, 0x12, 0x23, 0x0a, 0x0d, 0x74, 0x68, 0x75, 0x6d, 0x62, 0x6e, 0x61, - 0x69, 0x6c, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x74, 0x68, - 0x75, 0x6d, 0x62, 0x6e, 0x61, 0x69, 0x6c, 0x55, 0x72, 0x6c, 0x12, 0x2e, 0x0a, 0x13, 0x74, 0x72, - 0x65, 0x6e, 0x64, 0x5f, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x5f, 0x74, 0x79, 0x70, - 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x74, 0x72, 0x65, 0x6e, 0x64, 0x50, 0x6c, - 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x12, 0x44, 0x0a, 0x0f, 0x61, 0x70, - 0x69, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x18, 0x0b, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, - 0x65, 0x52, 0x0d, 0x61, 0x70, 0x69, 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, 0x61, 0x72, 0x61, 0x6d, - 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x0c, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, - 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x75, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x75, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x64, 0x5f, 0x61, 0x74, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, - 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x41, - 0x74, 0x22, 0xf3, 0x01, 0x0a, 0x08, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x12, 0x0e, - 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, - 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x64, 0x5f, 0x61, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, - 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, - 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, - 0x70, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, - 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x64, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x64, 0x41, 0x74, 0x22, 0xe0, 0x02, 0x0a, 0x08, 0x50, 0x6c, 0x61, 0x74, - 0x66, 0x6f, 0x72, 0x6d, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x69, 0x74, 0x65, - 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x69, 0x74, 0x65, - 0x55, 0x72, 0x6c, 0x12, 0x2c, 0x0a, 0x12, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x5f, - 0x73, 0x69, 0x74, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x10, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x53, 0x69, 0x74, 0x65, 0x54, 0x79, 0x70, - 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x66, 0x61, 0x76, 0x69, 0x63, 0x6f, 0x6e, 0x5f, 0x75, 0x72, 0x6c, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x66, 0x61, 0x76, 0x69, 0x63, 0x6f, 0x6e, 0x55, - 0x72, 0x6c, 0x12, 0x15, 0x0a, 0x06, 0x69, 0x73, 0x5f, 0x65, 0x6e, 0x67, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x05, 0x69, 0x73, 0x45, 0x6e, 0x67, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, + 0x28, 0x03, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x22, 0x42, 0x0a, 0x0f, 0x47, 0x65, 0x74, + 0x46, 0x65, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2f, 0x0a, 0x04, + 0x66, 0x65, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x63, 0x68, 0x65, + 0x63, 0x6b, 0x70, 0x69, 0x63, 0x6b, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, + 0x76, 0x31, 0x2e, 0x46, 0x65, 0x65, 0x64, 0x52, 0x04, 0x66, 0x65, 0x65, 0x64, 0x22, 0x42, 0x0a, + 0x0e, 0x47, 0x65, 0x74, 0x46, 0x65, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x17, 0x0a, 0x07, 0x66, 0x65, 0x65, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x06, 0x66, 0x65, 0x65, 0x64, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, + 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, + 0x64, 0x22, 0x4d, 0x0a, 0x08, 0x50, 0x61, 0x67, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1d, 0x0a, + 0x0a, 0x65, 0x6e, 0x64, 0x5f, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x09, 0x65, 0x6e, 0x64, 0x43, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x12, 0x22, 0x0a, 0x0d, + 0x68, 0x61, 0x73, 0x5f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x0b, 0x68, 0x61, 0x73, 0x4e, 0x65, 0x78, 0x74, 0x50, 0x61, 0x67, 0x65, + 0x22, 0xe6, 0x04, 0x0a, 0x04, 0x46, 0x65, 0x65, 0x64, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x3b, 0x0a, 0x08, 0x70, 0x6c, 0x61, + 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x63, 0x68, + 0x65, 0x63, 0x6b, 0x70, 0x69, 0x63, 0x6b, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, + 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x52, 0x08, 0x70, 0x6c, + 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x12, 0x3b, 0x0a, 0x08, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, + 0x72, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, + 0x70, 0x69, 0x63, 0x6b, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x76, 0x31, + 0x2e, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x52, 0x08, 0x63, 0x61, 0x74, 0x65, 0x67, + 0x6f, 0x72, 0x79, 0x12, 0x1e, 0x0a, 0x0b, 0x6d, 0x79, 0x5f, 0x66, 0x65, 0x65, 0x64, 0x5f, 0x69, + 0x64, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x6d, 0x79, 0x46, 0x65, 0x65, 0x64, + 0x49, 0x64, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x17, 0x0a, 0x07, 0x72, 0x73, 0x73, + 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x73, 0x73, 0x55, + 0x72, 0x6c, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x69, 0x74, 0x65, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x08, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x69, 0x74, 0x65, 0x55, 0x72, 0x6c, 0x12, 0x23, 0x0a, + 0x0d, 0x74, 0x68, 0x75, 0x6d, 0x62, 0x6e, 0x61, 0x69, 0x6c, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x09, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x74, 0x68, 0x75, 0x6d, 0x62, 0x6e, 0x61, 0x69, 0x6c, 0x55, + 0x72, 0x6c, 0x12, 0x2e, 0x0a, 0x13, 0x74, 0x72, 0x65, 0x6e, 0x64, 0x5f, 0x70, 0x6c, 0x61, 0x74, + 0x66, 0x6f, 0x72, 0x6d, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x11, 0x74, 0x72, 0x65, 0x6e, 0x64, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x54, 0x79, + 0x70, 0x65, 0x12, 0x44, 0x0a, 0x0f, 0x61, 0x70, 0x69, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, + 0x70, 0x61, 0x72, 0x61, 0x6d, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0d, 0x61, 0x70, 0x69, 0x51, 0x75, + 0x65, 0x72, 0x79, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, + 0x74, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, + 0x0a, 0x0a, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x0e, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, + 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x41, 0x74, 0x22, 0xf3, 0x01, 0x0a, 0x08, 0x43, 0x61, + 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, + 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x39, + 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, + 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x75, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, - 0x61, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x5f, + 0x61, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, - 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, - 0x39, 0x0a, 0x0a, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x09, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, - 0x09, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x41, 0x74, 0x22, 0xe3, 0x06, 0x0a, 0x07, 0x41, - 0x72, 0x74, 0x69, 0x63, 0x6c, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x3b, 0x0a, 0x08, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, - 0x72, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, - 0x70, 0x69, 0x63, 0x6b, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x76, 0x31, - 0x2e, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x52, 0x08, 0x70, 0x6c, 0x61, 0x74, 0x66, - 0x6f, 0x72, 0x6d, 0x12, 0x31, 0x0a, 0x05, 0x66, 0x65, 0x65, 0x64, 0x73, 0x18, 0x03, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x69, 0x63, 0x6b, 0x73, 0x2e, - 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x46, 0x65, 0x65, 0x64, 0x52, - 0x05, 0x66, 0x65, 0x65, 0x64, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x12, 0x20, 0x0a, 0x0b, - 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1f, - 0x0a, 0x0b, 0x61, 0x72, 0x74, 0x69, 0x63, 0x6c, 0x65, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0a, 0x61, 0x72, 0x74, 0x69, 0x63, 0x6c, 0x65, 0x55, 0x72, 0x6c, 0x12, - 0x3d, 0x0a, 0x0c, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, + 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x41, 0x74, 0x22, + 0xe0, 0x02, 0x0a, 0x08, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x12, 0x0e, 0x0a, 0x02, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x12, 0x19, 0x0a, 0x08, 0x73, 0x69, 0x74, 0x65, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x07, 0x73, 0x69, 0x74, 0x65, 0x55, 0x72, 0x6c, 0x12, 0x2c, 0x0a, 0x12, 0x70, + 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x5f, 0x73, 0x69, 0x74, 0x65, 0x5f, 0x74, 0x79, 0x70, + 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, + 0x6d, 0x53, 0x69, 0x74, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x66, 0x61, 0x76, + 0x69, 0x63, 0x6f, 0x6e, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, + 0x66, 0x61, 0x76, 0x69, 0x63, 0x6f, 0x6e, 0x55, 0x72, 0x6c, 0x12, 0x15, 0x0a, 0x06, 0x69, 0x73, + 0x5f, 0x65, 0x6e, 0x67, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x69, 0x73, 0x45, 0x6e, + 0x67, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, - 0x70, 0x52, 0x0b, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x65, 0x64, 0x41, 0x74, 0x12, 0x3d, - 0x0a, 0x0b, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x08, 0x20, + 0x70, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, + 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x75, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x64, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, + 0x41, 0x74, 0x22, 0xe3, 0x06, 0x0a, 0x07, 0x41, 0x72, 0x74, 0x69, 0x63, 0x6c, 0x65, 0x12, 0x0e, + 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x3b, + 0x0a, 0x08, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1f, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x69, 0x63, 0x6b, 0x73, 0x2e, 0x63, 0x6f, + 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, + 0x6d, 0x52, 0x08, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x12, 0x31, 0x0a, 0x05, 0x66, + 0x65, 0x65, 0x64, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x63, 0x68, 0x65, + 0x63, 0x6b, 0x70, 0x69, 0x63, 0x6b, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, + 0x76, 0x31, 0x2e, 0x46, 0x65, 0x65, 0x64, 0x52, 0x05, 0x66, 0x65, 0x65, 0x64, 0x73, 0x12, 0x14, + 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, + 0x69, 0x74, 0x6c, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x72, 0x74, 0x69, 0x63, 0x6c, + 0x65, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x61, 0x72, 0x74, + 0x69, 0x63, 0x6c, 0x65, 0x55, 0x72, 0x6c, 0x12, 0x3d, 0x0a, 0x0c, 0x70, 0x75, 0x62, 0x6c, 0x69, + 0x73, 0x68, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0b, 0x70, 0x75, 0x62, 0x6c, 0x69, + 0x73, 0x68, 0x65, 0x64, 0x41, 0x74, 0x12, 0x3d, 0x0a, 0x0b, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0a, 0x61, 0x75, 0x74, 0x68, 0x6f, + 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x30, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, - 0x65, 0x52, 0x0a, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x30, 0x0a, - 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, - 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x12, - 0x23, 0x0a, 0x0d, 0x74, 0x68, 0x75, 0x6d, 0x62, 0x6e, 0x61, 0x69, 0x6c, 0x5f, 0x75, 0x72, 0x6c, - 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x74, 0x68, 0x75, 0x6d, 0x62, 0x6e, 0x61, 0x69, - 0x6c, 0x55, 0x72, 0x6c, 0x12, 0x15, 0x0a, 0x06, 0x69, 0x73, 0x5f, 0x65, 0x6e, 0x67, 0x18, 0x0b, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x69, 0x73, 0x45, 0x6e, 0x67, 0x12, 0x1d, 0x0a, 0x0a, 0x69, - 0x73, 0x5f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x09, 0x69, 0x73, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x12, 0x3d, 0x0a, 0x0b, 0x62, 0x6f, - 0x6f, 0x6b, 0x6d, 0x61, 0x72, 0x6b, 0x5f, 0x69, 0x64, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0a, 0x62, - 0x6f, 0x6f, 0x6b, 0x6d, 0x61, 0x72, 0x6b, 0x49, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x69, 0x73, 0x5f, - 0x62, 0x6f, 0x6f, 0x6b, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x64, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x0c, 0x69, 0x73, 0x42, 0x6f, 0x6f, 0x6b, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x64, 0x12, 0x21, - 0x0a, 0x0c, 0x69, 0x73, 0x5f, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x69, 0x6e, 0x67, 0x18, 0x0f, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x69, 0x73, 0x46, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x69, 0x6e, - 0x67, 0x12, 0x3d, 0x0a, 0x1b, 0x66, 0x61, 0x76, 0x6f, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x61, 0x72, - 0x74, 0x69, 0x63, 0x6c, 0x65, 0x5f, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x73, - 0x18, 0x10, 0x20, 0x03, 0x28, 0x09, 0x52, 0x18, 0x66, 0x61, 0x76, 0x6f, 0x72, 0x69, 0x74, 0x65, - 0x41, 0x72, 0x74, 0x69, 0x63, 0x6c, 0x65, 0x46, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x49, 0x64, 0x73, - 0x12, 0x1d, 0x0a, 0x0a, 0x6c, 0x69, 0x6b, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x11, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x6c, 0x69, 0x6b, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, - 0x19, 0x0a, 0x08, 0x69, 0x73, 0x5f, 0x74, 0x72, 0x65, 0x6e, 0x64, 0x18, 0x12, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x07, 0x69, 0x73, 0x54, 0x72, 0x65, 0x6e, 0x64, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x13, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, - 0x5f, 0x61, 0x74, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, - 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, - 0x22, 0x5f, 0x0a, 0x0b, 0x41, 0x72, 0x74, 0x69, 0x63, 0x6c, 0x65, 0x45, 0x64, 0x67, 0x65, 0x12, - 0x38, 0x0a, 0x07, 0x61, 0x72, 0x74, 0x69, 0x63, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1e, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x69, 0x63, 0x6b, 0x73, 0x2e, 0x63, 0x6f, - 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x72, 0x74, 0x69, 0x63, 0x6c, 0x65, - 0x52, 0x07, 0x61, 0x72, 0x74, 0x69, 0x63, 0x6c, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x75, 0x72, - 0x73, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, - 0x72, 0x22, 0x53, 0x0a, 0x08, 0x46, 0x65, 0x65, 0x64, 0x45, 0x64, 0x67, 0x65, 0x12, 0x2f, 0x0a, - 0x04, 0x66, 0x65, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x63, 0x68, + 0x65, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x74, 0x68, 0x75, 0x6d, 0x62, + 0x6e, 0x61, 0x69, 0x6c, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, + 0x74, 0x68, 0x75, 0x6d, 0x62, 0x6e, 0x61, 0x69, 0x6c, 0x55, 0x72, 0x6c, 0x12, 0x15, 0x0a, 0x06, + 0x69, 0x73, 0x5f, 0x65, 0x6e, 0x67, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x69, 0x73, + 0x45, 0x6e, 0x67, 0x12, 0x1d, 0x0a, 0x0a, 0x69, 0x73, 0x5f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, + 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x69, 0x73, 0x50, 0x72, 0x69, 0x76, 0x61, + 0x74, 0x65, 0x12, 0x3d, 0x0a, 0x0b, 0x62, 0x6f, 0x6f, 0x6b, 0x6d, 0x61, 0x72, 0x6b, 0x5f, 0x69, + 0x64, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0a, 0x62, 0x6f, 0x6f, 0x6b, 0x6d, 0x61, 0x72, 0x6b, 0x49, + 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x69, 0x73, 0x5f, 0x62, 0x6f, 0x6f, 0x6b, 0x6d, 0x61, 0x72, 0x6b, + 0x65, 0x64, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x69, 0x73, 0x42, 0x6f, 0x6f, 0x6b, + 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x69, 0x73, 0x5f, 0x66, 0x6f, 0x6c, + 0x6c, 0x6f, 0x77, 0x69, 0x6e, 0x67, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x69, 0x73, + 0x46, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x69, 0x6e, 0x67, 0x12, 0x3d, 0x0a, 0x1b, 0x66, 0x61, 0x76, + 0x6f, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x61, 0x72, 0x74, 0x69, 0x63, 0x6c, 0x65, 0x5f, 0x66, 0x6f, + 0x6c, 0x64, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x10, 0x20, 0x03, 0x28, 0x09, 0x52, 0x18, + 0x66, 0x61, 0x76, 0x6f, 0x72, 0x69, 0x74, 0x65, 0x41, 0x72, 0x74, 0x69, 0x63, 0x6c, 0x65, 0x46, + 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x49, 0x64, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x6c, 0x69, 0x6b, 0x65, + 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x11, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x6c, 0x69, + 0x6b, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x69, 0x73, 0x5f, 0x74, 0x72, + 0x65, 0x6e, 0x64, 0x18, 0x12, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x69, 0x73, 0x54, 0x72, 0x65, + 0x6e, 0x64, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, + 0x18, 0x13, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, + 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x14, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x75, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x22, 0x5f, 0x0a, 0x0b, 0x41, 0x72, 0x74, 0x69, + 0x63, 0x6c, 0x65, 0x45, 0x64, 0x67, 0x65, 0x12, 0x38, 0x0a, 0x07, 0x61, 0x72, 0x74, 0x69, 0x63, + 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, + 0x70, 0x69, 0x63, 0x6b, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x76, 0x31, + 0x2e, 0x41, 0x72, 0x74, 0x69, 0x63, 0x6c, 0x65, 0x52, 0x07, 0x61, 0x72, 0x74, 0x69, 0x63, 0x6c, + 0x65, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x22, 0x53, 0x0a, 0x08, 0x46, 0x65, 0x65, + 0x64, 0x45, 0x64, 0x67, 0x65, 0x12, 0x2f, 0x0a, 0x04, 0x66, 0x65, 0x65, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x69, 0x63, 0x6b, 0x73, + 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x46, 0x65, 0x65, 0x64, + 0x52, 0x04, 0x66, 0x65, 0x65, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x22, 0xfa, + 0x01, 0x0a, 0x03, 0x4f, 0x47, 0x50, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x12, 0x3e, 0x0a, 0x0b, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, + 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1f, 0x0a, 0x0b, + 0x61, 0x72, 0x74, 0x69, 0x63, 0x6c, 0x65, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0a, 0x61, 0x72, 0x74, 0x69, 0x63, 0x6c, 0x65, 0x55, 0x72, 0x6c, 0x12, 0x19, 0x0a, + 0x08, 0x73, 0x69, 0x74, 0x65, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x07, 0x73, 0x69, 0x74, 0x65, 0x55, 0x72, 0x6c, 0x12, 0x1b, 0x0a, 0x09, 0x73, 0x69, 0x74, 0x65, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x69, 0x74, + 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x74, 0x68, 0x75, 0x6d, 0x62, 0x6e, 0x61, + 0x69, 0x6c, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x74, 0x68, + 0x75, 0x6d, 0x62, 0x6e, 0x61, 0x69, 0x6c, 0x55, 0x72, 0x6c, 0x12, 0x1f, 0x0a, 0x0b, 0x66, 0x61, + 0x76, 0x69, 0x63, 0x6f, 0x6e, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0a, 0x66, 0x61, 0x76, 0x69, 0x63, 0x6f, 0x6e, 0x55, 0x72, 0x6c, 0x32, 0x91, 0x04, 0x0a, 0x0e, + 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x64, + 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x41, 0x72, 0x74, 0x69, 0x63, 0x6c, 0x65, 0x73, 0x12, 0x29, 0x2e, + 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x69, 0x63, 0x6b, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, + 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x72, 0x74, 0x69, 0x63, 0x6c, 0x65, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, + 0x70, 0x69, 0x63, 0x6b, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x76, 0x31, + 0x2e, 0x47, 0x65, 0x74, 0x41, 0x72, 0x74, 0x69, 0x63, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x76, 0x0a, 0x13, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, 0x70, + 0x6c, 0x6f, 0x61, 0x64, 0x41, 0x72, 0x74, 0x69, 0x63, 0x6c, 0x65, 0x12, 0x31, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x69, 0x63, 0x6b, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, - 0x2e, 0x76, 0x31, 0x2e, 0x46, 0x65, 0x65, 0x64, 0x52, 0x04, 0x66, 0x65, 0x65, 0x64, 0x12, 0x16, - 0x0a, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, - 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x22, 0xfa, 0x01, 0x0a, 0x03, 0x4f, 0x47, 0x50, 0x12, 0x14, - 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, - 0x69, 0x74, 0x6c, 0x65, 0x12, 0x3e, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x69, - 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x72, 0x74, 0x69, 0x63, 0x6c, 0x65, 0x5f, - 0x75, 0x72, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x61, 0x72, 0x74, 0x69, 0x63, - 0x6c, 0x65, 0x55, 0x72, 0x6c, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x69, 0x74, 0x65, 0x5f, 0x75, 0x72, - 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x69, 0x74, 0x65, 0x55, 0x72, 0x6c, - 0x12, 0x1b, 0x0a, 0x09, 0x73, 0x69, 0x74, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x69, 0x74, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x23, 0x0a, - 0x0d, 0x74, 0x68, 0x75, 0x6d, 0x62, 0x6e, 0x61, 0x69, 0x6c, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x74, 0x68, 0x75, 0x6d, 0x62, 0x6e, 0x61, 0x69, 0x6c, 0x55, - 0x72, 0x6c, 0x12, 0x1f, 0x0a, 0x0b, 0x66, 0x61, 0x76, 0x69, 0x63, 0x6f, 0x6e, 0x5f, 0x75, 0x72, - 0x6c, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x66, 0x61, 0x76, 0x69, 0x63, 0x6f, 0x6e, - 0x55, 0x72, 0x6c, 0x32, 0xb7, 0x03, 0x0a, 0x0e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x64, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x41, 0x72, 0x74, - 0x69, 0x63, 0x6c, 0x65, 0x73, 0x12, 0x29, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x69, 0x63, - 0x6b, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, - 0x74, 0x41, 0x72, 0x74, 0x69, 0x63, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x2a, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x69, 0x63, 0x6b, 0x73, 0x2e, 0x63, 0x6f, - 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x72, 0x74, 0x69, - 0x63, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x76, 0x0a, 0x13, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x41, 0x72, 0x74, 0x69, - 0x63, 0x6c, 0x65, 0x12, 0x31, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x69, 0x63, 0x6b, 0x73, - 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x41, 0x72, 0x74, 0x69, 0x63, 0x6c, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x69, - 0x63, 0x6b, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, 0x72, 0x74, 0x69, 0x63, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6a, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x41, 0x72, 0x74, 0x69, 0x63, - 0x6c, 0x65, 0x4f, 0x47, 0x50, 0x12, 0x2b, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x69, 0x63, - 0x6b, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, - 0x74, 0x41, 0x72, 0x74, 0x69, 0x63, 0x6c, 0x65, 0x4f, 0x47, 0x50, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x69, 0x63, 0x6b, 0x73, 0x2e, - 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x72, - 0x74, 0x69, 0x63, 0x6c, 0x65, 0x4f, 0x47, 0x50, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x5b, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x46, 0x65, 0x65, 0x64, 0x73, 0x12, 0x26, 0x2e, 0x63, - 0x68, 0x65, 0x63, 0x6b, 0x70, 0x69, 0x63, 0x6b, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, - 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x65, 0x65, 0x64, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x69, 0x63, 0x6b, + 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, + 0x41, 0x72, 0x74, 0x69, 0x63, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, + 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x69, 0x63, 0x6b, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x74, + 0x65, 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, 0x72, 0x74, + 0x69, 0x63, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6a, 0x0a, 0x0d, + 0x47, 0x65, 0x74, 0x41, 0x72, 0x74, 0x69, 0x63, 0x6c, 0x65, 0x4f, 0x47, 0x50, 0x12, 0x2b, 0x2e, + 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x69, 0x63, 0x6b, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, + 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x72, 0x74, 0x69, 0x63, 0x6c, 0x65, + 0x4f, 0x47, 0x50, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x63, 0x68, 0x65, + 0x63, 0x6b, 0x70, 0x69, 0x63, 0x6b, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, + 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x72, 0x74, 0x69, 0x63, 0x6c, 0x65, 0x4f, 0x47, 0x50, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5b, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x46, + 0x65, 0x65, 0x64, 0x73, 0x12, 0x26, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x69, 0x63, 0x6b, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, - 0x46, 0x65, 0x65, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x2d, 0x5a, - 0x2b, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x59, 0x75, 0x6b, 0x69, - 0x4f, 0x6e, 0x69, 0x73, 0x68, 0x69, 0x31, 0x31, 0x32, 0x39, 0x2f, 0x74, 0x65, 0x63, 0x68, 0x70, - 0x69, 0x63, 0x6b, 0x73, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x62, 0x06, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x33, + 0x46, 0x65, 0x65, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x63, + 0x68, 0x65, 0x63, 0x6b, 0x70, 0x69, 0x63, 0x6b, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, + 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x65, 0x65, 0x64, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x58, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x46, 0x65, 0x65, 0x64, + 0x12, 0x25, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x69, 0x63, 0x6b, 0x73, 0x2e, 0x63, 0x6f, + 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x65, 0x65, 0x64, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, + 0x69, 0x63, 0x6b, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x2e, + 0x47, 0x65, 0x74, 0x46, 0x65, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, + 0x2d, 0x5a, 0x2b, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x59, 0x75, + 0x6b, 0x69, 0x4f, 0x6e, 0x69, 0x73, 0x68, 0x69, 0x31, 0x31, 0x32, 0x39, 0x2f, 0x74, 0x65, 0x63, + 0x68, 0x70, 0x69, 0x63, 0x6b, 0x73, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x62, 0x06, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -1664,7 +1780,7 @@ func file_content_content_proto_rawDescGZIP() []byte { return file_content_content_proto_rawDescData } -var file_content_content_proto_msgTypes = make([]protoimpl.MessageInfo, 16) +var file_content_content_proto_msgTypes = make([]protoimpl.MessageInfo, 18) var file_content_content_proto_goTypes = []any{ (*GetArticlesRequest)(nil), // 0: checkpicks.content.v1.GetArticlesRequest (*GetArticlesResponse)(nil), // 1: checkpicks.content.v1.GetArticlesResponse @@ -1674,68 +1790,73 @@ var file_content_content_proto_goTypes = []any{ (*GetArticleOGPRequest)(nil), // 5: checkpicks.content.v1.GetArticleOGPRequest (*GetFeedsResponse)(nil), // 6: checkpicks.content.v1.GetFeedsResponse (*GetFeedsRequest)(nil), // 7: checkpicks.content.v1.GetFeedsRequest - (*PageInfo)(nil), // 8: checkpicks.content.v1.PageInfo - (*Feed)(nil), // 9: checkpicks.content.v1.Feed - (*Category)(nil), // 10: checkpicks.content.v1.Category - (*Platform)(nil), // 11: checkpicks.content.v1.Platform - (*Article)(nil), // 12: checkpicks.content.v1.Article - (*ArticleEdge)(nil), // 13: checkpicks.content.v1.ArticleEdge - (*FeedEdge)(nil), // 14: checkpicks.content.v1.FeedEdge - (*OGP)(nil), // 15: checkpicks.content.v1.OGP - (*wrapperspb.StringValue)(nil), // 16: google.protobuf.StringValue - (*wrapperspb.Int64Value)(nil), // 17: google.protobuf.Int64Value - (*timestamppb.Timestamp)(nil), // 18: google.protobuf.Timestamp + (*GetFeedResponse)(nil), // 8: checkpicks.content.v1.GetFeedResponse + (*GetFeedRequest)(nil), // 9: checkpicks.content.v1.GetFeedRequest + (*PageInfo)(nil), // 10: checkpicks.content.v1.PageInfo + (*Feed)(nil), // 11: checkpicks.content.v1.Feed + (*Category)(nil), // 12: checkpicks.content.v1.Category + (*Platform)(nil), // 13: checkpicks.content.v1.Platform + (*Article)(nil), // 14: checkpicks.content.v1.Article + (*ArticleEdge)(nil), // 15: checkpicks.content.v1.ArticleEdge + (*FeedEdge)(nil), // 16: checkpicks.content.v1.FeedEdge + (*OGP)(nil), // 17: checkpicks.content.v1.OGP + (*wrapperspb.StringValue)(nil), // 18: google.protobuf.StringValue + (*wrapperspb.Int64Value)(nil), // 19: google.protobuf.Int64Value + (*timestamppb.Timestamp)(nil), // 20: google.protobuf.Timestamp } var file_content_content_proto_depIdxs = []int32{ - 16, // 0: checkpicks.content.v1.GetArticlesRequest.user_id:type_name -> google.protobuf.StringValue - 17, // 1: checkpicks.content.v1.GetArticlesRequest.language_status:type_name -> google.protobuf.Int64Value - 16, // 2: checkpicks.content.v1.GetArticlesRequest.tag:type_name -> google.protobuf.StringValue - 16, // 3: checkpicks.content.v1.GetArticlesRequest.feed_ids:type_name -> google.protobuf.StringValue - 13, // 4: checkpicks.content.v1.GetArticlesResponse.articlesEdge:type_name -> checkpicks.content.v1.ArticleEdge - 8, // 5: checkpicks.content.v1.GetArticlesResponse.page_info:type_name -> checkpicks.content.v1.PageInfo - 12, // 6: checkpicks.content.v1.CreateArticleResponse.article:type_name -> checkpicks.content.v1.Article - 15, // 7: checkpicks.content.v1.GetArticleOGPResponse.ogp:type_name -> checkpicks.content.v1.OGP - 14, // 8: checkpicks.content.v1.GetFeedsResponse.feed_edge:type_name -> checkpicks.content.v1.FeedEdge - 8, // 9: checkpicks.content.v1.GetFeedsResponse.page_info:type_name -> checkpicks.content.v1.PageInfo - 17, // 10: checkpicks.content.v1.GetFeedsRequest.platform_site_type:type_name -> google.protobuf.Int64Value - 16, // 11: checkpicks.content.v1.GetFeedsRequest.platform_id:type_name -> google.protobuf.StringValue - 16, // 12: checkpicks.content.v1.GetFeedsRequest.keyword:type_name -> google.protobuf.StringValue - 11, // 13: checkpicks.content.v1.Feed.platform:type_name -> checkpicks.content.v1.Platform - 10, // 14: checkpicks.content.v1.Feed.category:type_name -> checkpicks.content.v1.Category - 16, // 15: checkpicks.content.v1.Feed.api_query_param:type_name -> google.protobuf.StringValue - 18, // 16: checkpicks.content.v1.Feed.created_at:type_name -> google.protobuf.Timestamp - 18, // 17: checkpicks.content.v1.Feed.updated_at:type_name -> google.protobuf.Timestamp - 18, // 18: checkpicks.content.v1.Feed.deleted_at:type_name -> google.protobuf.Timestamp - 18, // 19: checkpicks.content.v1.Category.created_at:type_name -> google.protobuf.Timestamp - 18, // 20: checkpicks.content.v1.Category.updated_at:type_name -> google.protobuf.Timestamp - 18, // 21: checkpicks.content.v1.Category.deleted_at:type_name -> google.protobuf.Timestamp - 18, // 22: checkpicks.content.v1.Platform.created_at:type_name -> google.protobuf.Timestamp - 18, // 23: checkpicks.content.v1.Platform.updated_at:type_name -> google.protobuf.Timestamp - 18, // 24: checkpicks.content.v1.Platform.deleted_at:type_name -> google.protobuf.Timestamp - 11, // 25: checkpicks.content.v1.Article.platform:type_name -> checkpicks.content.v1.Platform - 9, // 26: checkpicks.content.v1.Article.feeds:type_name -> checkpicks.content.v1.Feed - 18, // 27: checkpicks.content.v1.Article.published_at:type_name -> google.protobuf.Timestamp - 16, // 28: checkpicks.content.v1.Article.author_name:type_name -> google.protobuf.StringValue - 16, // 29: checkpicks.content.v1.Article.tags:type_name -> google.protobuf.StringValue - 16, // 30: checkpicks.content.v1.Article.bookmark_id:type_name -> google.protobuf.StringValue - 18, // 31: checkpicks.content.v1.Article.created_at:type_name -> google.protobuf.Timestamp - 18, // 32: checkpicks.content.v1.Article.updated_at:type_name -> google.protobuf.Timestamp - 12, // 33: checkpicks.content.v1.ArticleEdge.article:type_name -> checkpicks.content.v1.Article - 9, // 34: checkpicks.content.v1.FeedEdge.feed:type_name -> checkpicks.content.v1.Feed - 16, // 35: checkpicks.content.v1.OGP.description:type_name -> google.protobuf.StringValue - 0, // 36: checkpicks.content.v1.ContentService.GetArticles:input_type -> checkpicks.content.v1.GetArticlesRequest - 3, // 37: checkpicks.content.v1.ContentService.CreateUploadArticle:input_type -> checkpicks.content.v1.CreateUploadArticleRequest - 5, // 38: checkpicks.content.v1.ContentService.GetArticleOGP:input_type -> checkpicks.content.v1.GetArticleOGPRequest - 7, // 39: checkpicks.content.v1.ContentService.GetFeeds:input_type -> checkpicks.content.v1.GetFeedsRequest - 1, // 40: checkpicks.content.v1.ContentService.GetArticles:output_type -> checkpicks.content.v1.GetArticlesResponse - 2, // 41: checkpicks.content.v1.ContentService.CreateUploadArticle:output_type -> checkpicks.content.v1.CreateArticleResponse - 4, // 42: checkpicks.content.v1.ContentService.GetArticleOGP:output_type -> checkpicks.content.v1.GetArticleOGPResponse - 6, // 43: checkpicks.content.v1.ContentService.GetFeeds:output_type -> checkpicks.content.v1.GetFeedsResponse - 40, // [40:44] is the sub-list for method output_type - 36, // [36:40] is the sub-list for method input_type - 36, // [36:36] is the sub-list for extension type_name - 36, // [36:36] is the sub-list for extension extendee - 0, // [0:36] is the sub-list for field type_name + 18, // 0: checkpicks.content.v1.GetArticlesRequest.user_id:type_name -> google.protobuf.StringValue + 19, // 1: checkpicks.content.v1.GetArticlesRequest.language_status:type_name -> google.protobuf.Int64Value + 18, // 2: checkpicks.content.v1.GetArticlesRequest.tag:type_name -> google.protobuf.StringValue + 18, // 3: checkpicks.content.v1.GetArticlesRequest.feed_ids:type_name -> google.protobuf.StringValue + 15, // 4: checkpicks.content.v1.GetArticlesResponse.articlesEdge:type_name -> checkpicks.content.v1.ArticleEdge + 10, // 5: checkpicks.content.v1.GetArticlesResponse.page_info:type_name -> checkpicks.content.v1.PageInfo + 14, // 6: checkpicks.content.v1.CreateArticleResponse.article:type_name -> checkpicks.content.v1.Article + 17, // 7: checkpicks.content.v1.GetArticleOGPResponse.ogp:type_name -> checkpicks.content.v1.OGP + 16, // 8: checkpicks.content.v1.GetFeedsResponse.feed_edge:type_name -> checkpicks.content.v1.FeedEdge + 10, // 9: checkpicks.content.v1.GetFeedsResponse.page_info:type_name -> checkpicks.content.v1.PageInfo + 19, // 10: checkpicks.content.v1.GetFeedsRequest.platform_site_type:type_name -> google.protobuf.Int64Value + 18, // 11: checkpicks.content.v1.GetFeedsRequest.platform_id:type_name -> google.protobuf.StringValue + 18, // 12: checkpicks.content.v1.GetFeedsRequest.keyword:type_name -> google.protobuf.StringValue + 11, // 13: checkpicks.content.v1.GetFeedResponse.feed:type_name -> checkpicks.content.v1.Feed + 13, // 14: checkpicks.content.v1.Feed.platform:type_name -> checkpicks.content.v1.Platform + 12, // 15: checkpicks.content.v1.Feed.category:type_name -> checkpicks.content.v1.Category + 18, // 16: checkpicks.content.v1.Feed.api_query_param:type_name -> google.protobuf.StringValue + 20, // 17: checkpicks.content.v1.Feed.created_at:type_name -> google.protobuf.Timestamp + 20, // 18: checkpicks.content.v1.Feed.updated_at:type_name -> google.protobuf.Timestamp + 20, // 19: checkpicks.content.v1.Feed.deleted_at:type_name -> google.protobuf.Timestamp + 20, // 20: checkpicks.content.v1.Category.created_at:type_name -> google.protobuf.Timestamp + 20, // 21: checkpicks.content.v1.Category.updated_at:type_name -> google.protobuf.Timestamp + 20, // 22: checkpicks.content.v1.Category.deleted_at:type_name -> google.protobuf.Timestamp + 20, // 23: checkpicks.content.v1.Platform.created_at:type_name -> google.protobuf.Timestamp + 20, // 24: checkpicks.content.v1.Platform.updated_at:type_name -> google.protobuf.Timestamp + 20, // 25: checkpicks.content.v1.Platform.deleted_at:type_name -> google.protobuf.Timestamp + 13, // 26: checkpicks.content.v1.Article.platform:type_name -> checkpicks.content.v1.Platform + 11, // 27: checkpicks.content.v1.Article.feeds:type_name -> checkpicks.content.v1.Feed + 20, // 28: checkpicks.content.v1.Article.published_at:type_name -> google.protobuf.Timestamp + 18, // 29: checkpicks.content.v1.Article.author_name:type_name -> google.protobuf.StringValue + 18, // 30: checkpicks.content.v1.Article.tags:type_name -> google.protobuf.StringValue + 18, // 31: checkpicks.content.v1.Article.bookmark_id:type_name -> google.protobuf.StringValue + 20, // 32: checkpicks.content.v1.Article.created_at:type_name -> google.protobuf.Timestamp + 20, // 33: checkpicks.content.v1.Article.updated_at:type_name -> google.protobuf.Timestamp + 14, // 34: checkpicks.content.v1.ArticleEdge.article:type_name -> checkpicks.content.v1.Article + 11, // 35: checkpicks.content.v1.FeedEdge.feed:type_name -> checkpicks.content.v1.Feed + 18, // 36: checkpicks.content.v1.OGP.description:type_name -> google.protobuf.StringValue + 0, // 37: checkpicks.content.v1.ContentService.GetArticles:input_type -> checkpicks.content.v1.GetArticlesRequest + 3, // 38: checkpicks.content.v1.ContentService.CreateUploadArticle:input_type -> checkpicks.content.v1.CreateUploadArticleRequest + 5, // 39: checkpicks.content.v1.ContentService.GetArticleOGP:input_type -> checkpicks.content.v1.GetArticleOGPRequest + 7, // 40: checkpicks.content.v1.ContentService.GetFeeds:input_type -> checkpicks.content.v1.GetFeedsRequest + 9, // 41: checkpicks.content.v1.ContentService.GetFeed:input_type -> checkpicks.content.v1.GetFeedRequest + 1, // 42: checkpicks.content.v1.ContentService.GetArticles:output_type -> checkpicks.content.v1.GetArticlesResponse + 2, // 43: checkpicks.content.v1.ContentService.CreateUploadArticle:output_type -> checkpicks.content.v1.CreateArticleResponse + 4, // 44: checkpicks.content.v1.ContentService.GetArticleOGP:output_type -> checkpicks.content.v1.GetArticleOGPResponse + 6, // 45: checkpicks.content.v1.ContentService.GetFeeds:output_type -> checkpicks.content.v1.GetFeedsResponse + 8, // 46: checkpicks.content.v1.ContentService.GetFeed:output_type -> checkpicks.content.v1.GetFeedResponse + 42, // [42:47] is the sub-list for method output_type + 37, // [37:42] is the sub-list for method input_type + 37, // [37:37] is the sub-list for extension type_name + 37, // [37:37] is the sub-list for extension extendee + 0, // [0:37] is the sub-list for field type_name } func init() { file_content_content_proto_init() } @@ -1841,7 +1962,7 @@ func file_content_content_proto_init() { } } file_content_content_proto_msgTypes[8].Exporter = func(v any, i int) any { - switch v := v.(*PageInfo); i { + switch v := v.(*GetFeedResponse); i { case 0: return &v.state case 1: @@ -1853,7 +1974,7 @@ func file_content_content_proto_init() { } } file_content_content_proto_msgTypes[9].Exporter = func(v any, i int) any { - switch v := v.(*Feed); i { + switch v := v.(*GetFeedRequest); i { case 0: return &v.state case 1: @@ -1865,7 +1986,7 @@ func file_content_content_proto_init() { } } file_content_content_proto_msgTypes[10].Exporter = func(v any, i int) any { - switch v := v.(*Category); i { + switch v := v.(*PageInfo); i { case 0: return &v.state case 1: @@ -1877,7 +1998,7 @@ func file_content_content_proto_init() { } } file_content_content_proto_msgTypes[11].Exporter = func(v any, i int) any { - switch v := v.(*Platform); i { + switch v := v.(*Feed); i { case 0: return &v.state case 1: @@ -1889,7 +2010,7 @@ func file_content_content_proto_init() { } } file_content_content_proto_msgTypes[12].Exporter = func(v any, i int) any { - switch v := v.(*Article); i { + switch v := v.(*Category); i { case 0: return &v.state case 1: @@ -1901,7 +2022,7 @@ func file_content_content_proto_init() { } } file_content_content_proto_msgTypes[13].Exporter = func(v any, i int) any { - switch v := v.(*ArticleEdge); i { + switch v := v.(*Platform); i { case 0: return &v.state case 1: @@ -1913,7 +2034,7 @@ func file_content_content_proto_init() { } } file_content_content_proto_msgTypes[14].Exporter = func(v any, i int) any { - switch v := v.(*FeedEdge); i { + switch v := v.(*Article); i { case 0: return &v.state case 1: @@ -1925,6 +2046,30 @@ func file_content_content_proto_init() { } } file_content_content_proto_msgTypes[15].Exporter = func(v any, i int) any { + switch v := v.(*ArticleEdge); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_content_content_proto_msgTypes[16].Exporter = func(v any, i int) any { + switch v := v.(*FeedEdge); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_content_content_proto_msgTypes[17].Exporter = func(v any, i int) any { switch v := v.(*OGP); i { case 0: return &v.state @@ -1943,7 +2088,7 @@ func file_content_content_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_content_content_proto_rawDesc, NumEnums: 0, - NumMessages: 16, + NumMessages: 18, NumExtensions: 0, NumServices: 1, }, diff --git a/micro-service/content-service/grpc/content/content_grpc.pb.go b/micro-service/content-service/grpc/content/content_grpc.pb.go index d6c3acbf..2ee8c359 100644 --- a/micro-service/content-service/grpc/content/content_grpc.pb.go +++ b/micro-service/content-service/grpc/content/content_grpc.pb.go @@ -23,6 +23,7 @@ const ( ContentService_CreateUploadArticle_FullMethodName = "/checkpicks.content.v1.ContentService/CreateUploadArticle" ContentService_GetArticleOGP_FullMethodName = "/checkpicks.content.v1.ContentService/GetArticleOGP" ContentService_GetFeeds_FullMethodName = "/checkpicks.content.v1.ContentService/GetFeeds" + ContentService_GetFeed_FullMethodName = "/checkpicks.content.v1.ContentService/GetFeed" ) // ContentServiceClient is the client API for ContentService service. @@ -33,6 +34,7 @@ type ContentServiceClient interface { CreateUploadArticle(ctx context.Context, in *CreateUploadArticleRequest, opts ...grpc.CallOption) (*CreateArticleResponse, error) GetArticleOGP(ctx context.Context, in *GetArticleOGPRequest, opts ...grpc.CallOption) (*GetArticleOGPResponse, error) GetFeeds(ctx context.Context, in *GetFeedsRequest, opts ...grpc.CallOption) (*GetFeedsResponse, error) + GetFeed(ctx context.Context, in *GetFeedRequest, opts ...grpc.CallOption) (*GetFeedResponse, error) } type contentServiceClient struct { @@ -83,6 +85,16 @@ func (c *contentServiceClient) GetFeeds(ctx context.Context, in *GetFeedsRequest return out, nil } +func (c *contentServiceClient) GetFeed(ctx context.Context, in *GetFeedRequest, opts ...grpc.CallOption) (*GetFeedResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(GetFeedResponse) + err := c.cc.Invoke(ctx, ContentService_GetFeed_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + // ContentServiceServer is the server API for ContentService service. // All implementations should embed UnimplementedContentServiceServer // for forward compatibility. @@ -91,6 +103,7 @@ type ContentServiceServer interface { CreateUploadArticle(context.Context, *CreateUploadArticleRequest) (*CreateArticleResponse, error) GetArticleOGP(context.Context, *GetArticleOGPRequest) (*GetArticleOGPResponse, error) GetFeeds(context.Context, *GetFeedsRequest) (*GetFeedsResponse, error) + GetFeed(context.Context, *GetFeedRequest) (*GetFeedResponse, error) } // UnimplementedContentServiceServer should be embedded to have @@ -112,6 +125,9 @@ func (UnimplementedContentServiceServer) GetArticleOGP(context.Context, *GetArti func (UnimplementedContentServiceServer) GetFeeds(context.Context, *GetFeedsRequest) (*GetFeedsResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method GetFeeds not implemented") } +func (UnimplementedContentServiceServer) GetFeed(context.Context, *GetFeedRequest) (*GetFeedResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetFeed not implemented") +} func (UnimplementedContentServiceServer) testEmbeddedByValue() {} // UnsafeContentServiceServer may be embedded to opt out of forward compatibility for this service. @@ -204,6 +220,24 @@ func _ContentService_GetFeeds_Handler(srv interface{}, ctx context.Context, dec return interceptor(ctx, in, info, handler) } +func _ContentService_GetFeed_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetFeedRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ContentServiceServer).GetFeed(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: ContentService_GetFeed_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ContentServiceServer).GetFeed(ctx, req.(*GetFeedRequest)) + } + return interceptor(ctx, in, info, handler) +} + // ContentService_ServiceDesc is the grpc.ServiceDesc for ContentService service. // It's only intended for direct use with grpc.RegisterService, // and not to be introspected or modified (even as a copy) @@ -227,6 +261,10 @@ var ContentService_ServiceDesc = grpc.ServiceDesc{ MethodName: "GetFeeds", Handler: _ContentService_GetFeeds_Handler, }, + { + MethodName: "GetFeed", + Handler: _ContentService_GetFeed_Handler, + }, }, Streams: []grpc.StreamDesc{}, Metadata: "content/content.proto", diff --git a/micro-service/content-service/internal/adapter/persistence_adapter/feed.go b/micro-service/content-service/internal/adapter/persistence_adapter/feed.go index 74769437..d952f197 100644 --- a/micro-service/content-service/internal/adapter/persistence_adapter/feed.go +++ b/micro-service/content-service/internal/adapter/persistence_adapter/feed.go @@ -11,6 +11,7 @@ import ( type FeedPersistenceAdapter interface { GetFeeds(ctx context.Context, req *cpb.GetFeedsRequest, limit int) (entity.FeedSlice, error) + GetFeed(ctx context.Context, req *cpb.GetFeedRequest) (entity.Feed, error) } type feedPersistenceAdapter struct { @@ -65,3 +66,22 @@ func (fpa *feedPersistenceAdapter) GetFeeds(ctx context.Context, req *cpb.GetFee return feeds, nil } + +func (fpa *feedPersistenceAdapter) GetFeed(ctx context.Context, req *cpb.GetFeedRequest) (entity.Feed, error) { + q := []qm.QueryMod{ + qm.Where("deleted_at IS NULL"), + qm.Load(qm.Rels(entity.FeedRels.Platform)), + qm.Load(qm.Rels(entity.FeedRels.Category)), + } + + if req.GetFeedId() != "" { + q = append(q, qm.Where("id = ?", req.GetFeedId())) + } + + feed, err := fpa.feedRepository.GetFeed(ctx, q) + if err != nil { + return entity.Feed{}, err + } + + return feed, nil +} diff --git a/micro-service/content-service/internal/application/usecase/content.go b/micro-service/content-service/internal/application/usecase/content.go index 5e4da234..338aef2a 100644 --- a/micro-service/content-service/internal/application/usecase/content.go +++ b/micro-service/content-service/internal/application/usecase/content.go @@ -14,6 +14,7 @@ type ContentUseCase interface { GetArticleOGP(ctx context.Context, articleURL string) (*cpb.GetArticleOGPResponse, error) GetFeeds(ctx context.Context, req *cpb.GetFeedsRequest) (*cpb.GetFeedsResponse, error) + GetFeed(ctx context.Context, req *cpb.GetFeedRequest) (*cpb.GetFeedResponse, error) } type contentUseCase struct { diff --git a/micro-service/content-service/internal/application/usecase/feed.go b/micro-service/content-service/internal/application/usecase/feed.go index 922fe84f..a88ae8b4 100644 --- a/micro-service/content-service/internal/application/usecase/feed.go +++ b/micro-service/content-service/internal/application/usecase/feed.go @@ -52,6 +52,19 @@ func (cu *contentUseCase) GetFeeds(ctx context.Context, req *cpb.GetFeedsRequest return res, nil } +func (cu *contentUseCase) GetFeed(ctx context.Context, req *cpb.GetFeedRequest) (*cpb.GetFeedResponse, error) { + feed, err := cu.feedPersistenceAdapter.GetFeed(ctx, req) + if err != nil { + return nil, err + } + + res := cu.convertPBFeed(feed) + // TODO: fetch my feed data from connecting to my feed service + return &cpb.GetFeedResponse{ + Feed: res, + }, nil +} + func (cu *contentUseCase) convertPBFeed(f entity.Feed) *cpb.Feed { feed := &cpb.Feed{ Id: f.ID, diff --git a/micro-service/content-service/internal/domain/repository/feed.go b/micro-service/content-service/internal/domain/repository/feed.go index 2ecc2814..6436f5b0 100644 --- a/micro-service/content-service/internal/domain/repository/feed.go +++ b/micro-service/content-service/internal/domain/repository/feed.go @@ -9,4 +9,5 @@ import ( type FeedRepository interface { GetFeeds(ctx context.Context, q []qm.QueryMod) (entity.FeedSlice, error) + GetFeed(ctx context.Context, q []qm.QueryMod) (entity.Feed, error) } diff --git a/micro-service/content-service/internal/infrastructure/persistence/feed.go b/micro-service/content-service/internal/infrastructure/persistence/feed.go index 828087f2..10debd19 100644 --- a/micro-service/content-service/internal/infrastructure/persistence/feed.go +++ b/micro-service/content-service/internal/infrastructure/persistence/feed.go @@ -31,3 +31,16 @@ func (fp *feedPersistence) GetFeeds(ctx context.Context, q []qm.QueryMod) (entit // boil.DebugMode = false return feeds, nil } + +func (fp *feedPersistence) GetFeed(ctx context.Context, q []qm.QueryMod) (entity.Feed, error) { + // boil.DebugMode = true + feed, err := entity.Feeds(q...).One(ctx, fp.db) + if err != nil { + if err == sql.ErrNoRows { + return entity.Feed{}, nil + } + return entity.Feed{}, err + } + // boil.DebugMode = false + return *feed, nil +} diff --git a/micro-service/content-service/internal/interfacess/handler/feed.go b/micro-service/content-service/internal/interfacess/handler/feed.go index ff017b09..ac281f6f 100644 --- a/micro-service/content-service/internal/interfacess/handler/feed.go +++ b/micro-service/content-service/internal/interfacess/handler/feed.go @@ -13,3 +13,11 @@ func (ch *contentHandler) GetFeeds(ctx context.Context, req *cpb.GetFeedsRequest } return res, nil } + +func (ch *contentHandler) GetFeed(ctx context.Context, req *cpb.GetFeedRequest) (*cpb.GetFeedResponse, error) { + res, err := ch.contentUseCase.GetFeed(ctx, req) + if err != nil { + return nil, err + } + return res, nil +} diff --git a/micro-service/favorite-service/grpc/content/content.pb.go b/micro-service/favorite-service/grpc/content/content.pb.go index 616ef59a..fa6021bb 100644 --- a/micro-service/favorite-service/grpc/content/content.pb.go +++ b/micro-service/favorite-service/grpc/content/content.pb.go @@ -550,6 +550,108 @@ func (x *GetFeedsRequest) GetLimit() int64 { return 0 } +type GetFeedResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Feed *Feed `protobuf:"bytes,1,opt,name=feed,proto3" json:"feed,omitempty"` +} + +func (x *GetFeedResponse) Reset() { + *x = GetFeedResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_content_content_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetFeedResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetFeedResponse) ProtoMessage() {} + +func (x *GetFeedResponse) ProtoReflect() protoreflect.Message { + mi := &file_content_content_proto_msgTypes[8] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetFeedResponse.ProtoReflect.Descriptor instead. +func (*GetFeedResponse) Descriptor() ([]byte, []int) { + return file_content_content_proto_rawDescGZIP(), []int{8} +} + +func (x *GetFeedResponse) GetFeed() *Feed { + if x != nil { + return x.Feed + } + return nil +} + +type GetFeedRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + FeedId string `protobuf:"bytes,1,opt,name=feed_id,json=feedId,proto3" json:"feed_id,omitempty"` + UserId string `protobuf:"bytes,2,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"` +} + +func (x *GetFeedRequest) Reset() { + *x = GetFeedRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_content_content_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetFeedRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetFeedRequest) ProtoMessage() {} + +func (x *GetFeedRequest) ProtoReflect() protoreflect.Message { + mi := &file_content_content_proto_msgTypes[9] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetFeedRequest.ProtoReflect.Descriptor instead. +func (*GetFeedRequest) Descriptor() ([]byte, []int) { + return file_content_content_proto_rawDescGZIP(), []int{9} +} + +func (x *GetFeedRequest) GetFeedId() string { + if x != nil { + return x.FeedId + } + return "" +} + +func (x *GetFeedRequest) GetUserId() string { + if x != nil { + return x.UserId + } + return "" +} + type PageInfo struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -562,7 +664,7 @@ type PageInfo struct { func (x *PageInfo) Reset() { *x = PageInfo{} if protoimpl.UnsafeEnabled { - mi := &file_content_content_proto_msgTypes[8] + mi := &file_content_content_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -575,7 +677,7 @@ func (x *PageInfo) String() string { func (*PageInfo) ProtoMessage() {} func (x *PageInfo) ProtoReflect() protoreflect.Message { - mi := &file_content_content_proto_msgTypes[8] + mi := &file_content_content_proto_msgTypes[10] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -588,7 +690,7 @@ func (x *PageInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use PageInfo.ProtoReflect.Descriptor instead. func (*PageInfo) Descriptor() ([]byte, []int) { - return file_content_content_proto_rawDescGZIP(), []int{8} + return file_content_content_proto_rawDescGZIP(), []int{10} } func (x *PageInfo) GetEndCursor() string { @@ -629,7 +731,7 @@ type Feed struct { func (x *Feed) Reset() { *x = Feed{} if protoimpl.UnsafeEnabled { - mi := &file_content_content_proto_msgTypes[9] + mi := &file_content_content_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -642,7 +744,7 @@ func (x *Feed) String() string { func (*Feed) ProtoMessage() {} func (x *Feed) ProtoReflect() protoreflect.Message { - mi := &file_content_content_proto_msgTypes[9] + mi := &file_content_content_proto_msgTypes[11] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -655,7 +757,7 @@ func (x *Feed) ProtoReflect() protoreflect.Message { // Deprecated: Use Feed.ProtoReflect.Descriptor instead. func (*Feed) Descriptor() ([]byte, []int) { - return file_content_content_proto_rawDescGZIP(), []int{9} + return file_content_content_proto_rawDescGZIP(), []int{11} } func (x *Feed) GetId() string { @@ -772,7 +874,7 @@ type Category struct { func (x *Category) Reset() { *x = Category{} if protoimpl.UnsafeEnabled { - mi := &file_content_content_proto_msgTypes[10] + mi := &file_content_content_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -785,7 +887,7 @@ func (x *Category) String() string { func (*Category) ProtoMessage() {} func (x *Category) ProtoReflect() protoreflect.Message { - mi := &file_content_content_proto_msgTypes[10] + mi := &file_content_content_proto_msgTypes[12] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -798,7 +900,7 @@ func (x *Category) ProtoReflect() protoreflect.Message { // Deprecated: Use Category.ProtoReflect.Descriptor instead. func (*Category) Descriptor() ([]byte, []int) { - return file_content_content_proto_rawDescGZIP(), []int{10} + return file_content_content_proto_rawDescGZIP(), []int{12} } func (x *Category) GetId() string { @@ -862,7 +964,7 @@ type Platform struct { func (x *Platform) Reset() { *x = Platform{} if protoimpl.UnsafeEnabled { - mi := &file_content_content_proto_msgTypes[11] + mi := &file_content_content_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -875,7 +977,7 @@ func (x *Platform) String() string { func (*Platform) ProtoMessage() {} func (x *Platform) ProtoReflect() protoreflect.Message { - mi := &file_content_content_proto_msgTypes[11] + mi := &file_content_content_proto_msgTypes[13] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -888,7 +990,7 @@ func (x *Platform) ProtoReflect() protoreflect.Message { // Deprecated: Use Platform.ProtoReflect.Descriptor instead. func (*Platform) Descriptor() ([]byte, []int) { - return file_content_content_proto_rawDescGZIP(), []int{11} + return file_content_content_proto_rawDescGZIP(), []int{13} } func (x *Platform) GetId() string { @@ -984,7 +1086,7 @@ type Article struct { func (x *Article) Reset() { *x = Article{} if protoimpl.UnsafeEnabled { - mi := &file_content_content_proto_msgTypes[12] + mi := &file_content_content_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -997,7 +1099,7 @@ func (x *Article) String() string { func (*Article) ProtoMessage() {} func (x *Article) ProtoReflect() protoreflect.Message { - mi := &file_content_content_proto_msgTypes[12] + mi := &file_content_content_proto_msgTypes[14] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1010,7 +1112,7 @@ func (x *Article) ProtoReflect() protoreflect.Message { // Deprecated: Use Article.ProtoReflect.Descriptor instead. func (*Article) Descriptor() ([]byte, []int) { - return file_content_content_proto_rawDescGZIP(), []int{12} + return file_content_content_proto_rawDescGZIP(), []int{14} } func (x *Article) GetId() string { @@ -1165,7 +1267,7 @@ type ArticleEdge struct { func (x *ArticleEdge) Reset() { *x = ArticleEdge{} if protoimpl.UnsafeEnabled { - mi := &file_content_content_proto_msgTypes[13] + mi := &file_content_content_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1178,7 +1280,7 @@ func (x *ArticleEdge) String() string { func (*ArticleEdge) ProtoMessage() {} func (x *ArticleEdge) ProtoReflect() protoreflect.Message { - mi := &file_content_content_proto_msgTypes[13] + mi := &file_content_content_proto_msgTypes[15] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1191,7 +1293,7 @@ func (x *ArticleEdge) ProtoReflect() protoreflect.Message { // Deprecated: Use ArticleEdge.ProtoReflect.Descriptor instead. func (*ArticleEdge) Descriptor() ([]byte, []int) { - return file_content_content_proto_rawDescGZIP(), []int{13} + return file_content_content_proto_rawDescGZIP(), []int{15} } func (x *ArticleEdge) GetArticle() *Article { @@ -1220,7 +1322,7 @@ type FeedEdge struct { func (x *FeedEdge) Reset() { *x = FeedEdge{} if protoimpl.UnsafeEnabled { - mi := &file_content_content_proto_msgTypes[14] + mi := &file_content_content_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1233,7 +1335,7 @@ func (x *FeedEdge) String() string { func (*FeedEdge) ProtoMessage() {} func (x *FeedEdge) ProtoReflect() protoreflect.Message { - mi := &file_content_content_proto_msgTypes[14] + mi := &file_content_content_proto_msgTypes[16] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1246,7 +1348,7 @@ func (x *FeedEdge) ProtoReflect() protoreflect.Message { // Deprecated: Use FeedEdge.ProtoReflect.Descriptor instead. func (*FeedEdge) Descriptor() ([]byte, []int) { - return file_content_content_proto_rawDescGZIP(), []int{14} + return file_content_content_proto_rawDescGZIP(), []int{16} } func (x *FeedEdge) GetFeed() *Feed { @@ -1280,7 +1382,7 @@ type OGP struct { func (x *OGP) Reset() { *x = OGP{} if protoimpl.UnsafeEnabled { - mi := &file_content_content_proto_msgTypes[15] + mi := &file_content_content_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1293,7 +1395,7 @@ func (x *OGP) String() string { func (*OGP) ProtoMessage() {} func (x *OGP) ProtoReflect() protoreflect.Message { - mi := &file_content_content_proto_msgTypes[15] + mi := &file_content_content_proto_msgTypes[17] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1306,7 +1408,7 @@ func (x *OGP) ProtoReflect() protoreflect.Message { // Deprecated: Use OGP.ProtoReflect.Descriptor instead. func (*OGP) Descriptor() ([]byte, []int) { - return file_content_content_proto_rawDescGZIP(), []int{15} + return file_content_content_proto_rawDescGZIP(), []int{17} } func (x *OGP) GetTitle() string { @@ -1455,201 +1557,215 @@ var file_content_content_proto_rawDesc = []byte{ 0x75, 0x65, 0x52, 0x07, 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x22, 0x4d, 0x0a, 0x08, 0x50, 0x61, 0x67, - 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1d, 0x0a, 0x0a, 0x65, 0x6e, 0x64, 0x5f, 0x63, 0x75, 0x72, - 0x73, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x65, 0x6e, 0x64, 0x43, 0x75, - 0x72, 0x73, 0x6f, 0x72, 0x12, 0x22, 0x0a, 0x0d, 0x68, 0x61, 0x73, 0x5f, 0x6e, 0x65, 0x78, 0x74, - 0x5f, 0x70, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x68, 0x61, 0x73, - 0x4e, 0x65, 0x78, 0x74, 0x50, 0x61, 0x67, 0x65, 0x22, 0xe6, 0x04, 0x0a, 0x04, 0x46, 0x65, 0x65, - 0x64, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, - 0x64, 0x12, 0x3b, 0x0a, 0x08, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x69, 0x63, 0x6b, 0x73, - 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x6c, 0x61, 0x74, - 0x66, 0x6f, 0x72, 0x6d, 0x52, 0x08, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x12, 0x3b, - 0x0a, 0x08, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1f, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x69, 0x63, 0x6b, 0x73, 0x2e, 0x63, 0x6f, - 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, - 0x79, 0x52, 0x08, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x12, 0x1e, 0x0a, 0x0b, 0x6d, - 0x79, 0x5f, 0x66, 0x65, 0x65, 0x64, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, - 0x52, 0x09, 0x6d, 0x79, 0x46, 0x65, 0x65, 0x64, 0x49, 0x64, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, - 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x12, 0x17, 0x0a, 0x07, 0x72, 0x73, 0x73, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x07, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x06, 0x72, 0x73, 0x73, 0x55, 0x72, 0x6c, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x69, - 0x74, 0x65, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x69, - 0x74, 0x65, 0x55, 0x72, 0x6c, 0x12, 0x23, 0x0a, 0x0d, 0x74, 0x68, 0x75, 0x6d, 0x62, 0x6e, 0x61, - 0x69, 0x6c, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x74, 0x68, - 0x75, 0x6d, 0x62, 0x6e, 0x61, 0x69, 0x6c, 0x55, 0x72, 0x6c, 0x12, 0x2e, 0x0a, 0x13, 0x74, 0x72, - 0x65, 0x6e, 0x64, 0x5f, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x5f, 0x74, 0x79, 0x70, - 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x74, 0x72, 0x65, 0x6e, 0x64, 0x50, 0x6c, - 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x12, 0x44, 0x0a, 0x0f, 0x61, 0x70, - 0x69, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x18, 0x0b, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, - 0x65, 0x52, 0x0d, 0x61, 0x70, 0x69, 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, 0x61, 0x72, 0x61, 0x6d, - 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x0c, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, - 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x75, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x75, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x64, 0x5f, 0x61, 0x74, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, - 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x41, - 0x74, 0x22, 0xf3, 0x01, 0x0a, 0x08, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x12, 0x0e, - 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, - 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x64, 0x5f, 0x61, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, - 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, - 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, - 0x70, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, - 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x64, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x64, 0x41, 0x74, 0x22, 0xe0, 0x02, 0x0a, 0x08, 0x50, 0x6c, 0x61, 0x74, - 0x66, 0x6f, 0x72, 0x6d, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x69, 0x74, 0x65, - 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x69, 0x74, 0x65, - 0x55, 0x72, 0x6c, 0x12, 0x2c, 0x0a, 0x12, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x5f, - 0x73, 0x69, 0x74, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x10, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x53, 0x69, 0x74, 0x65, 0x54, 0x79, 0x70, - 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x66, 0x61, 0x76, 0x69, 0x63, 0x6f, 0x6e, 0x5f, 0x75, 0x72, 0x6c, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x66, 0x61, 0x76, 0x69, 0x63, 0x6f, 0x6e, 0x55, - 0x72, 0x6c, 0x12, 0x15, 0x0a, 0x06, 0x69, 0x73, 0x5f, 0x65, 0x6e, 0x67, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x05, 0x69, 0x73, 0x45, 0x6e, 0x67, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, + 0x28, 0x03, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x22, 0x42, 0x0a, 0x0f, 0x47, 0x65, 0x74, + 0x46, 0x65, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2f, 0x0a, 0x04, + 0x66, 0x65, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x63, 0x68, 0x65, + 0x63, 0x6b, 0x70, 0x69, 0x63, 0x6b, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, + 0x76, 0x31, 0x2e, 0x46, 0x65, 0x65, 0x64, 0x52, 0x04, 0x66, 0x65, 0x65, 0x64, 0x22, 0x42, 0x0a, + 0x0e, 0x47, 0x65, 0x74, 0x46, 0x65, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x17, 0x0a, 0x07, 0x66, 0x65, 0x65, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x06, 0x66, 0x65, 0x65, 0x64, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, + 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, + 0x64, 0x22, 0x4d, 0x0a, 0x08, 0x50, 0x61, 0x67, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1d, 0x0a, + 0x0a, 0x65, 0x6e, 0x64, 0x5f, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x09, 0x65, 0x6e, 0x64, 0x43, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x12, 0x22, 0x0a, 0x0d, + 0x68, 0x61, 0x73, 0x5f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x0b, 0x68, 0x61, 0x73, 0x4e, 0x65, 0x78, 0x74, 0x50, 0x61, 0x67, 0x65, + 0x22, 0xe6, 0x04, 0x0a, 0x04, 0x46, 0x65, 0x65, 0x64, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x3b, 0x0a, 0x08, 0x70, 0x6c, 0x61, + 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x63, 0x68, + 0x65, 0x63, 0x6b, 0x70, 0x69, 0x63, 0x6b, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, + 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x52, 0x08, 0x70, 0x6c, + 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x12, 0x3b, 0x0a, 0x08, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, + 0x72, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, + 0x70, 0x69, 0x63, 0x6b, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x76, 0x31, + 0x2e, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x52, 0x08, 0x63, 0x61, 0x74, 0x65, 0x67, + 0x6f, 0x72, 0x79, 0x12, 0x1e, 0x0a, 0x0b, 0x6d, 0x79, 0x5f, 0x66, 0x65, 0x65, 0x64, 0x5f, 0x69, + 0x64, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x6d, 0x79, 0x46, 0x65, 0x65, 0x64, + 0x49, 0x64, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x17, 0x0a, 0x07, 0x72, 0x73, 0x73, + 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x73, 0x73, 0x55, + 0x72, 0x6c, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x69, 0x74, 0x65, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x08, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x69, 0x74, 0x65, 0x55, 0x72, 0x6c, 0x12, 0x23, 0x0a, + 0x0d, 0x74, 0x68, 0x75, 0x6d, 0x62, 0x6e, 0x61, 0x69, 0x6c, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x09, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x74, 0x68, 0x75, 0x6d, 0x62, 0x6e, 0x61, 0x69, 0x6c, 0x55, + 0x72, 0x6c, 0x12, 0x2e, 0x0a, 0x13, 0x74, 0x72, 0x65, 0x6e, 0x64, 0x5f, 0x70, 0x6c, 0x61, 0x74, + 0x66, 0x6f, 0x72, 0x6d, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x11, 0x74, 0x72, 0x65, 0x6e, 0x64, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x54, 0x79, + 0x70, 0x65, 0x12, 0x44, 0x0a, 0x0f, 0x61, 0x70, 0x69, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, + 0x70, 0x61, 0x72, 0x61, 0x6d, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0d, 0x61, 0x70, 0x69, 0x51, 0x75, + 0x65, 0x72, 0x79, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, + 0x74, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, + 0x0a, 0x0a, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x0e, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, + 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x41, 0x74, 0x22, 0xf3, 0x01, 0x0a, 0x08, 0x43, 0x61, + 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, + 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x39, + 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, + 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x75, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, - 0x61, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x5f, + 0x61, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, - 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, - 0x39, 0x0a, 0x0a, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x09, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, - 0x09, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x41, 0x74, 0x22, 0xe3, 0x06, 0x0a, 0x07, 0x41, - 0x72, 0x74, 0x69, 0x63, 0x6c, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x3b, 0x0a, 0x08, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, - 0x72, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, - 0x70, 0x69, 0x63, 0x6b, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x76, 0x31, - 0x2e, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x52, 0x08, 0x70, 0x6c, 0x61, 0x74, 0x66, - 0x6f, 0x72, 0x6d, 0x12, 0x31, 0x0a, 0x05, 0x66, 0x65, 0x65, 0x64, 0x73, 0x18, 0x03, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x69, 0x63, 0x6b, 0x73, 0x2e, - 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x46, 0x65, 0x65, 0x64, 0x52, - 0x05, 0x66, 0x65, 0x65, 0x64, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x12, 0x20, 0x0a, 0x0b, - 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1f, - 0x0a, 0x0b, 0x61, 0x72, 0x74, 0x69, 0x63, 0x6c, 0x65, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0a, 0x61, 0x72, 0x74, 0x69, 0x63, 0x6c, 0x65, 0x55, 0x72, 0x6c, 0x12, - 0x3d, 0x0a, 0x0c, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, + 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x41, 0x74, 0x22, + 0xe0, 0x02, 0x0a, 0x08, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x12, 0x0e, 0x0a, 0x02, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x12, 0x19, 0x0a, 0x08, 0x73, 0x69, 0x74, 0x65, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x07, 0x73, 0x69, 0x74, 0x65, 0x55, 0x72, 0x6c, 0x12, 0x2c, 0x0a, 0x12, 0x70, + 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x5f, 0x73, 0x69, 0x74, 0x65, 0x5f, 0x74, 0x79, 0x70, + 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, + 0x6d, 0x53, 0x69, 0x74, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x66, 0x61, 0x76, + 0x69, 0x63, 0x6f, 0x6e, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, + 0x66, 0x61, 0x76, 0x69, 0x63, 0x6f, 0x6e, 0x55, 0x72, 0x6c, 0x12, 0x15, 0x0a, 0x06, 0x69, 0x73, + 0x5f, 0x65, 0x6e, 0x67, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x69, 0x73, 0x45, 0x6e, + 0x67, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, - 0x70, 0x52, 0x0b, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x65, 0x64, 0x41, 0x74, 0x12, 0x3d, - 0x0a, 0x0b, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x08, 0x20, + 0x70, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, + 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x75, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x64, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, + 0x41, 0x74, 0x22, 0xe3, 0x06, 0x0a, 0x07, 0x41, 0x72, 0x74, 0x69, 0x63, 0x6c, 0x65, 0x12, 0x0e, + 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x3b, + 0x0a, 0x08, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1f, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x69, 0x63, 0x6b, 0x73, 0x2e, 0x63, 0x6f, + 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, + 0x6d, 0x52, 0x08, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x12, 0x31, 0x0a, 0x05, 0x66, + 0x65, 0x65, 0x64, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x63, 0x68, 0x65, + 0x63, 0x6b, 0x70, 0x69, 0x63, 0x6b, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, + 0x76, 0x31, 0x2e, 0x46, 0x65, 0x65, 0x64, 0x52, 0x05, 0x66, 0x65, 0x65, 0x64, 0x73, 0x12, 0x14, + 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, + 0x69, 0x74, 0x6c, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x72, 0x74, 0x69, 0x63, 0x6c, + 0x65, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x61, 0x72, 0x74, + 0x69, 0x63, 0x6c, 0x65, 0x55, 0x72, 0x6c, 0x12, 0x3d, 0x0a, 0x0c, 0x70, 0x75, 0x62, 0x6c, 0x69, + 0x73, 0x68, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0b, 0x70, 0x75, 0x62, 0x6c, 0x69, + 0x73, 0x68, 0x65, 0x64, 0x41, 0x74, 0x12, 0x3d, 0x0a, 0x0b, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0a, 0x61, 0x75, 0x74, 0x68, 0x6f, + 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x30, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, - 0x65, 0x52, 0x0a, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x30, 0x0a, - 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, - 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x12, - 0x23, 0x0a, 0x0d, 0x74, 0x68, 0x75, 0x6d, 0x62, 0x6e, 0x61, 0x69, 0x6c, 0x5f, 0x75, 0x72, 0x6c, - 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x74, 0x68, 0x75, 0x6d, 0x62, 0x6e, 0x61, 0x69, - 0x6c, 0x55, 0x72, 0x6c, 0x12, 0x15, 0x0a, 0x06, 0x69, 0x73, 0x5f, 0x65, 0x6e, 0x67, 0x18, 0x0b, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x69, 0x73, 0x45, 0x6e, 0x67, 0x12, 0x1d, 0x0a, 0x0a, 0x69, - 0x73, 0x5f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x09, 0x69, 0x73, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x12, 0x3d, 0x0a, 0x0b, 0x62, 0x6f, - 0x6f, 0x6b, 0x6d, 0x61, 0x72, 0x6b, 0x5f, 0x69, 0x64, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0a, 0x62, - 0x6f, 0x6f, 0x6b, 0x6d, 0x61, 0x72, 0x6b, 0x49, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x69, 0x73, 0x5f, - 0x62, 0x6f, 0x6f, 0x6b, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x64, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x0c, 0x69, 0x73, 0x42, 0x6f, 0x6f, 0x6b, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x64, 0x12, 0x21, - 0x0a, 0x0c, 0x69, 0x73, 0x5f, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x69, 0x6e, 0x67, 0x18, 0x0f, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x69, 0x73, 0x46, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x69, 0x6e, - 0x67, 0x12, 0x3d, 0x0a, 0x1b, 0x66, 0x61, 0x76, 0x6f, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x61, 0x72, - 0x74, 0x69, 0x63, 0x6c, 0x65, 0x5f, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x73, - 0x18, 0x10, 0x20, 0x03, 0x28, 0x09, 0x52, 0x18, 0x66, 0x61, 0x76, 0x6f, 0x72, 0x69, 0x74, 0x65, - 0x41, 0x72, 0x74, 0x69, 0x63, 0x6c, 0x65, 0x46, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x49, 0x64, 0x73, - 0x12, 0x1d, 0x0a, 0x0a, 0x6c, 0x69, 0x6b, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x11, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x6c, 0x69, 0x6b, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, - 0x19, 0x0a, 0x08, 0x69, 0x73, 0x5f, 0x74, 0x72, 0x65, 0x6e, 0x64, 0x18, 0x12, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x07, 0x69, 0x73, 0x54, 0x72, 0x65, 0x6e, 0x64, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x13, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, - 0x5f, 0x61, 0x74, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, - 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, - 0x22, 0x5f, 0x0a, 0x0b, 0x41, 0x72, 0x74, 0x69, 0x63, 0x6c, 0x65, 0x45, 0x64, 0x67, 0x65, 0x12, - 0x38, 0x0a, 0x07, 0x61, 0x72, 0x74, 0x69, 0x63, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1e, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x69, 0x63, 0x6b, 0x73, 0x2e, 0x63, 0x6f, - 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x72, 0x74, 0x69, 0x63, 0x6c, 0x65, - 0x52, 0x07, 0x61, 0x72, 0x74, 0x69, 0x63, 0x6c, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x75, 0x72, - 0x73, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, - 0x72, 0x22, 0x53, 0x0a, 0x08, 0x46, 0x65, 0x65, 0x64, 0x45, 0x64, 0x67, 0x65, 0x12, 0x2f, 0x0a, - 0x04, 0x66, 0x65, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x63, 0x68, + 0x65, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x74, 0x68, 0x75, 0x6d, 0x62, + 0x6e, 0x61, 0x69, 0x6c, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, + 0x74, 0x68, 0x75, 0x6d, 0x62, 0x6e, 0x61, 0x69, 0x6c, 0x55, 0x72, 0x6c, 0x12, 0x15, 0x0a, 0x06, + 0x69, 0x73, 0x5f, 0x65, 0x6e, 0x67, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x69, 0x73, + 0x45, 0x6e, 0x67, 0x12, 0x1d, 0x0a, 0x0a, 0x69, 0x73, 0x5f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, + 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x69, 0x73, 0x50, 0x72, 0x69, 0x76, 0x61, + 0x74, 0x65, 0x12, 0x3d, 0x0a, 0x0b, 0x62, 0x6f, 0x6f, 0x6b, 0x6d, 0x61, 0x72, 0x6b, 0x5f, 0x69, + 0x64, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0a, 0x62, 0x6f, 0x6f, 0x6b, 0x6d, 0x61, 0x72, 0x6b, 0x49, + 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x69, 0x73, 0x5f, 0x62, 0x6f, 0x6f, 0x6b, 0x6d, 0x61, 0x72, 0x6b, + 0x65, 0x64, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x69, 0x73, 0x42, 0x6f, 0x6f, 0x6b, + 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x69, 0x73, 0x5f, 0x66, 0x6f, 0x6c, + 0x6c, 0x6f, 0x77, 0x69, 0x6e, 0x67, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x69, 0x73, + 0x46, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x69, 0x6e, 0x67, 0x12, 0x3d, 0x0a, 0x1b, 0x66, 0x61, 0x76, + 0x6f, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x61, 0x72, 0x74, 0x69, 0x63, 0x6c, 0x65, 0x5f, 0x66, 0x6f, + 0x6c, 0x64, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x10, 0x20, 0x03, 0x28, 0x09, 0x52, 0x18, + 0x66, 0x61, 0x76, 0x6f, 0x72, 0x69, 0x74, 0x65, 0x41, 0x72, 0x74, 0x69, 0x63, 0x6c, 0x65, 0x46, + 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x49, 0x64, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x6c, 0x69, 0x6b, 0x65, + 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x11, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x6c, 0x69, + 0x6b, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x69, 0x73, 0x5f, 0x74, 0x72, + 0x65, 0x6e, 0x64, 0x18, 0x12, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x69, 0x73, 0x54, 0x72, 0x65, + 0x6e, 0x64, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, + 0x18, 0x13, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, + 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x14, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x75, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x22, 0x5f, 0x0a, 0x0b, 0x41, 0x72, 0x74, 0x69, + 0x63, 0x6c, 0x65, 0x45, 0x64, 0x67, 0x65, 0x12, 0x38, 0x0a, 0x07, 0x61, 0x72, 0x74, 0x69, 0x63, + 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, + 0x70, 0x69, 0x63, 0x6b, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x76, 0x31, + 0x2e, 0x41, 0x72, 0x74, 0x69, 0x63, 0x6c, 0x65, 0x52, 0x07, 0x61, 0x72, 0x74, 0x69, 0x63, 0x6c, + 0x65, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x22, 0x53, 0x0a, 0x08, 0x46, 0x65, 0x65, + 0x64, 0x45, 0x64, 0x67, 0x65, 0x12, 0x2f, 0x0a, 0x04, 0x66, 0x65, 0x65, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x69, 0x63, 0x6b, 0x73, + 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x46, 0x65, 0x65, 0x64, + 0x52, 0x04, 0x66, 0x65, 0x65, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x22, 0xfa, + 0x01, 0x0a, 0x03, 0x4f, 0x47, 0x50, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x12, 0x3e, 0x0a, 0x0b, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, + 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1f, 0x0a, 0x0b, + 0x61, 0x72, 0x74, 0x69, 0x63, 0x6c, 0x65, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0a, 0x61, 0x72, 0x74, 0x69, 0x63, 0x6c, 0x65, 0x55, 0x72, 0x6c, 0x12, 0x19, 0x0a, + 0x08, 0x73, 0x69, 0x74, 0x65, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x07, 0x73, 0x69, 0x74, 0x65, 0x55, 0x72, 0x6c, 0x12, 0x1b, 0x0a, 0x09, 0x73, 0x69, 0x74, 0x65, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x69, 0x74, + 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x74, 0x68, 0x75, 0x6d, 0x62, 0x6e, 0x61, + 0x69, 0x6c, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x74, 0x68, + 0x75, 0x6d, 0x62, 0x6e, 0x61, 0x69, 0x6c, 0x55, 0x72, 0x6c, 0x12, 0x1f, 0x0a, 0x0b, 0x66, 0x61, + 0x76, 0x69, 0x63, 0x6f, 0x6e, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0a, 0x66, 0x61, 0x76, 0x69, 0x63, 0x6f, 0x6e, 0x55, 0x72, 0x6c, 0x32, 0x91, 0x04, 0x0a, 0x0e, + 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x64, + 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x41, 0x72, 0x74, 0x69, 0x63, 0x6c, 0x65, 0x73, 0x12, 0x29, 0x2e, + 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x69, 0x63, 0x6b, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, + 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x72, 0x74, 0x69, 0x63, 0x6c, 0x65, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, + 0x70, 0x69, 0x63, 0x6b, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x76, 0x31, + 0x2e, 0x47, 0x65, 0x74, 0x41, 0x72, 0x74, 0x69, 0x63, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x76, 0x0a, 0x13, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, 0x70, + 0x6c, 0x6f, 0x61, 0x64, 0x41, 0x72, 0x74, 0x69, 0x63, 0x6c, 0x65, 0x12, 0x31, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x69, 0x63, 0x6b, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, - 0x2e, 0x76, 0x31, 0x2e, 0x46, 0x65, 0x65, 0x64, 0x52, 0x04, 0x66, 0x65, 0x65, 0x64, 0x12, 0x16, - 0x0a, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, - 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x22, 0xfa, 0x01, 0x0a, 0x03, 0x4f, 0x47, 0x50, 0x12, 0x14, - 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, - 0x69, 0x74, 0x6c, 0x65, 0x12, 0x3e, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x69, - 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x72, 0x74, 0x69, 0x63, 0x6c, 0x65, 0x5f, - 0x75, 0x72, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x61, 0x72, 0x74, 0x69, 0x63, - 0x6c, 0x65, 0x55, 0x72, 0x6c, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x69, 0x74, 0x65, 0x5f, 0x75, 0x72, - 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x69, 0x74, 0x65, 0x55, 0x72, 0x6c, - 0x12, 0x1b, 0x0a, 0x09, 0x73, 0x69, 0x74, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x69, 0x74, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x23, 0x0a, - 0x0d, 0x74, 0x68, 0x75, 0x6d, 0x62, 0x6e, 0x61, 0x69, 0x6c, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x74, 0x68, 0x75, 0x6d, 0x62, 0x6e, 0x61, 0x69, 0x6c, 0x55, - 0x72, 0x6c, 0x12, 0x1f, 0x0a, 0x0b, 0x66, 0x61, 0x76, 0x69, 0x63, 0x6f, 0x6e, 0x5f, 0x75, 0x72, - 0x6c, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x66, 0x61, 0x76, 0x69, 0x63, 0x6f, 0x6e, - 0x55, 0x72, 0x6c, 0x32, 0xb7, 0x03, 0x0a, 0x0e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x64, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x41, 0x72, 0x74, - 0x69, 0x63, 0x6c, 0x65, 0x73, 0x12, 0x29, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x69, 0x63, - 0x6b, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, - 0x74, 0x41, 0x72, 0x74, 0x69, 0x63, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x2a, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x69, 0x63, 0x6b, 0x73, 0x2e, 0x63, 0x6f, - 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x72, 0x74, 0x69, - 0x63, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x76, 0x0a, 0x13, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x41, 0x72, 0x74, 0x69, - 0x63, 0x6c, 0x65, 0x12, 0x31, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x69, 0x63, 0x6b, 0x73, - 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x41, 0x72, 0x74, 0x69, 0x63, 0x6c, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x69, - 0x63, 0x6b, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, 0x72, 0x74, 0x69, 0x63, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6a, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x41, 0x72, 0x74, 0x69, 0x63, - 0x6c, 0x65, 0x4f, 0x47, 0x50, 0x12, 0x2b, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x69, 0x63, - 0x6b, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, - 0x74, 0x41, 0x72, 0x74, 0x69, 0x63, 0x6c, 0x65, 0x4f, 0x47, 0x50, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x69, 0x63, 0x6b, 0x73, 0x2e, - 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x72, - 0x74, 0x69, 0x63, 0x6c, 0x65, 0x4f, 0x47, 0x50, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x5b, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x46, 0x65, 0x65, 0x64, 0x73, 0x12, 0x26, 0x2e, 0x63, - 0x68, 0x65, 0x63, 0x6b, 0x70, 0x69, 0x63, 0x6b, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, - 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x65, 0x65, 0x64, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x69, 0x63, 0x6b, + 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, + 0x41, 0x72, 0x74, 0x69, 0x63, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, + 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x69, 0x63, 0x6b, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x74, + 0x65, 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, 0x72, 0x74, + 0x69, 0x63, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6a, 0x0a, 0x0d, + 0x47, 0x65, 0x74, 0x41, 0x72, 0x74, 0x69, 0x63, 0x6c, 0x65, 0x4f, 0x47, 0x50, 0x12, 0x2b, 0x2e, + 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x69, 0x63, 0x6b, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, + 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x72, 0x74, 0x69, 0x63, 0x6c, 0x65, + 0x4f, 0x47, 0x50, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x63, 0x68, 0x65, + 0x63, 0x6b, 0x70, 0x69, 0x63, 0x6b, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, + 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x72, 0x74, 0x69, 0x63, 0x6c, 0x65, 0x4f, 0x47, 0x50, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5b, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x46, + 0x65, 0x65, 0x64, 0x73, 0x12, 0x26, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x69, 0x63, 0x6b, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, - 0x46, 0x65, 0x65, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x2d, 0x5a, - 0x2b, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x59, 0x75, 0x6b, 0x69, - 0x4f, 0x6e, 0x69, 0x73, 0x68, 0x69, 0x31, 0x31, 0x32, 0x39, 0x2f, 0x74, 0x65, 0x63, 0x68, 0x70, - 0x69, 0x63, 0x6b, 0x73, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x62, 0x06, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x33, + 0x46, 0x65, 0x65, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x63, + 0x68, 0x65, 0x63, 0x6b, 0x70, 0x69, 0x63, 0x6b, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, + 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x65, 0x65, 0x64, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x58, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x46, 0x65, 0x65, 0x64, + 0x12, 0x25, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x69, 0x63, 0x6b, 0x73, 0x2e, 0x63, 0x6f, + 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x65, 0x65, 0x64, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, + 0x69, 0x63, 0x6b, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x2e, + 0x47, 0x65, 0x74, 0x46, 0x65, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, + 0x2d, 0x5a, 0x2b, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x59, 0x75, + 0x6b, 0x69, 0x4f, 0x6e, 0x69, 0x73, 0x68, 0x69, 0x31, 0x31, 0x32, 0x39, 0x2f, 0x74, 0x65, 0x63, + 0x68, 0x70, 0x69, 0x63, 0x6b, 0x73, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x62, 0x06, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -1664,7 +1780,7 @@ func file_content_content_proto_rawDescGZIP() []byte { return file_content_content_proto_rawDescData } -var file_content_content_proto_msgTypes = make([]protoimpl.MessageInfo, 16) +var file_content_content_proto_msgTypes = make([]protoimpl.MessageInfo, 18) var file_content_content_proto_goTypes = []any{ (*GetArticlesRequest)(nil), // 0: checkpicks.content.v1.GetArticlesRequest (*GetArticlesResponse)(nil), // 1: checkpicks.content.v1.GetArticlesResponse @@ -1674,68 +1790,73 @@ var file_content_content_proto_goTypes = []any{ (*GetArticleOGPRequest)(nil), // 5: checkpicks.content.v1.GetArticleOGPRequest (*GetFeedsResponse)(nil), // 6: checkpicks.content.v1.GetFeedsResponse (*GetFeedsRequest)(nil), // 7: checkpicks.content.v1.GetFeedsRequest - (*PageInfo)(nil), // 8: checkpicks.content.v1.PageInfo - (*Feed)(nil), // 9: checkpicks.content.v1.Feed - (*Category)(nil), // 10: checkpicks.content.v1.Category - (*Platform)(nil), // 11: checkpicks.content.v1.Platform - (*Article)(nil), // 12: checkpicks.content.v1.Article - (*ArticleEdge)(nil), // 13: checkpicks.content.v1.ArticleEdge - (*FeedEdge)(nil), // 14: checkpicks.content.v1.FeedEdge - (*OGP)(nil), // 15: checkpicks.content.v1.OGP - (*wrapperspb.StringValue)(nil), // 16: google.protobuf.StringValue - (*wrapperspb.Int64Value)(nil), // 17: google.protobuf.Int64Value - (*timestamppb.Timestamp)(nil), // 18: google.protobuf.Timestamp + (*GetFeedResponse)(nil), // 8: checkpicks.content.v1.GetFeedResponse + (*GetFeedRequest)(nil), // 9: checkpicks.content.v1.GetFeedRequest + (*PageInfo)(nil), // 10: checkpicks.content.v1.PageInfo + (*Feed)(nil), // 11: checkpicks.content.v1.Feed + (*Category)(nil), // 12: checkpicks.content.v1.Category + (*Platform)(nil), // 13: checkpicks.content.v1.Platform + (*Article)(nil), // 14: checkpicks.content.v1.Article + (*ArticleEdge)(nil), // 15: checkpicks.content.v1.ArticleEdge + (*FeedEdge)(nil), // 16: checkpicks.content.v1.FeedEdge + (*OGP)(nil), // 17: checkpicks.content.v1.OGP + (*wrapperspb.StringValue)(nil), // 18: google.protobuf.StringValue + (*wrapperspb.Int64Value)(nil), // 19: google.protobuf.Int64Value + (*timestamppb.Timestamp)(nil), // 20: google.protobuf.Timestamp } var file_content_content_proto_depIdxs = []int32{ - 16, // 0: checkpicks.content.v1.GetArticlesRequest.user_id:type_name -> google.protobuf.StringValue - 17, // 1: checkpicks.content.v1.GetArticlesRequest.language_status:type_name -> google.protobuf.Int64Value - 16, // 2: checkpicks.content.v1.GetArticlesRequest.tag:type_name -> google.protobuf.StringValue - 16, // 3: checkpicks.content.v1.GetArticlesRequest.feed_ids:type_name -> google.protobuf.StringValue - 13, // 4: checkpicks.content.v1.GetArticlesResponse.articlesEdge:type_name -> checkpicks.content.v1.ArticleEdge - 8, // 5: checkpicks.content.v1.GetArticlesResponse.page_info:type_name -> checkpicks.content.v1.PageInfo - 12, // 6: checkpicks.content.v1.CreateArticleResponse.article:type_name -> checkpicks.content.v1.Article - 15, // 7: checkpicks.content.v1.GetArticleOGPResponse.ogp:type_name -> checkpicks.content.v1.OGP - 14, // 8: checkpicks.content.v1.GetFeedsResponse.feed_edge:type_name -> checkpicks.content.v1.FeedEdge - 8, // 9: checkpicks.content.v1.GetFeedsResponse.page_info:type_name -> checkpicks.content.v1.PageInfo - 17, // 10: checkpicks.content.v1.GetFeedsRequest.platform_site_type:type_name -> google.protobuf.Int64Value - 16, // 11: checkpicks.content.v1.GetFeedsRequest.platform_id:type_name -> google.protobuf.StringValue - 16, // 12: checkpicks.content.v1.GetFeedsRequest.keyword:type_name -> google.protobuf.StringValue - 11, // 13: checkpicks.content.v1.Feed.platform:type_name -> checkpicks.content.v1.Platform - 10, // 14: checkpicks.content.v1.Feed.category:type_name -> checkpicks.content.v1.Category - 16, // 15: checkpicks.content.v1.Feed.api_query_param:type_name -> google.protobuf.StringValue - 18, // 16: checkpicks.content.v1.Feed.created_at:type_name -> google.protobuf.Timestamp - 18, // 17: checkpicks.content.v1.Feed.updated_at:type_name -> google.protobuf.Timestamp - 18, // 18: checkpicks.content.v1.Feed.deleted_at:type_name -> google.protobuf.Timestamp - 18, // 19: checkpicks.content.v1.Category.created_at:type_name -> google.protobuf.Timestamp - 18, // 20: checkpicks.content.v1.Category.updated_at:type_name -> google.protobuf.Timestamp - 18, // 21: checkpicks.content.v1.Category.deleted_at:type_name -> google.protobuf.Timestamp - 18, // 22: checkpicks.content.v1.Platform.created_at:type_name -> google.protobuf.Timestamp - 18, // 23: checkpicks.content.v1.Platform.updated_at:type_name -> google.protobuf.Timestamp - 18, // 24: checkpicks.content.v1.Platform.deleted_at:type_name -> google.protobuf.Timestamp - 11, // 25: checkpicks.content.v1.Article.platform:type_name -> checkpicks.content.v1.Platform - 9, // 26: checkpicks.content.v1.Article.feeds:type_name -> checkpicks.content.v1.Feed - 18, // 27: checkpicks.content.v1.Article.published_at:type_name -> google.protobuf.Timestamp - 16, // 28: checkpicks.content.v1.Article.author_name:type_name -> google.protobuf.StringValue - 16, // 29: checkpicks.content.v1.Article.tags:type_name -> google.protobuf.StringValue - 16, // 30: checkpicks.content.v1.Article.bookmark_id:type_name -> google.protobuf.StringValue - 18, // 31: checkpicks.content.v1.Article.created_at:type_name -> google.protobuf.Timestamp - 18, // 32: checkpicks.content.v1.Article.updated_at:type_name -> google.protobuf.Timestamp - 12, // 33: checkpicks.content.v1.ArticleEdge.article:type_name -> checkpicks.content.v1.Article - 9, // 34: checkpicks.content.v1.FeedEdge.feed:type_name -> checkpicks.content.v1.Feed - 16, // 35: checkpicks.content.v1.OGP.description:type_name -> google.protobuf.StringValue - 0, // 36: checkpicks.content.v1.ContentService.GetArticles:input_type -> checkpicks.content.v1.GetArticlesRequest - 3, // 37: checkpicks.content.v1.ContentService.CreateUploadArticle:input_type -> checkpicks.content.v1.CreateUploadArticleRequest - 5, // 38: checkpicks.content.v1.ContentService.GetArticleOGP:input_type -> checkpicks.content.v1.GetArticleOGPRequest - 7, // 39: checkpicks.content.v1.ContentService.GetFeeds:input_type -> checkpicks.content.v1.GetFeedsRequest - 1, // 40: checkpicks.content.v1.ContentService.GetArticles:output_type -> checkpicks.content.v1.GetArticlesResponse - 2, // 41: checkpicks.content.v1.ContentService.CreateUploadArticle:output_type -> checkpicks.content.v1.CreateArticleResponse - 4, // 42: checkpicks.content.v1.ContentService.GetArticleOGP:output_type -> checkpicks.content.v1.GetArticleOGPResponse - 6, // 43: checkpicks.content.v1.ContentService.GetFeeds:output_type -> checkpicks.content.v1.GetFeedsResponse - 40, // [40:44] is the sub-list for method output_type - 36, // [36:40] is the sub-list for method input_type - 36, // [36:36] is the sub-list for extension type_name - 36, // [36:36] is the sub-list for extension extendee - 0, // [0:36] is the sub-list for field type_name + 18, // 0: checkpicks.content.v1.GetArticlesRequest.user_id:type_name -> google.protobuf.StringValue + 19, // 1: checkpicks.content.v1.GetArticlesRequest.language_status:type_name -> google.protobuf.Int64Value + 18, // 2: checkpicks.content.v1.GetArticlesRequest.tag:type_name -> google.protobuf.StringValue + 18, // 3: checkpicks.content.v1.GetArticlesRequest.feed_ids:type_name -> google.protobuf.StringValue + 15, // 4: checkpicks.content.v1.GetArticlesResponse.articlesEdge:type_name -> checkpicks.content.v1.ArticleEdge + 10, // 5: checkpicks.content.v1.GetArticlesResponse.page_info:type_name -> checkpicks.content.v1.PageInfo + 14, // 6: checkpicks.content.v1.CreateArticleResponse.article:type_name -> checkpicks.content.v1.Article + 17, // 7: checkpicks.content.v1.GetArticleOGPResponse.ogp:type_name -> checkpicks.content.v1.OGP + 16, // 8: checkpicks.content.v1.GetFeedsResponse.feed_edge:type_name -> checkpicks.content.v1.FeedEdge + 10, // 9: checkpicks.content.v1.GetFeedsResponse.page_info:type_name -> checkpicks.content.v1.PageInfo + 19, // 10: checkpicks.content.v1.GetFeedsRequest.platform_site_type:type_name -> google.protobuf.Int64Value + 18, // 11: checkpicks.content.v1.GetFeedsRequest.platform_id:type_name -> google.protobuf.StringValue + 18, // 12: checkpicks.content.v1.GetFeedsRequest.keyword:type_name -> google.protobuf.StringValue + 11, // 13: checkpicks.content.v1.GetFeedResponse.feed:type_name -> checkpicks.content.v1.Feed + 13, // 14: checkpicks.content.v1.Feed.platform:type_name -> checkpicks.content.v1.Platform + 12, // 15: checkpicks.content.v1.Feed.category:type_name -> checkpicks.content.v1.Category + 18, // 16: checkpicks.content.v1.Feed.api_query_param:type_name -> google.protobuf.StringValue + 20, // 17: checkpicks.content.v1.Feed.created_at:type_name -> google.protobuf.Timestamp + 20, // 18: checkpicks.content.v1.Feed.updated_at:type_name -> google.protobuf.Timestamp + 20, // 19: checkpicks.content.v1.Feed.deleted_at:type_name -> google.protobuf.Timestamp + 20, // 20: checkpicks.content.v1.Category.created_at:type_name -> google.protobuf.Timestamp + 20, // 21: checkpicks.content.v1.Category.updated_at:type_name -> google.protobuf.Timestamp + 20, // 22: checkpicks.content.v1.Category.deleted_at:type_name -> google.protobuf.Timestamp + 20, // 23: checkpicks.content.v1.Platform.created_at:type_name -> google.protobuf.Timestamp + 20, // 24: checkpicks.content.v1.Platform.updated_at:type_name -> google.protobuf.Timestamp + 20, // 25: checkpicks.content.v1.Platform.deleted_at:type_name -> google.protobuf.Timestamp + 13, // 26: checkpicks.content.v1.Article.platform:type_name -> checkpicks.content.v1.Platform + 11, // 27: checkpicks.content.v1.Article.feeds:type_name -> checkpicks.content.v1.Feed + 20, // 28: checkpicks.content.v1.Article.published_at:type_name -> google.protobuf.Timestamp + 18, // 29: checkpicks.content.v1.Article.author_name:type_name -> google.protobuf.StringValue + 18, // 30: checkpicks.content.v1.Article.tags:type_name -> google.protobuf.StringValue + 18, // 31: checkpicks.content.v1.Article.bookmark_id:type_name -> google.protobuf.StringValue + 20, // 32: checkpicks.content.v1.Article.created_at:type_name -> google.protobuf.Timestamp + 20, // 33: checkpicks.content.v1.Article.updated_at:type_name -> google.protobuf.Timestamp + 14, // 34: checkpicks.content.v1.ArticleEdge.article:type_name -> checkpicks.content.v1.Article + 11, // 35: checkpicks.content.v1.FeedEdge.feed:type_name -> checkpicks.content.v1.Feed + 18, // 36: checkpicks.content.v1.OGP.description:type_name -> google.protobuf.StringValue + 0, // 37: checkpicks.content.v1.ContentService.GetArticles:input_type -> checkpicks.content.v1.GetArticlesRequest + 3, // 38: checkpicks.content.v1.ContentService.CreateUploadArticle:input_type -> checkpicks.content.v1.CreateUploadArticleRequest + 5, // 39: checkpicks.content.v1.ContentService.GetArticleOGP:input_type -> checkpicks.content.v1.GetArticleOGPRequest + 7, // 40: checkpicks.content.v1.ContentService.GetFeeds:input_type -> checkpicks.content.v1.GetFeedsRequest + 9, // 41: checkpicks.content.v1.ContentService.GetFeed:input_type -> checkpicks.content.v1.GetFeedRequest + 1, // 42: checkpicks.content.v1.ContentService.GetArticles:output_type -> checkpicks.content.v1.GetArticlesResponse + 2, // 43: checkpicks.content.v1.ContentService.CreateUploadArticle:output_type -> checkpicks.content.v1.CreateArticleResponse + 4, // 44: checkpicks.content.v1.ContentService.GetArticleOGP:output_type -> checkpicks.content.v1.GetArticleOGPResponse + 6, // 45: checkpicks.content.v1.ContentService.GetFeeds:output_type -> checkpicks.content.v1.GetFeedsResponse + 8, // 46: checkpicks.content.v1.ContentService.GetFeed:output_type -> checkpicks.content.v1.GetFeedResponse + 42, // [42:47] is the sub-list for method output_type + 37, // [37:42] is the sub-list for method input_type + 37, // [37:37] is the sub-list for extension type_name + 37, // [37:37] is the sub-list for extension extendee + 0, // [0:37] is the sub-list for field type_name } func init() { file_content_content_proto_init() } @@ -1841,7 +1962,7 @@ func file_content_content_proto_init() { } } file_content_content_proto_msgTypes[8].Exporter = func(v any, i int) any { - switch v := v.(*PageInfo); i { + switch v := v.(*GetFeedResponse); i { case 0: return &v.state case 1: @@ -1853,7 +1974,7 @@ func file_content_content_proto_init() { } } file_content_content_proto_msgTypes[9].Exporter = func(v any, i int) any { - switch v := v.(*Feed); i { + switch v := v.(*GetFeedRequest); i { case 0: return &v.state case 1: @@ -1865,7 +1986,7 @@ func file_content_content_proto_init() { } } file_content_content_proto_msgTypes[10].Exporter = func(v any, i int) any { - switch v := v.(*Category); i { + switch v := v.(*PageInfo); i { case 0: return &v.state case 1: @@ -1877,7 +1998,7 @@ func file_content_content_proto_init() { } } file_content_content_proto_msgTypes[11].Exporter = func(v any, i int) any { - switch v := v.(*Platform); i { + switch v := v.(*Feed); i { case 0: return &v.state case 1: @@ -1889,7 +2010,7 @@ func file_content_content_proto_init() { } } file_content_content_proto_msgTypes[12].Exporter = func(v any, i int) any { - switch v := v.(*Article); i { + switch v := v.(*Category); i { case 0: return &v.state case 1: @@ -1901,7 +2022,7 @@ func file_content_content_proto_init() { } } file_content_content_proto_msgTypes[13].Exporter = func(v any, i int) any { - switch v := v.(*ArticleEdge); i { + switch v := v.(*Platform); i { case 0: return &v.state case 1: @@ -1913,7 +2034,7 @@ func file_content_content_proto_init() { } } file_content_content_proto_msgTypes[14].Exporter = func(v any, i int) any { - switch v := v.(*FeedEdge); i { + switch v := v.(*Article); i { case 0: return &v.state case 1: @@ -1925,6 +2046,30 @@ func file_content_content_proto_init() { } } file_content_content_proto_msgTypes[15].Exporter = func(v any, i int) any { + switch v := v.(*ArticleEdge); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_content_content_proto_msgTypes[16].Exporter = func(v any, i int) any { + switch v := v.(*FeedEdge); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_content_content_proto_msgTypes[17].Exporter = func(v any, i int) any { switch v := v.(*OGP); i { case 0: return &v.state @@ -1943,7 +2088,7 @@ func file_content_content_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_content_content_proto_rawDesc, NumEnums: 0, - NumMessages: 16, + NumMessages: 18, NumExtensions: 0, NumServices: 1, }, diff --git a/micro-service/favorite-service/grpc/content/content_grpc.pb.go b/micro-service/favorite-service/grpc/content/content_grpc.pb.go index d6c3acbf..2ee8c359 100644 --- a/micro-service/favorite-service/grpc/content/content_grpc.pb.go +++ b/micro-service/favorite-service/grpc/content/content_grpc.pb.go @@ -23,6 +23,7 @@ const ( ContentService_CreateUploadArticle_FullMethodName = "/checkpicks.content.v1.ContentService/CreateUploadArticle" ContentService_GetArticleOGP_FullMethodName = "/checkpicks.content.v1.ContentService/GetArticleOGP" ContentService_GetFeeds_FullMethodName = "/checkpicks.content.v1.ContentService/GetFeeds" + ContentService_GetFeed_FullMethodName = "/checkpicks.content.v1.ContentService/GetFeed" ) // ContentServiceClient is the client API for ContentService service. @@ -33,6 +34,7 @@ type ContentServiceClient interface { CreateUploadArticle(ctx context.Context, in *CreateUploadArticleRequest, opts ...grpc.CallOption) (*CreateArticleResponse, error) GetArticleOGP(ctx context.Context, in *GetArticleOGPRequest, opts ...grpc.CallOption) (*GetArticleOGPResponse, error) GetFeeds(ctx context.Context, in *GetFeedsRequest, opts ...grpc.CallOption) (*GetFeedsResponse, error) + GetFeed(ctx context.Context, in *GetFeedRequest, opts ...grpc.CallOption) (*GetFeedResponse, error) } type contentServiceClient struct { @@ -83,6 +85,16 @@ func (c *contentServiceClient) GetFeeds(ctx context.Context, in *GetFeedsRequest return out, nil } +func (c *contentServiceClient) GetFeed(ctx context.Context, in *GetFeedRequest, opts ...grpc.CallOption) (*GetFeedResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(GetFeedResponse) + err := c.cc.Invoke(ctx, ContentService_GetFeed_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + // ContentServiceServer is the server API for ContentService service. // All implementations should embed UnimplementedContentServiceServer // for forward compatibility. @@ -91,6 +103,7 @@ type ContentServiceServer interface { CreateUploadArticle(context.Context, *CreateUploadArticleRequest) (*CreateArticleResponse, error) GetArticleOGP(context.Context, *GetArticleOGPRequest) (*GetArticleOGPResponse, error) GetFeeds(context.Context, *GetFeedsRequest) (*GetFeedsResponse, error) + GetFeed(context.Context, *GetFeedRequest) (*GetFeedResponse, error) } // UnimplementedContentServiceServer should be embedded to have @@ -112,6 +125,9 @@ func (UnimplementedContentServiceServer) GetArticleOGP(context.Context, *GetArti func (UnimplementedContentServiceServer) GetFeeds(context.Context, *GetFeedsRequest) (*GetFeedsResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method GetFeeds not implemented") } +func (UnimplementedContentServiceServer) GetFeed(context.Context, *GetFeedRequest) (*GetFeedResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetFeed not implemented") +} func (UnimplementedContentServiceServer) testEmbeddedByValue() {} // UnsafeContentServiceServer may be embedded to opt out of forward compatibility for this service. @@ -204,6 +220,24 @@ func _ContentService_GetFeeds_Handler(srv interface{}, ctx context.Context, dec return interceptor(ctx, in, info, handler) } +func _ContentService_GetFeed_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetFeedRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ContentServiceServer).GetFeed(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: ContentService_GetFeed_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ContentServiceServer).GetFeed(ctx, req.(*GetFeedRequest)) + } + return interceptor(ctx, in, info, handler) +} + // ContentService_ServiceDesc is the grpc.ServiceDesc for ContentService service. // It's only intended for direct use with grpc.RegisterService, // and not to be introspected or modified (even as a copy) @@ -227,6 +261,10 @@ var ContentService_ServiceDesc = grpc.ServiceDesc{ MethodName: "GetFeeds", Handler: _ContentService_GetFeeds_Handler, }, + { + MethodName: "GetFeed", + Handler: _ContentService_GetFeed_Handler, + }, }, Streams: []grpc.StreamDesc{}, Metadata: "content/content.proto", diff --git a/micro-service/favorite-service/internal/util/testutil/mock/bookmark_service.go b/micro-service/favorite-service/internal/util/testutil/mock/bookmark_service.go new file mode 100644 index 00000000..0a10722e --- /dev/null +++ b/micro-service/favorite-service/internal/util/testutil/mock/bookmark_service.go @@ -0,0 +1,271 @@ +// Code generated by MockGen. DO NOT EDIT. +// Source: grpc/bookmark/bookmark_grpc.pb.go + +// Package mock is a generated GoMock package. +package mock + +import ( + context "context" + reflect "reflect" + + bookmark "github.com/YukiOnishi1129/techpicks/micro-service/favorite-service/grpc/bookmark" + gomock "github.com/golang/mock/gomock" + grpc "google.golang.org/grpc" + emptypb "google.golang.org/protobuf/types/known/emptypb" +) + +// MockBookmarkServiceClient is a mock of BookmarkServiceClient interface. +type MockBookmarkServiceClient struct { + ctrl *gomock.Controller + recorder *MockBookmarkServiceClientMockRecorder +} + +// MockBookmarkServiceClientMockRecorder is the mock recorder for MockBookmarkServiceClient. +type MockBookmarkServiceClientMockRecorder struct { + mock *MockBookmarkServiceClient +} + +// NewMockBookmarkServiceClient creates a new mock instance. +func NewMockBookmarkServiceClient(ctrl *gomock.Controller) *MockBookmarkServiceClient { + mock := &MockBookmarkServiceClient{ctrl: ctrl} + mock.recorder = &MockBookmarkServiceClientMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockBookmarkServiceClient) EXPECT() *MockBookmarkServiceClientMockRecorder { + return m.recorder +} + +// CreateBookmark mocks base method. +func (m *MockBookmarkServiceClient) CreateBookmark(ctx context.Context, in *bookmark.CreateBookmarkRequest, opts ...grpc.CallOption) (*bookmark.CreateBookmarkResponse, error) { + m.ctrl.T.Helper() + varargs := []interface{}{ctx, in} + for _, a := range opts { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "CreateBookmark", varargs...) + ret0, _ := ret[0].(*bookmark.CreateBookmarkResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// CreateBookmark indicates an expected call of CreateBookmark. +func (mr *MockBookmarkServiceClientMockRecorder) CreateBookmark(ctx, in interface{}, opts ...interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]interface{}{ctx, in}, opts...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateBookmark", reflect.TypeOf((*MockBookmarkServiceClient)(nil).CreateBookmark), varargs...) +} + +// CreateBookmarkForUploadArticle mocks base method. +func (m *MockBookmarkServiceClient) CreateBookmarkForUploadArticle(ctx context.Context, in *bookmark.CreateBookmarkForUploadArticleRequest, opts ...grpc.CallOption) (*bookmark.CreateBookmarkResponse, error) { + m.ctrl.T.Helper() + varargs := []interface{}{ctx, in} + for _, a := range opts { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "CreateBookmarkForUploadArticle", varargs...) + ret0, _ := ret[0].(*bookmark.CreateBookmarkResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// CreateBookmarkForUploadArticle indicates an expected call of CreateBookmarkForUploadArticle. +func (mr *MockBookmarkServiceClientMockRecorder) CreateBookmarkForUploadArticle(ctx, in interface{}, opts ...interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]interface{}{ctx, in}, opts...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateBookmarkForUploadArticle", reflect.TypeOf((*MockBookmarkServiceClient)(nil).CreateBookmarkForUploadArticle), varargs...) +} + +// DeleteBookmark mocks base method. +func (m *MockBookmarkServiceClient) DeleteBookmark(ctx context.Context, in *bookmark.DeleteBookmarkRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { + m.ctrl.T.Helper() + varargs := []interface{}{ctx, in} + for _, a := range opts { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "DeleteBookmark", varargs...) + ret0, _ := ret[0].(*emptypb.Empty) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// DeleteBookmark indicates an expected call of DeleteBookmark. +func (mr *MockBookmarkServiceClientMockRecorder) DeleteBookmark(ctx, in interface{}, opts ...interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]interface{}{ctx, in}, opts...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteBookmark", reflect.TypeOf((*MockBookmarkServiceClient)(nil).DeleteBookmark), varargs...) +} + +// GetBookmarkByArticleID mocks base method. +func (m *MockBookmarkServiceClient) GetBookmarkByArticleID(ctx context.Context, in *bookmark.GetBookmarkByArticleIDRequest, opts ...grpc.CallOption) (*bookmark.GetBookmarkResponse, error) { + m.ctrl.T.Helper() + varargs := []interface{}{ctx, in} + for _, a := range opts { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "GetBookmarkByArticleID", varargs...) + ret0, _ := ret[0].(*bookmark.GetBookmarkResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetBookmarkByArticleID indicates an expected call of GetBookmarkByArticleID. +func (mr *MockBookmarkServiceClientMockRecorder) GetBookmarkByArticleID(ctx, in interface{}, opts ...interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]interface{}{ctx, in}, opts...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetBookmarkByArticleID", reflect.TypeOf((*MockBookmarkServiceClient)(nil).GetBookmarkByArticleID), varargs...) +} + +// GetBookmarks mocks base method. +func (m *MockBookmarkServiceClient) GetBookmarks(ctx context.Context, in *bookmark.GetBookmarksRequest, opts ...grpc.CallOption) (*bookmark.GetBookmarksResponse, error) { + m.ctrl.T.Helper() + varargs := []interface{}{ctx, in} + for _, a := range opts { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "GetBookmarks", varargs...) + ret0, _ := ret[0].(*bookmark.GetBookmarksResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetBookmarks indicates an expected call of GetBookmarks. +func (mr *MockBookmarkServiceClientMockRecorder) GetBookmarks(ctx, in interface{}, opts ...interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]interface{}{ctx, in}, opts...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetBookmarks", reflect.TypeOf((*MockBookmarkServiceClient)(nil).GetBookmarks), varargs...) +} + +// MockBookmarkServiceServer is a mock of BookmarkServiceServer interface. +type MockBookmarkServiceServer struct { + ctrl *gomock.Controller + recorder *MockBookmarkServiceServerMockRecorder +} + +// MockBookmarkServiceServerMockRecorder is the mock recorder for MockBookmarkServiceServer. +type MockBookmarkServiceServerMockRecorder struct { + mock *MockBookmarkServiceServer +} + +// NewMockBookmarkServiceServer creates a new mock instance. +func NewMockBookmarkServiceServer(ctrl *gomock.Controller) *MockBookmarkServiceServer { + mock := &MockBookmarkServiceServer{ctrl: ctrl} + mock.recorder = &MockBookmarkServiceServerMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockBookmarkServiceServer) EXPECT() *MockBookmarkServiceServerMockRecorder { + return m.recorder +} + +// CreateBookmark mocks base method. +func (m *MockBookmarkServiceServer) CreateBookmark(arg0 context.Context, arg1 *bookmark.CreateBookmarkRequest) (*bookmark.CreateBookmarkResponse, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "CreateBookmark", arg0, arg1) + ret0, _ := ret[0].(*bookmark.CreateBookmarkResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// CreateBookmark indicates an expected call of CreateBookmark. +func (mr *MockBookmarkServiceServerMockRecorder) CreateBookmark(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateBookmark", reflect.TypeOf((*MockBookmarkServiceServer)(nil).CreateBookmark), arg0, arg1) +} + +// CreateBookmarkForUploadArticle mocks base method. +func (m *MockBookmarkServiceServer) CreateBookmarkForUploadArticle(arg0 context.Context, arg1 *bookmark.CreateBookmarkForUploadArticleRequest) (*bookmark.CreateBookmarkResponse, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "CreateBookmarkForUploadArticle", arg0, arg1) + ret0, _ := ret[0].(*bookmark.CreateBookmarkResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// CreateBookmarkForUploadArticle indicates an expected call of CreateBookmarkForUploadArticle. +func (mr *MockBookmarkServiceServerMockRecorder) CreateBookmarkForUploadArticle(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateBookmarkForUploadArticle", reflect.TypeOf((*MockBookmarkServiceServer)(nil).CreateBookmarkForUploadArticle), arg0, arg1) +} + +// DeleteBookmark mocks base method. +func (m *MockBookmarkServiceServer) DeleteBookmark(arg0 context.Context, arg1 *bookmark.DeleteBookmarkRequest) (*emptypb.Empty, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "DeleteBookmark", arg0, arg1) + ret0, _ := ret[0].(*emptypb.Empty) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// DeleteBookmark indicates an expected call of DeleteBookmark. +func (mr *MockBookmarkServiceServerMockRecorder) DeleteBookmark(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteBookmark", reflect.TypeOf((*MockBookmarkServiceServer)(nil).DeleteBookmark), arg0, arg1) +} + +// GetBookmarkByArticleID mocks base method. +func (m *MockBookmarkServiceServer) GetBookmarkByArticleID(arg0 context.Context, arg1 *bookmark.GetBookmarkByArticleIDRequest) (*bookmark.GetBookmarkResponse, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetBookmarkByArticleID", arg0, arg1) + ret0, _ := ret[0].(*bookmark.GetBookmarkResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetBookmarkByArticleID indicates an expected call of GetBookmarkByArticleID. +func (mr *MockBookmarkServiceServerMockRecorder) GetBookmarkByArticleID(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetBookmarkByArticleID", reflect.TypeOf((*MockBookmarkServiceServer)(nil).GetBookmarkByArticleID), arg0, arg1) +} + +// GetBookmarks mocks base method. +func (m *MockBookmarkServiceServer) GetBookmarks(arg0 context.Context, arg1 *bookmark.GetBookmarksRequest) (*bookmark.GetBookmarksResponse, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetBookmarks", arg0, arg1) + ret0, _ := ret[0].(*bookmark.GetBookmarksResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetBookmarks indicates an expected call of GetBookmarks. +func (mr *MockBookmarkServiceServerMockRecorder) GetBookmarks(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetBookmarks", reflect.TypeOf((*MockBookmarkServiceServer)(nil).GetBookmarks), arg0, arg1) +} + +// MockUnsafeBookmarkServiceServer is a mock of UnsafeBookmarkServiceServer interface. +type MockUnsafeBookmarkServiceServer struct { + ctrl *gomock.Controller + recorder *MockUnsafeBookmarkServiceServerMockRecorder +} + +// MockUnsafeBookmarkServiceServerMockRecorder is the mock recorder for MockUnsafeBookmarkServiceServer. +type MockUnsafeBookmarkServiceServerMockRecorder struct { + mock *MockUnsafeBookmarkServiceServer +} + +// NewMockUnsafeBookmarkServiceServer creates a new mock instance. +func NewMockUnsafeBookmarkServiceServer(ctrl *gomock.Controller) *MockUnsafeBookmarkServiceServer { + mock := &MockUnsafeBookmarkServiceServer{ctrl: ctrl} + mock.recorder = &MockUnsafeBookmarkServiceServerMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use. +func (m *MockUnsafeBookmarkServiceServer) EXPECT() *MockUnsafeBookmarkServiceServerMockRecorder { + return m.recorder +} + +// mustEmbedUnimplementedBookmarkServiceServer mocks base method. +func (m *MockUnsafeBookmarkServiceServer) mustEmbedUnimplementedBookmarkServiceServer() { + m.ctrl.T.Helper() + m.ctrl.Call(m, "mustEmbedUnimplementedBookmarkServiceServer") +} + +// mustEmbedUnimplementedBookmarkServiceServer indicates an expected call of mustEmbedUnimplementedBookmarkServiceServer. +func (mr *MockUnsafeBookmarkServiceServerMockRecorder) mustEmbedUnimplementedBookmarkServiceServer() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "mustEmbedUnimplementedBookmarkServiceServer", reflect.TypeOf((*MockUnsafeBookmarkServiceServer)(nil).mustEmbedUnimplementedBookmarkServiceServer)) +} diff --git a/micro-service/favorite-service/internal/util/testutil/mock/content_service.go b/micro-service/favorite-service/internal/util/testutil/mock/content_service.go index 9fe2a24b..217f818a 100644 --- a/micro-service/favorite-service/internal/util/testutil/mock/content_service.go +++ b/micro-service/favorite-service/internal/util/testutil/mock/content_service.go @@ -96,6 +96,26 @@ func (mr *MockContentServiceClientMockRecorder) GetArticles(ctx, in interface{}, return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetArticles", reflect.TypeOf((*MockContentServiceClient)(nil).GetArticles), varargs...) } +// GetFeed mocks base method. +func (m *MockContentServiceClient) GetFeed(ctx context.Context, in *content.GetFeedRequest, opts ...grpc.CallOption) (*content.GetFeedResponse, error) { + m.ctrl.T.Helper() + varargs := []interface{}{ctx, in} + for _, a := range opts { + varargs = append(varargs, a) + } + ret := m.ctrl.Call(m, "GetFeed", varargs...) + ret0, _ := ret[0].(*content.GetFeedResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetFeed indicates an expected call of GetFeed. +func (mr *MockContentServiceClientMockRecorder) GetFeed(ctx, in interface{}, opts ...interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + varargs := append([]interface{}{ctx, in}, opts...) + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetFeed", reflect.TypeOf((*MockContentServiceClient)(nil).GetFeed), varargs...) +} + // GetFeeds mocks base method. func (m *MockContentServiceClient) GetFeeds(ctx context.Context, in *content.GetFeedsRequest, opts ...grpc.CallOption) (*content.GetFeedsResponse, error) { m.ctrl.T.Helper() @@ -184,6 +204,21 @@ func (mr *MockContentServiceServerMockRecorder) GetArticles(arg0, arg1 interface return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetArticles", reflect.TypeOf((*MockContentServiceServer)(nil).GetArticles), arg0, arg1) } +// GetFeed mocks base method. +func (m *MockContentServiceServer) GetFeed(arg0 context.Context, arg1 *content.GetFeedRequest) (*content.GetFeedResponse, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetFeed", arg0, arg1) + ret0, _ := ret[0].(*content.GetFeedResponse) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetFeed indicates an expected call of GetFeed. +func (mr *MockContentServiceServerMockRecorder) GetFeed(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetFeed", reflect.TypeOf((*MockContentServiceServer)(nil).GetFeed), arg0, arg1) +} + // GetFeeds mocks base method. func (m *MockContentServiceServer) GetFeeds(arg0 context.Context, arg1 *content.GetFeedsRequest) (*content.GetFeedsResponse, error) { m.ctrl.T.Helper() diff --git a/micro-service/my-feed-service/grpc/content/content.pb.go b/micro-service/my-feed-service/grpc/content/content.pb.go index 616ef59a..fa6021bb 100644 --- a/micro-service/my-feed-service/grpc/content/content.pb.go +++ b/micro-service/my-feed-service/grpc/content/content.pb.go @@ -550,6 +550,108 @@ func (x *GetFeedsRequest) GetLimit() int64 { return 0 } +type GetFeedResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Feed *Feed `protobuf:"bytes,1,opt,name=feed,proto3" json:"feed,omitempty"` +} + +func (x *GetFeedResponse) Reset() { + *x = GetFeedResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_content_content_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetFeedResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetFeedResponse) ProtoMessage() {} + +func (x *GetFeedResponse) ProtoReflect() protoreflect.Message { + mi := &file_content_content_proto_msgTypes[8] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetFeedResponse.ProtoReflect.Descriptor instead. +func (*GetFeedResponse) Descriptor() ([]byte, []int) { + return file_content_content_proto_rawDescGZIP(), []int{8} +} + +func (x *GetFeedResponse) GetFeed() *Feed { + if x != nil { + return x.Feed + } + return nil +} + +type GetFeedRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + FeedId string `protobuf:"bytes,1,opt,name=feed_id,json=feedId,proto3" json:"feed_id,omitempty"` + UserId string `protobuf:"bytes,2,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"` +} + +func (x *GetFeedRequest) Reset() { + *x = GetFeedRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_content_content_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetFeedRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetFeedRequest) ProtoMessage() {} + +func (x *GetFeedRequest) ProtoReflect() protoreflect.Message { + mi := &file_content_content_proto_msgTypes[9] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetFeedRequest.ProtoReflect.Descriptor instead. +func (*GetFeedRequest) Descriptor() ([]byte, []int) { + return file_content_content_proto_rawDescGZIP(), []int{9} +} + +func (x *GetFeedRequest) GetFeedId() string { + if x != nil { + return x.FeedId + } + return "" +} + +func (x *GetFeedRequest) GetUserId() string { + if x != nil { + return x.UserId + } + return "" +} + type PageInfo struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -562,7 +664,7 @@ type PageInfo struct { func (x *PageInfo) Reset() { *x = PageInfo{} if protoimpl.UnsafeEnabled { - mi := &file_content_content_proto_msgTypes[8] + mi := &file_content_content_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -575,7 +677,7 @@ func (x *PageInfo) String() string { func (*PageInfo) ProtoMessage() {} func (x *PageInfo) ProtoReflect() protoreflect.Message { - mi := &file_content_content_proto_msgTypes[8] + mi := &file_content_content_proto_msgTypes[10] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -588,7 +690,7 @@ func (x *PageInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use PageInfo.ProtoReflect.Descriptor instead. func (*PageInfo) Descriptor() ([]byte, []int) { - return file_content_content_proto_rawDescGZIP(), []int{8} + return file_content_content_proto_rawDescGZIP(), []int{10} } func (x *PageInfo) GetEndCursor() string { @@ -629,7 +731,7 @@ type Feed struct { func (x *Feed) Reset() { *x = Feed{} if protoimpl.UnsafeEnabled { - mi := &file_content_content_proto_msgTypes[9] + mi := &file_content_content_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -642,7 +744,7 @@ func (x *Feed) String() string { func (*Feed) ProtoMessage() {} func (x *Feed) ProtoReflect() protoreflect.Message { - mi := &file_content_content_proto_msgTypes[9] + mi := &file_content_content_proto_msgTypes[11] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -655,7 +757,7 @@ func (x *Feed) ProtoReflect() protoreflect.Message { // Deprecated: Use Feed.ProtoReflect.Descriptor instead. func (*Feed) Descriptor() ([]byte, []int) { - return file_content_content_proto_rawDescGZIP(), []int{9} + return file_content_content_proto_rawDescGZIP(), []int{11} } func (x *Feed) GetId() string { @@ -772,7 +874,7 @@ type Category struct { func (x *Category) Reset() { *x = Category{} if protoimpl.UnsafeEnabled { - mi := &file_content_content_proto_msgTypes[10] + mi := &file_content_content_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -785,7 +887,7 @@ func (x *Category) String() string { func (*Category) ProtoMessage() {} func (x *Category) ProtoReflect() protoreflect.Message { - mi := &file_content_content_proto_msgTypes[10] + mi := &file_content_content_proto_msgTypes[12] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -798,7 +900,7 @@ func (x *Category) ProtoReflect() protoreflect.Message { // Deprecated: Use Category.ProtoReflect.Descriptor instead. func (*Category) Descriptor() ([]byte, []int) { - return file_content_content_proto_rawDescGZIP(), []int{10} + return file_content_content_proto_rawDescGZIP(), []int{12} } func (x *Category) GetId() string { @@ -862,7 +964,7 @@ type Platform struct { func (x *Platform) Reset() { *x = Platform{} if protoimpl.UnsafeEnabled { - mi := &file_content_content_proto_msgTypes[11] + mi := &file_content_content_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -875,7 +977,7 @@ func (x *Platform) String() string { func (*Platform) ProtoMessage() {} func (x *Platform) ProtoReflect() protoreflect.Message { - mi := &file_content_content_proto_msgTypes[11] + mi := &file_content_content_proto_msgTypes[13] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -888,7 +990,7 @@ func (x *Platform) ProtoReflect() protoreflect.Message { // Deprecated: Use Platform.ProtoReflect.Descriptor instead. func (*Platform) Descriptor() ([]byte, []int) { - return file_content_content_proto_rawDescGZIP(), []int{11} + return file_content_content_proto_rawDescGZIP(), []int{13} } func (x *Platform) GetId() string { @@ -984,7 +1086,7 @@ type Article struct { func (x *Article) Reset() { *x = Article{} if protoimpl.UnsafeEnabled { - mi := &file_content_content_proto_msgTypes[12] + mi := &file_content_content_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -997,7 +1099,7 @@ func (x *Article) String() string { func (*Article) ProtoMessage() {} func (x *Article) ProtoReflect() protoreflect.Message { - mi := &file_content_content_proto_msgTypes[12] + mi := &file_content_content_proto_msgTypes[14] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1010,7 +1112,7 @@ func (x *Article) ProtoReflect() protoreflect.Message { // Deprecated: Use Article.ProtoReflect.Descriptor instead. func (*Article) Descriptor() ([]byte, []int) { - return file_content_content_proto_rawDescGZIP(), []int{12} + return file_content_content_proto_rawDescGZIP(), []int{14} } func (x *Article) GetId() string { @@ -1165,7 +1267,7 @@ type ArticleEdge struct { func (x *ArticleEdge) Reset() { *x = ArticleEdge{} if protoimpl.UnsafeEnabled { - mi := &file_content_content_proto_msgTypes[13] + mi := &file_content_content_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1178,7 +1280,7 @@ func (x *ArticleEdge) String() string { func (*ArticleEdge) ProtoMessage() {} func (x *ArticleEdge) ProtoReflect() protoreflect.Message { - mi := &file_content_content_proto_msgTypes[13] + mi := &file_content_content_proto_msgTypes[15] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1191,7 +1293,7 @@ func (x *ArticleEdge) ProtoReflect() protoreflect.Message { // Deprecated: Use ArticleEdge.ProtoReflect.Descriptor instead. func (*ArticleEdge) Descriptor() ([]byte, []int) { - return file_content_content_proto_rawDescGZIP(), []int{13} + return file_content_content_proto_rawDescGZIP(), []int{15} } func (x *ArticleEdge) GetArticle() *Article { @@ -1220,7 +1322,7 @@ type FeedEdge struct { func (x *FeedEdge) Reset() { *x = FeedEdge{} if protoimpl.UnsafeEnabled { - mi := &file_content_content_proto_msgTypes[14] + mi := &file_content_content_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1233,7 +1335,7 @@ func (x *FeedEdge) String() string { func (*FeedEdge) ProtoMessage() {} func (x *FeedEdge) ProtoReflect() protoreflect.Message { - mi := &file_content_content_proto_msgTypes[14] + mi := &file_content_content_proto_msgTypes[16] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1246,7 +1348,7 @@ func (x *FeedEdge) ProtoReflect() protoreflect.Message { // Deprecated: Use FeedEdge.ProtoReflect.Descriptor instead. func (*FeedEdge) Descriptor() ([]byte, []int) { - return file_content_content_proto_rawDescGZIP(), []int{14} + return file_content_content_proto_rawDescGZIP(), []int{16} } func (x *FeedEdge) GetFeed() *Feed { @@ -1280,7 +1382,7 @@ type OGP struct { func (x *OGP) Reset() { *x = OGP{} if protoimpl.UnsafeEnabled { - mi := &file_content_content_proto_msgTypes[15] + mi := &file_content_content_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1293,7 +1395,7 @@ func (x *OGP) String() string { func (*OGP) ProtoMessage() {} func (x *OGP) ProtoReflect() protoreflect.Message { - mi := &file_content_content_proto_msgTypes[15] + mi := &file_content_content_proto_msgTypes[17] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1306,7 +1408,7 @@ func (x *OGP) ProtoReflect() protoreflect.Message { // Deprecated: Use OGP.ProtoReflect.Descriptor instead. func (*OGP) Descriptor() ([]byte, []int) { - return file_content_content_proto_rawDescGZIP(), []int{15} + return file_content_content_proto_rawDescGZIP(), []int{17} } func (x *OGP) GetTitle() string { @@ -1455,201 +1557,215 @@ var file_content_content_proto_rawDesc = []byte{ 0x75, 0x65, 0x52, 0x07, 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x22, 0x4d, 0x0a, 0x08, 0x50, 0x61, 0x67, - 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1d, 0x0a, 0x0a, 0x65, 0x6e, 0x64, 0x5f, 0x63, 0x75, 0x72, - 0x73, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x65, 0x6e, 0x64, 0x43, 0x75, - 0x72, 0x73, 0x6f, 0x72, 0x12, 0x22, 0x0a, 0x0d, 0x68, 0x61, 0x73, 0x5f, 0x6e, 0x65, 0x78, 0x74, - 0x5f, 0x70, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x68, 0x61, 0x73, - 0x4e, 0x65, 0x78, 0x74, 0x50, 0x61, 0x67, 0x65, 0x22, 0xe6, 0x04, 0x0a, 0x04, 0x46, 0x65, 0x65, - 0x64, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, - 0x64, 0x12, 0x3b, 0x0a, 0x08, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x69, 0x63, 0x6b, 0x73, - 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x6c, 0x61, 0x74, - 0x66, 0x6f, 0x72, 0x6d, 0x52, 0x08, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x12, 0x3b, - 0x0a, 0x08, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1f, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x69, 0x63, 0x6b, 0x73, 0x2e, 0x63, 0x6f, - 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, - 0x79, 0x52, 0x08, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x12, 0x1e, 0x0a, 0x0b, 0x6d, - 0x79, 0x5f, 0x66, 0x65, 0x65, 0x64, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, - 0x52, 0x09, 0x6d, 0x79, 0x46, 0x65, 0x65, 0x64, 0x49, 0x64, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, - 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x12, 0x17, 0x0a, 0x07, 0x72, 0x73, 0x73, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x07, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x06, 0x72, 0x73, 0x73, 0x55, 0x72, 0x6c, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x69, - 0x74, 0x65, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x69, - 0x74, 0x65, 0x55, 0x72, 0x6c, 0x12, 0x23, 0x0a, 0x0d, 0x74, 0x68, 0x75, 0x6d, 0x62, 0x6e, 0x61, - 0x69, 0x6c, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x74, 0x68, - 0x75, 0x6d, 0x62, 0x6e, 0x61, 0x69, 0x6c, 0x55, 0x72, 0x6c, 0x12, 0x2e, 0x0a, 0x13, 0x74, 0x72, - 0x65, 0x6e, 0x64, 0x5f, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x5f, 0x74, 0x79, 0x70, - 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x74, 0x72, 0x65, 0x6e, 0x64, 0x50, 0x6c, - 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x12, 0x44, 0x0a, 0x0f, 0x61, 0x70, - 0x69, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x18, 0x0b, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, - 0x65, 0x52, 0x0d, 0x61, 0x70, 0x69, 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, 0x61, 0x72, 0x61, 0x6d, - 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x0c, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, - 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x75, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x75, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x64, 0x5f, 0x61, 0x74, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, - 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x41, - 0x74, 0x22, 0xf3, 0x01, 0x0a, 0x08, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x12, 0x0e, - 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, - 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x64, 0x5f, 0x61, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, - 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, - 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, - 0x70, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, - 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x64, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x64, 0x41, 0x74, 0x22, 0xe0, 0x02, 0x0a, 0x08, 0x50, 0x6c, 0x61, 0x74, - 0x66, 0x6f, 0x72, 0x6d, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x69, 0x74, 0x65, - 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x69, 0x74, 0x65, - 0x55, 0x72, 0x6c, 0x12, 0x2c, 0x0a, 0x12, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x5f, - 0x73, 0x69, 0x74, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x10, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x53, 0x69, 0x74, 0x65, 0x54, 0x79, 0x70, - 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x66, 0x61, 0x76, 0x69, 0x63, 0x6f, 0x6e, 0x5f, 0x75, 0x72, 0x6c, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x66, 0x61, 0x76, 0x69, 0x63, 0x6f, 0x6e, 0x55, - 0x72, 0x6c, 0x12, 0x15, 0x0a, 0x06, 0x69, 0x73, 0x5f, 0x65, 0x6e, 0x67, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x05, 0x69, 0x73, 0x45, 0x6e, 0x67, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, + 0x28, 0x03, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x22, 0x42, 0x0a, 0x0f, 0x47, 0x65, 0x74, + 0x46, 0x65, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2f, 0x0a, 0x04, + 0x66, 0x65, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x63, 0x68, 0x65, + 0x63, 0x6b, 0x70, 0x69, 0x63, 0x6b, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, + 0x76, 0x31, 0x2e, 0x46, 0x65, 0x65, 0x64, 0x52, 0x04, 0x66, 0x65, 0x65, 0x64, 0x22, 0x42, 0x0a, + 0x0e, 0x47, 0x65, 0x74, 0x46, 0x65, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x17, 0x0a, 0x07, 0x66, 0x65, 0x65, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x06, 0x66, 0x65, 0x65, 0x64, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, + 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, + 0x64, 0x22, 0x4d, 0x0a, 0x08, 0x50, 0x61, 0x67, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1d, 0x0a, + 0x0a, 0x65, 0x6e, 0x64, 0x5f, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x09, 0x65, 0x6e, 0x64, 0x43, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x12, 0x22, 0x0a, 0x0d, + 0x68, 0x61, 0x73, 0x5f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x0b, 0x68, 0x61, 0x73, 0x4e, 0x65, 0x78, 0x74, 0x50, 0x61, 0x67, 0x65, + 0x22, 0xe6, 0x04, 0x0a, 0x04, 0x46, 0x65, 0x65, 0x64, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x3b, 0x0a, 0x08, 0x70, 0x6c, 0x61, + 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x63, 0x68, + 0x65, 0x63, 0x6b, 0x70, 0x69, 0x63, 0x6b, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, + 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x52, 0x08, 0x70, 0x6c, + 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x12, 0x3b, 0x0a, 0x08, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, + 0x72, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, + 0x70, 0x69, 0x63, 0x6b, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x76, 0x31, + 0x2e, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x52, 0x08, 0x63, 0x61, 0x74, 0x65, 0x67, + 0x6f, 0x72, 0x79, 0x12, 0x1e, 0x0a, 0x0b, 0x6d, 0x79, 0x5f, 0x66, 0x65, 0x65, 0x64, 0x5f, 0x69, + 0x64, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x6d, 0x79, 0x46, 0x65, 0x65, 0x64, + 0x49, 0x64, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x17, 0x0a, 0x07, 0x72, 0x73, 0x73, + 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x73, 0x73, 0x55, + 0x72, 0x6c, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x69, 0x74, 0x65, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x08, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x69, 0x74, 0x65, 0x55, 0x72, 0x6c, 0x12, 0x23, 0x0a, + 0x0d, 0x74, 0x68, 0x75, 0x6d, 0x62, 0x6e, 0x61, 0x69, 0x6c, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x09, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x74, 0x68, 0x75, 0x6d, 0x62, 0x6e, 0x61, 0x69, 0x6c, 0x55, + 0x72, 0x6c, 0x12, 0x2e, 0x0a, 0x13, 0x74, 0x72, 0x65, 0x6e, 0x64, 0x5f, 0x70, 0x6c, 0x61, 0x74, + 0x66, 0x6f, 0x72, 0x6d, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x11, 0x74, 0x72, 0x65, 0x6e, 0x64, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x54, 0x79, + 0x70, 0x65, 0x12, 0x44, 0x0a, 0x0f, 0x61, 0x70, 0x69, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, + 0x70, 0x61, 0x72, 0x61, 0x6d, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0d, 0x61, 0x70, 0x69, 0x51, 0x75, + 0x65, 0x72, 0x79, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, + 0x74, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, + 0x0a, 0x0a, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x0e, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, + 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x41, 0x74, 0x22, 0xf3, 0x01, 0x0a, 0x08, 0x43, 0x61, + 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, + 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x39, + 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, + 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x75, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, - 0x61, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x5f, + 0x61, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, - 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, - 0x39, 0x0a, 0x0a, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x09, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, - 0x09, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x41, 0x74, 0x22, 0xe3, 0x06, 0x0a, 0x07, 0x41, - 0x72, 0x74, 0x69, 0x63, 0x6c, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x3b, 0x0a, 0x08, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, - 0x72, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, - 0x70, 0x69, 0x63, 0x6b, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x76, 0x31, - 0x2e, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x52, 0x08, 0x70, 0x6c, 0x61, 0x74, 0x66, - 0x6f, 0x72, 0x6d, 0x12, 0x31, 0x0a, 0x05, 0x66, 0x65, 0x65, 0x64, 0x73, 0x18, 0x03, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x69, 0x63, 0x6b, 0x73, 0x2e, - 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x46, 0x65, 0x65, 0x64, 0x52, - 0x05, 0x66, 0x65, 0x65, 0x64, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x12, 0x20, 0x0a, 0x0b, - 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1f, - 0x0a, 0x0b, 0x61, 0x72, 0x74, 0x69, 0x63, 0x6c, 0x65, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0a, 0x61, 0x72, 0x74, 0x69, 0x63, 0x6c, 0x65, 0x55, 0x72, 0x6c, 0x12, - 0x3d, 0x0a, 0x0c, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, + 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x41, 0x74, 0x22, + 0xe0, 0x02, 0x0a, 0x08, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x12, 0x0e, 0x0a, 0x02, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x12, 0x19, 0x0a, 0x08, 0x73, 0x69, 0x74, 0x65, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x07, 0x73, 0x69, 0x74, 0x65, 0x55, 0x72, 0x6c, 0x12, 0x2c, 0x0a, 0x12, 0x70, + 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x5f, 0x73, 0x69, 0x74, 0x65, 0x5f, 0x74, 0x79, 0x70, + 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, + 0x6d, 0x53, 0x69, 0x74, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x66, 0x61, 0x76, + 0x69, 0x63, 0x6f, 0x6e, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, + 0x66, 0x61, 0x76, 0x69, 0x63, 0x6f, 0x6e, 0x55, 0x72, 0x6c, 0x12, 0x15, 0x0a, 0x06, 0x69, 0x73, + 0x5f, 0x65, 0x6e, 0x67, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x69, 0x73, 0x45, 0x6e, + 0x67, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, - 0x70, 0x52, 0x0b, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x65, 0x64, 0x41, 0x74, 0x12, 0x3d, - 0x0a, 0x0b, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x08, 0x20, + 0x70, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, + 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x75, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x64, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, + 0x41, 0x74, 0x22, 0xe3, 0x06, 0x0a, 0x07, 0x41, 0x72, 0x74, 0x69, 0x63, 0x6c, 0x65, 0x12, 0x0e, + 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x3b, + 0x0a, 0x08, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1f, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x69, 0x63, 0x6b, 0x73, 0x2e, 0x63, 0x6f, + 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, + 0x6d, 0x52, 0x08, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x12, 0x31, 0x0a, 0x05, 0x66, + 0x65, 0x65, 0x64, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x63, 0x68, 0x65, + 0x63, 0x6b, 0x70, 0x69, 0x63, 0x6b, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, + 0x76, 0x31, 0x2e, 0x46, 0x65, 0x65, 0x64, 0x52, 0x05, 0x66, 0x65, 0x65, 0x64, 0x73, 0x12, 0x14, + 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, + 0x69, 0x74, 0x6c, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x72, 0x74, 0x69, 0x63, 0x6c, + 0x65, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x61, 0x72, 0x74, + 0x69, 0x63, 0x6c, 0x65, 0x55, 0x72, 0x6c, 0x12, 0x3d, 0x0a, 0x0c, 0x70, 0x75, 0x62, 0x6c, 0x69, + 0x73, 0x68, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0b, 0x70, 0x75, 0x62, 0x6c, 0x69, + 0x73, 0x68, 0x65, 0x64, 0x41, 0x74, 0x12, 0x3d, 0x0a, 0x0b, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0a, 0x61, 0x75, 0x74, 0x68, 0x6f, + 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x30, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, - 0x65, 0x52, 0x0a, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x30, 0x0a, - 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, - 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x12, - 0x23, 0x0a, 0x0d, 0x74, 0x68, 0x75, 0x6d, 0x62, 0x6e, 0x61, 0x69, 0x6c, 0x5f, 0x75, 0x72, 0x6c, - 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x74, 0x68, 0x75, 0x6d, 0x62, 0x6e, 0x61, 0x69, - 0x6c, 0x55, 0x72, 0x6c, 0x12, 0x15, 0x0a, 0x06, 0x69, 0x73, 0x5f, 0x65, 0x6e, 0x67, 0x18, 0x0b, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x69, 0x73, 0x45, 0x6e, 0x67, 0x12, 0x1d, 0x0a, 0x0a, 0x69, - 0x73, 0x5f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x09, 0x69, 0x73, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x12, 0x3d, 0x0a, 0x0b, 0x62, 0x6f, - 0x6f, 0x6b, 0x6d, 0x61, 0x72, 0x6b, 0x5f, 0x69, 0x64, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0a, 0x62, - 0x6f, 0x6f, 0x6b, 0x6d, 0x61, 0x72, 0x6b, 0x49, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x69, 0x73, 0x5f, - 0x62, 0x6f, 0x6f, 0x6b, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x64, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x0c, 0x69, 0x73, 0x42, 0x6f, 0x6f, 0x6b, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x64, 0x12, 0x21, - 0x0a, 0x0c, 0x69, 0x73, 0x5f, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x69, 0x6e, 0x67, 0x18, 0x0f, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x69, 0x73, 0x46, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x69, 0x6e, - 0x67, 0x12, 0x3d, 0x0a, 0x1b, 0x66, 0x61, 0x76, 0x6f, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x61, 0x72, - 0x74, 0x69, 0x63, 0x6c, 0x65, 0x5f, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x73, - 0x18, 0x10, 0x20, 0x03, 0x28, 0x09, 0x52, 0x18, 0x66, 0x61, 0x76, 0x6f, 0x72, 0x69, 0x74, 0x65, - 0x41, 0x72, 0x74, 0x69, 0x63, 0x6c, 0x65, 0x46, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x49, 0x64, 0x73, - 0x12, 0x1d, 0x0a, 0x0a, 0x6c, 0x69, 0x6b, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x11, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x6c, 0x69, 0x6b, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, - 0x19, 0x0a, 0x08, 0x69, 0x73, 0x5f, 0x74, 0x72, 0x65, 0x6e, 0x64, 0x18, 0x12, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x07, 0x69, 0x73, 0x54, 0x72, 0x65, 0x6e, 0x64, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x13, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, - 0x5f, 0x61, 0x74, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, - 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, - 0x22, 0x5f, 0x0a, 0x0b, 0x41, 0x72, 0x74, 0x69, 0x63, 0x6c, 0x65, 0x45, 0x64, 0x67, 0x65, 0x12, - 0x38, 0x0a, 0x07, 0x61, 0x72, 0x74, 0x69, 0x63, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1e, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x69, 0x63, 0x6b, 0x73, 0x2e, 0x63, 0x6f, - 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x72, 0x74, 0x69, 0x63, 0x6c, 0x65, - 0x52, 0x07, 0x61, 0x72, 0x74, 0x69, 0x63, 0x6c, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x75, 0x72, - 0x73, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, - 0x72, 0x22, 0x53, 0x0a, 0x08, 0x46, 0x65, 0x65, 0x64, 0x45, 0x64, 0x67, 0x65, 0x12, 0x2f, 0x0a, - 0x04, 0x66, 0x65, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x63, 0x68, + 0x65, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x74, 0x68, 0x75, 0x6d, 0x62, + 0x6e, 0x61, 0x69, 0x6c, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, + 0x74, 0x68, 0x75, 0x6d, 0x62, 0x6e, 0x61, 0x69, 0x6c, 0x55, 0x72, 0x6c, 0x12, 0x15, 0x0a, 0x06, + 0x69, 0x73, 0x5f, 0x65, 0x6e, 0x67, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x69, 0x73, + 0x45, 0x6e, 0x67, 0x12, 0x1d, 0x0a, 0x0a, 0x69, 0x73, 0x5f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, + 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x69, 0x73, 0x50, 0x72, 0x69, 0x76, 0x61, + 0x74, 0x65, 0x12, 0x3d, 0x0a, 0x0b, 0x62, 0x6f, 0x6f, 0x6b, 0x6d, 0x61, 0x72, 0x6b, 0x5f, 0x69, + 0x64, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0a, 0x62, 0x6f, 0x6f, 0x6b, 0x6d, 0x61, 0x72, 0x6b, 0x49, + 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x69, 0x73, 0x5f, 0x62, 0x6f, 0x6f, 0x6b, 0x6d, 0x61, 0x72, 0x6b, + 0x65, 0x64, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x69, 0x73, 0x42, 0x6f, 0x6f, 0x6b, + 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x69, 0x73, 0x5f, 0x66, 0x6f, 0x6c, + 0x6c, 0x6f, 0x77, 0x69, 0x6e, 0x67, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x69, 0x73, + 0x46, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x69, 0x6e, 0x67, 0x12, 0x3d, 0x0a, 0x1b, 0x66, 0x61, 0x76, + 0x6f, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x61, 0x72, 0x74, 0x69, 0x63, 0x6c, 0x65, 0x5f, 0x66, 0x6f, + 0x6c, 0x64, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x10, 0x20, 0x03, 0x28, 0x09, 0x52, 0x18, + 0x66, 0x61, 0x76, 0x6f, 0x72, 0x69, 0x74, 0x65, 0x41, 0x72, 0x74, 0x69, 0x63, 0x6c, 0x65, 0x46, + 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x49, 0x64, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x6c, 0x69, 0x6b, 0x65, + 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x11, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x6c, 0x69, + 0x6b, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x69, 0x73, 0x5f, 0x74, 0x72, + 0x65, 0x6e, 0x64, 0x18, 0x12, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x69, 0x73, 0x54, 0x72, 0x65, + 0x6e, 0x64, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, + 0x18, 0x13, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, + 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x14, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x75, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x22, 0x5f, 0x0a, 0x0b, 0x41, 0x72, 0x74, 0x69, + 0x63, 0x6c, 0x65, 0x45, 0x64, 0x67, 0x65, 0x12, 0x38, 0x0a, 0x07, 0x61, 0x72, 0x74, 0x69, 0x63, + 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, + 0x70, 0x69, 0x63, 0x6b, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x76, 0x31, + 0x2e, 0x41, 0x72, 0x74, 0x69, 0x63, 0x6c, 0x65, 0x52, 0x07, 0x61, 0x72, 0x74, 0x69, 0x63, 0x6c, + 0x65, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x22, 0x53, 0x0a, 0x08, 0x46, 0x65, 0x65, + 0x64, 0x45, 0x64, 0x67, 0x65, 0x12, 0x2f, 0x0a, 0x04, 0x66, 0x65, 0x65, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x69, 0x63, 0x6b, 0x73, + 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x46, 0x65, 0x65, 0x64, + 0x52, 0x04, 0x66, 0x65, 0x65, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x22, 0xfa, + 0x01, 0x0a, 0x03, 0x4f, 0x47, 0x50, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x12, 0x3e, 0x0a, 0x0b, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, + 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1f, 0x0a, 0x0b, + 0x61, 0x72, 0x74, 0x69, 0x63, 0x6c, 0x65, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0a, 0x61, 0x72, 0x74, 0x69, 0x63, 0x6c, 0x65, 0x55, 0x72, 0x6c, 0x12, 0x19, 0x0a, + 0x08, 0x73, 0x69, 0x74, 0x65, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x07, 0x73, 0x69, 0x74, 0x65, 0x55, 0x72, 0x6c, 0x12, 0x1b, 0x0a, 0x09, 0x73, 0x69, 0x74, 0x65, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x69, 0x74, + 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x74, 0x68, 0x75, 0x6d, 0x62, 0x6e, 0x61, + 0x69, 0x6c, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x74, 0x68, + 0x75, 0x6d, 0x62, 0x6e, 0x61, 0x69, 0x6c, 0x55, 0x72, 0x6c, 0x12, 0x1f, 0x0a, 0x0b, 0x66, 0x61, + 0x76, 0x69, 0x63, 0x6f, 0x6e, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0a, 0x66, 0x61, 0x76, 0x69, 0x63, 0x6f, 0x6e, 0x55, 0x72, 0x6c, 0x32, 0x91, 0x04, 0x0a, 0x0e, + 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x64, + 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x41, 0x72, 0x74, 0x69, 0x63, 0x6c, 0x65, 0x73, 0x12, 0x29, 0x2e, + 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x69, 0x63, 0x6b, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, + 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x72, 0x74, 0x69, 0x63, 0x6c, 0x65, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, + 0x70, 0x69, 0x63, 0x6b, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x76, 0x31, + 0x2e, 0x47, 0x65, 0x74, 0x41, 0x72, 0x74, 0x69, 0x63, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x76, 0x0a, 0x13, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, 0x70, + 0x6c, 0x6f, 0x61, 0x64, 0x41, 0x72, 0x74, 0x69, 0x63, 0x6c, 0x65, 0x12, 0x31, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x69, 0x63, 0x6b, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, - 0x2e, 0x76, 0x31, 0x2e, 0x46, 0x65, 0x65, 0x64, 0x52, 0x04, 0x66, 0x65, 0x65, 0x64, 0x12, 0x16, - 0x0a, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, - 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x22, 0xfa, 0x01, 0x0a, 0x03, 0x4f, 0x47, 0x50, 0x12, 0x14, - 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, - 0x69, 0x74, 0x6c, 0x65, 0x12, 0x3e, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x69, - 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x72, 0x74, 0x69, 0x63, 0x6c, 0x65, 0x5f, - 0x75, 0x72, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x61, 0x72, 0x74, 0x69, 0x63, - 0x6c, 0x65, 0x55, 0x72, 0x6c, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x69, 0x74, 0x65, 0x5f, 0x75, 0x72, - 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x69, 0x74, 0x65, 0x55, 0x72, 0x6c, - 0x12, 0x1b, 0x0a, 0x09, 0x73, 0x69, 0x74, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x69, 0x74, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x23, 0x0a, - 0x0d, 0x74, 0x68, 0x75, 0x6d, 0x62, 0x6e, 0x61, 0x69, 0x6c, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x74, 0x68, 0x75, 0x6d, 0x62, 0x6e, 0x61, 0x69, 0x6c, 0x55, - 0x72, 0x6c, 0x12, 0x1f, 0x0a, 0x0b, 0x66, 0x61, 0x76, 0x69, 0x63, 0x6f, 0x6e, 0x5f, 0x75, 0x72, - 0x6c, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x66, 0x61, 0x76, 0x69, 0x63, 0x6f, 0x6e, - 0x55, 0x72, 0x6c, 0x32, 0xb7, 0x03, 0x0a, 0x0e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x64, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x41, 0x72, 0x74, - 0x69, 0x63, 0x6c, 0x65, 0x73, 0x12, 0x29, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x69, 0x63, - 0x6b, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, - 0x74, 0x41, 0x72, 0x74, 0x69, 0x63, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x2a, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x69, 0x63, 0x6b, 0x73, 0x2e, 0x63, 0x6f, - 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x72, 0x74, 0x69, - 0x63, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x76, 0x0a, 0x13, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x41, 0x72, 0x74, 0x69, - 0x63, 0x6c, 0x65, 0x12, 0x31, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x69, 0x63, 0x6b, 0x73, - 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x41, 0x72, 0x74, 0x69, 0x63, 0x6c, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x69, - 0x63, 0x6b, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, 0x72, 0x74, 0x69, 0x63, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6a, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x41, 0x72, 0x74, 0x69, 0x63, - 0x6c, 0x65, 0x4f, 0x47, 0x50, 0x12, 0x2b, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x69, 0x63, - 0x6b, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, - 0x74, 0x41, 0x72, 0x74, 0x69, 0x63, 0x6c, 0x65, 0x4f, 0x47, 0x50, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x69, 0x63, 0x6b, 0x73, 0x2e, - 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x72, - 0x74, 0x69, 0x63, 0x6c, 0x65, 0x4f, 0x47, 0x50, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x5b, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x46, 0x65, 0x65, 0x64, 0x73, 0x12, 0x26, 0x2e, 0x63, - 0x68, 0x65, 0x63, 0x6b, 0x70, 0x69, 0x63, 0x6b, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, - 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x65, 0x65, 0x64, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x69, 0x63, 0x6b, + 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, + 0x41, 0x72, 0x74, 0x69, 0x63, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, + 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x69, 0x63, 0x6b, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x74, + 0x65, 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, 0x72, 0x74, + 0x69, 0x63, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6a, 0x0a, 0x0d, + 0x47, 0x65, 0x74, 0x41, 0x72, 0x74, 0x69, 0x63, 0x6c, 0x65, 0x4f, 0x47, 0x50, 0x12, 0x2b, 0x2e, + 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x69, 0x63, 0x6b, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, + 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x72, 0x74, 0x69, 0x63, 0x6c, 0x65, + 0x4f, 0x47, 0x50, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x63, 0x68, 0x65, + 0x63, 0x6b, 0x70, 0x69, 0x63, 0x6b, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, + 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x72, 0x74, 0x69, 0x63, 0x6c, 0x65, 0x4f, 0x47, 0x50, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5b, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x46, + 0x65, 0x65, 0x64, 0x73, 0x12, 0x26, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x69, 0x63, 0x6b, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, - 0x46, 0x65, 0x65, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x2d, 0x5a, - 0x2b, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x59, 0x75, 0x6b, 0x69, - 0x4f, 0x6e, 0x69, 0x73, 0x68, 0x69, 0x31, 0x31, 0x32, 0x39, 0x2f, 0x74, 0x65, 0x63, 0x68, 0x70, - 0x69, 0x63, 0x6b, 0x73, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x62, 0x06, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x33, + 0x46, 0x65, 0x65, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x63, + 0x68, 0x65, 0x63, 0x6b, 0x70, 0x69, 0x63, 0x6b, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, + 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x65, 0x65, 0x64, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x58, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x46, 0x65, 0x65, 0x64, + 0x12, 0x25, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x69, 0x63, 0x6b, 0x73, 0x2e, 0x63, 0x6f, + 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x65, 0x65, 0x64, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, + 0x69, 0x63, 0x6b, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x2e, + 0x47, 0x65, 0x74, 0x46, 0x65, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, + 0x2d, 0x5a, 0x2b, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x59, 0x75, + 0x6b, 0x69, 0x4f, 0x6e, 0x69, 0x73, 0x68, 0x69, 0x31, 0x31, 0x32, 0x39, 0x2f, 0x74, 0x65, 0x63, + 0x68, 0x70, 0x69, 0x63, 0x6b, 0x73, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x62, 0x06, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -1664,7 +1780,7 @@ func file_content_content_proto_rawDescGZIP() []byte { return file_content_content_proto_rawDescData } -var file_content_content_proto_msgTypes = make([]protoimpl.MessageInfo, 16) +var file_content_content_proto_msgTypes = make([]protoimpl.MessageInfo, 18) var file_content_content_proto_goTypes = []any{ (*GetArticlesRequest)(nil), // 0: checkpicks.content.v1.GetArticlesRequest (*GetArticlesResponse)(nil), // 1: checkpicks.content.v1.GetArticlesResponse @@ -1674,68 +1790,73 @@ var file_content_content_proto_goTypes = []any{ (*GetArticleOGPRequest)(nil), // 5: checkpicks.content.v1.GetArticleOGPRequest (*GetFeedsResponse)(nil), // 6: checkpicks.content.v1.GetFeedsResponse (*GetFeedsRequest)(nil), // 7: checkpicks.content.v1.GetFeedsRequest - (*PageInfo)(nil), // 8: checkpicks.content.v1.PageInfo - (*Feed)(nil), // 9: checkpicks.content.v1.Feed - (*Category)(nil), // 10: checkpicks.content.v1.Category - (*Platform)(nil), // 11: checkpicks.content.v1.Platform - (*Article)(nil), // 12: checkpicks.content.v1.Article - (*ArticleEdge)(nil), // 13: checkpicks.content.v1.ArticleEdge - (*FeedEdge)(nil), // 14: checkpicks.content.v1.FeedEdge - (*OGP)(nil), // 15: checkpicks.content.v1.OGP - (*wrapperspb.StringValue)(nil), // 16: google.protobuf.StringValue - (*wrapperspb.Int64Value)(nil), // 17: google.protobuf.Int64Value - (*timestamppb.Timestamp)(nil), // 18: google.protobuf.Timestamp + (*GetFeedResponse)(nil), // 8: checkpicks.content.v1.GetFeedResponse + (*GetFeedRequest)(nil), // 9: checkpicks.content.v1.GetFeedRequest + (*PageInfo)(nil), // 10: checkpicks.content.v1.PageInfo + (*Feed)(nil), // 11: checkpicks.content.v1.Feed + (*Category)(nil), // 12: checkpicks.content.v1.Category + (*Platform)(nil), // 13: checkpicks.content.v1.Platform + (*Article)(nil), // 14: checkpicks.content.v1.Article + (*ArticleEdge)(nil), // 15: checkpicks.content.v1.ArticleEdge + (*FeedEdge)(nil), // 16: checkpicks.content.v1.FeedEdge + (*OGP)(nil), // 17: checkpicks.content.v1.OGP + (*wrapperspb.StringValue)(nil), // 18: google.protobuf.StringValue + (*wrapperspb.Int64Value)(nil), // 19: google.protobuf.Int64Value + (*timestamppb.Timestamp)(nil), // 20: google.protobuf.Timestamp } var file_content_content_proto_depIdxs = []int32{ - 16, // 0: checkpicks.content.v1.GetArticlesRequest.user_id:type_name -> google.protobuf.StringValue - 17, // 1: checkpicks.content.v1.GetArticlesRequest.language_status:type_name -> google.protobuf.Int64Value - 16, // 2: checkpicks.content.v1.GetArticlesRequest.tag:type_name -> google.protobuf.StringValue - 16, // 3: checkpicks.content.v1.GetArticlesRequest.feed_ids:type_name -> google.protobuf.StringValue - 13, // 4: checkpicks.content.v1.GetArticlesResponse.articlesEdge:type_name -> checkpicks.content.v1.ArticleEdge - 8, // 5: checkpicks.content.v1.GetArticlesResponse.page_info:type_name -> checkpicks.content.v1.PageInfo - 12, // 6: checkpicks.content.v1.CreateArticleResponse.article:type_name -> checkpicks.content.v1.Article - 15, // 7: checkpicks.content.v1.GetArticleOGPResponse.ogp:type_name -> checkpicks.content.v1.OGP - 14, // 8: checkpicks.content.v1.GetFeedsResponse.feed_edge:type_name -> checkpicks.content.v1.FeedEdge - 8, // 9: checkpicks.content.v1.GetFeedsResponse.page_info:type_name -> checkpicks.content.v1.PageInfo - 17, // 10: checkpicks.content.v1.GetFeedsRequest.platform_site_type:type_name -> google.protobuf.Int64Value - 16, // 11: checkpicks.content.v1.GetFeedsRequest.platform_id:type_name -> google.protobuf.StringValue - 16, // 12: checkpicks.content.v1.GetFeedsRequest.keyword:type_name -> google.protobuf.StringValue - 11, // 13: checkpicks.content.v1.Feed.platform:type_name -> checkpicks.content.v1.Platform - 10, // 14: checkpicks.content.v1.Feed.category:type_name -> checkpicks.content.v1.Category - 16, // 15: checkpicks.content.v1.Feed.api_query_param:type_name -> google.protobuf.StringValue - 18, // 16: checkpicks.content.v1.Feed.created_at:type_name -> google.protobuf.Timestamp - 18, // 17: checkpicks.content.v1.Feed.updated_at:type_name -> google.protobuf.Timestamp - 18, // 18: checkpicks.content.v1.Feed.deleted_at:type_name -> google.protobuf.Timestamp - 18, // 19: checkpicks.content.v1.Category.created_at:type_name -> google.protobuf.Timestamp - 18, // 20: checkpicks.content.v1.Category.updated_at:type_name -> google.protobuf.Timestamp - 18, // 21: checkpicks.content.v1.Category.deleted_at:type_name -> google.protobuf.Timestamp - 18, // 22: checkpicks.content.v1.Platform.created_at:type_name -> google.protobuf.Timestamp - 18, // 23: checkpicks.content.v1.Platform.updated_at:type_name -> google.protobuf.Timestamp - 18, // 24: checkpicks.content.v1.Platform.deleted_at:type_name -> google.protobuf.Timestamp - 11, // 25: checkpicks.content.v1.Article.platform:type_name -> checkpicks.content.v1.Platform - 9, // 26: checkpicks.content.v1.Article.feeds:type_name -> checkpicks.content.v1.Feed - 18, // 27: checkpicks.content.v1.Article.published_at:type_name -> google.protobuf.Timestamp - 16, // 28: checkpicks.content.v1.Article.author_name:type_name -> google.protobuf.StringValue - 16, // 29: checkpicks.content.v1.Article.tags:type_name -> google.protobuf.StringValue - 16, // 30: checkpicks.content.v1.Article.bookmark_id:type_name -> google.protobuf.StringValue - 18, // 31: checkpicks.content.v1.Article.created_at:type_name -> google.protobuf.Timestamp - 18, // 32: checkpicks.content.v1.Article.updated_at:type_name -> google.protobuf.Timestamp - 12, // 33: checkpicks.content.v1.ArticleEdge.article:type_name -> checkpicks.content.v1.Article - 9, // 34: checkpicks.content.v1.FeedEdge.feed:type_name -> checkpicks.content.v1.Feed - 16, // 35: checkpicks.content.v1.OGP.description:type_name -> google.protobuf.StringValue - 0, // 36: checkpicks.content.v1.ContentService.GetArticles:input_type -> checkpicks.content.v1.GetArticlesRequest - 3, // 37: checkpicks.content.v1.ContentService.CreateUploadArticle:input_type -> checkpicks.content.v1.CreateUploadArticleRequest - 5, // 38: checkpicks.content.v1.ContentService.GetArticleOGP:input_type -> checkpicks.content.v1.GetArticleOGPRequest - 7, // 39: checkpicks.content.v1.ContentService.GetFeeds:input_type -> checkpicks.content.v1.GetFeedsRequest - 1, // 40: checkpicks.content.v1.ContentService.GetArticles:output_type -> checkpicks.content.v1.GetArticlesResponse - 2, // 41: checkpicks.content.v1.ContentService.CreateUploadArticle:output_type -> checkpicks.content.v1.CreateArticleResponse - 4, // 42: checkpicks.content.v1.ContentService.GetArticleOGP:output_type -> checkpicks.content.v1.GetArticleOGPResponse - 6, // 43: checkpicks.content.v1.ContentService.GetFeeds:output_type -> checkpicks.content.v1.GetFeedsResponse - 40, // [40:44] is the sub-list for method output_type - 36, // [36:40] is the sub-list for method input_type - 36, // [36:36] is the sub-list for extension type_name - 36, // [36:36] is the sub-list for extension extendee - 0, // [0:36] is the sub-list for field type_name + 18, // 0: checkpicks.content.v1.GetArticlesRequest.user_id:type_name -> google.protobuf.StringValue + 19, // 1: checkpicks.content.v1.GetArticlesRequest.language_status:type_name -> google.protobuf.Int64Value + 18, // 2: checkpicks.content.v1.GetArticlesRequest.tag:type_name -> google.protobuf.StringValue + 18, // 3: checkpicks.content.v1.GetArticlesRequest.feed_ids:type_name -> google.protobuf.StringValue + 15, // 4: checkpicks.content.v1.GetArticlesResponse.articlesEdge:type_name -> checkpicks.content.v1.ArticleEdge + 10, // 5: checkpicks.content.v1.GetArticlesResponse.page_info:type_name -> checkpicks.content.v1.PageInfo + 14, // 6: checkpicks.content.v1.CreateArticleResponse.article:type_name -> checkpicks.content.v1.Article + 17, // 7: checkpicks.content.v1.GetArticleOGPResponse.ogp:type_name -> checkpicks.content.v1.OGP + 16, // 8: checkpicks.content.v1.GetFeedsResponse.feed_edge:type_name -> checkpicks.content.v1.FeedEdge + 10, // 9: checkpicks.content.v1.GetFeedsResponse.page_info:type_name -> checkpicks.content.v1.PageInfo + 19, // 10: checkpicks.content.v1.GetFeedsRequest.platform_site_type:type_name -> google.protobuf.Int64Value + 18, // 11: checkpicks.content.v1.GetFeedsRequest.platform_id:type_name -> google.protobuf.StringValue + 18, // 12: checkpicks.content.v1.GetFeedsRequest.keyword:type_name -> google.protobuf.StringValue + 11, // 13: checkpicks.content.v1.GetFeedResponse.feed:type_name -> checkpicks.content.v1.Feed + 13, // 14: checkpicks.content.v1.Feed.platform:type_name -> checkpicks.content.v1.Platform + 12, // 15: checkpicks.content.v1.Feed.category:type_name -> checkpicks.content.v1.Category + 18, // 16: checkpicks.content.v1.Feed.api_query_param:type_name -> google.protobuf.StringValue + 20, // 17: checkpicks.content.v1.Feed.created_at:type_name -> google.protobuf.Timestamp + 20, // 18: checkpicks.content.v1.Feed.updated_at:type_name -> google.protobuf.Timestamp + 20, // 19: checkpicks.content.v1.Feed.deleted_at:type_name -> google.protobuf.Timestamp + 20, // 20: checkpicks.content.v1.Category.created_at:type_name -> google.protobuf.Timestamp + 20, // 21: checkpicks.content.v1.Category.updated_at:type_name -> google.protobuf.Timestamp + 20, // 22: checkpicks.content.v1.Category.deleted_at:type_name -> google.protobuf.Timestamp + 20, // 23: checkpicks.content.v1.Platform.created_at:type_name -> google.protobuf.Timestamp + 20, // 24: checkpicks.content.v1.Platform.updated_at:type_name -> google.protobuf.Timestamp + 20, // 25: checkpicks.content.v1.Platform.deleted_at:type_name -> google.protobuf.Timestamp + 13, // 26: checkpicks.content.v1.Article.platform:type_name -> checkpicks.content.v1.Platform + 11, // 27: checkpicks.content.v1.Article.feeds:type_name -> checkpicks.content.v1.Feed + 20, // 28: checkpicks.content.v1.Article.published_at:type_name -> google.protobuf.Timestamp + 18, // 29: checkpicks.content.v1.Article.author_name:type_name -> google.protobuf.StringValue + 18, // 30: checkpicks.content.v1.Article.tags:type_name -> google.protobuf.StringValue + 18, // 31: checkpicks.content.v1.Article.bookmark_id:type_name -> google.protobuf.StringValue + 20, // 32: checkpicks.content.v1.Article.created_at:type_name -> google.protobuf.Timestamp + 20, // 33: checkpicks.content.v1.Article.updated_at:type_name -> google.protobuf.Timestamp + 14, // 34: checkpicks.content.v1.ArticleEdge.article:type_name -> checkpicks.content.v1.Article + 11, // 35: checkpicks.content.v1.FeedEdge.feed:type_name -> checkpicks.content.v1.Feed + 18, // 36: checkpicks.content.v1.OGP.description:type_name -> google.protobuf.StringValue + 0, // 37: checkpicks.content.v1.ContentService.GetArticles:input_type -> checkpicks.content.v1.GetArticlesRequest + 3, // 38: checkpicks.content.v1.ContentService.CreateUploadArticle:input_type -> checkpicks.content.v1.CreateUploadArticleRequest + 5, // 39: checkpicks.content.v1.ContentService.GetArticleOGP:input_type -> checkpicks.content.v1.GetArticleOGPRequest + 7, // 40: checkpicks.content.v1.ContentService.GetFeeds:input_type -> checkpicks.content.v1.GetFeedsRequest + 9, // 41: checkpicks.content.v1.ContentService.GetFeed:input_type -> checkpicks.content.v1.GetFeedRequest + 1, // 42: checkpicks.content.v1.ContentService.GetArticles:output_type -> checkpicks.content.v1.GetArticlesResponse + 2, // 43: checkpicks.content.v1.ContentService.CreateUploadArticle:output_type -> checkpicks.content.v1.CreateArticleResponse + 4, // 44: checkpicks.content.v1.ContentService.GetArticleOGP:output_type -> checkpicks.content.v1.GetArticleOGPResponse + 6, // 45: checkpicks.content.v1.ContentService.GetFeeds:output_type -> checkpicks.content.v1.GetFeedsResponse + 8, // 46: checkpicks.content.v1.ContentService.GetFeed:output_type -> checkpicks.content.v1.GetFeedResponse + 42, // [42:47] is the sub-list for method output_type + 37, // [37:42] is the sub-list for method input_type + 37, // [37:37] is the sub-list for extension type_name + 37, // [37:37] is the sub-list for extension extendee + 0, // [0:37] is the sub-list for field type_name } func init() { file_content_content_proto_init() } @@ -1841,7 +1962,7 @@ func file_content_content_proto_init() { } } file_content_content_proto_msgTypes[8].Exporter = func(v any, i int) any { - switch v := v.(*PageInfo); i { + switch v := v.(*GetFeedResponse); i { case 0: return &v.state case 1: @@ -1853,7 +1974,7 @@ func file_content_content_proto_init() { } } file_content_content_proto_msgTypes[9].Exporter = func(v any, i int) any { - switch v := v.(*Feed); i { + switch v := v.(*GetFeedRequest); i { case 0: return &v.state case 1: @@ -1865,7 +1986,7 @@ func file_content_content_proto_init() { } } file_content_content_proto_msgTypes[10].Exporter = func(v any, i int) any { - switch v := v.(*Category); i { + switch v := v.(*PageInfo); i { case 0: return &v.state case 1: @@ -1877,7 +1998,7 @@ func file_content_content_proto_init() { } } file_content_content_proto_msgTypes[11].Exporter = func(v any, i int) any { - switch v := v.(*Platform); i { + switch v := v.(*Feed); i { case 0: return &v.state case 1: @@ -1889,7 +2010,7 @@ func file_content_content_proto_init() { } } file_content_content_proto_msgTypes[12].Exporter = func(v any, i int) any { - switch v := v.(*Article); i { + switch v := v.(*Category); i { case 0: return &v.state case 1: @@ -1901,7 +2022,7 @@ func file_content_content_proto_init() { } } file_content_content_proto_msgTypes[13].Exporter = func(v any, i int) any { - switch v := v.(*ArticleEdge); i { + switch v := v.(*Platform); i { case 0: return &v.state case 1: @@ -1913,7 +2034,7 @@ func file_content_content_proto_init() { } } file_content_content_proto_msgTypes[14].Exporter = func(v any, i int) any { - switch v := v.(*FeedEdge); i { + switch v := v.(*Article); i { case 0: return &v.state case 1: @@ -1925,6 +2046,30 @@ func file_content_content_proto_init() { } } file_content_content_proto_msgTypes[15].Exporter = func(v any, i int) any { + switch v := v.(*ArticleEdge); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_content_content_proto_msgTypes[16].Exporter = func(v any, i int) any { + switch v := v.(*FeedEdge); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_content_content_proto_msgTypes[17].Exporter = func(v any, i int) any { switch v := v.(*OGP); i { case 0: return &v.state @@ -1943,7 +2088,7 @@ func file_content_content_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_content_content_proto_rawDesc, NumEnums: 0, - NumMessages: 16, + NumMessages: 18, NumExtensions: 0, NumServices: 1, }, diff --git a/micro-service/my-feed-service/grpc/content/content_grpc.pb.go b/micro-service/my-feed-service/grpc/content/content_grpc.pb.go index d6c3acbf..2ee8c359 100644 --- a/micro-service/my-feed-service/grpc/content/content_grpc.pb.go +++ b/micro-service/my-feed-service/grpc/content/content_grpc.pb.go @@ -23,6 +23,7 @@ const ( ContentService_CreateUploadArticle_FullMethodName = "/checkpicks.content.v1.ContentService/CreateUploadArticle" ContentService_GetArticleOGP_FullMethodName = "/checkpicks.content.v1.ContentService/GetArticleOGP" ContentService_GetFeeds_FullMethodName = "/checkpicks.content.v1.ContentService/GetFeeds" + ContentService_GetFeed_FullMethodName = "/checkpicks.content.v1.ContentService/GetFeed" ) // ContentServiceClient is the client API for ContentService service. @@ -33,6 +34,7 @@ type ContentServiceClient interface { CreateUploadArticle(ctx context.Context, in *CreateUploadArticleRequest, opts ...grpc.CallOption) (*CreateArticleResponse, error) GetArticleOGP(ctx context.Context, in *GetArticleOGPRequest, opts ...grpc.CallOption) (*GetArticleOGPResponse, error) GetFeeds(ctx context.Context, in *GetFeedsRequest, opts ...grpc.CallOption) (*GetFeedsResponse, error) + GetFeed(ctx context.Context, in *GetFeedRequest, opts ...grpc.CallOption) (*GetFeedResponse, error) } type contentServiceClient struct { @@ -83,6 +85,16 @@ func (c *contentServiceClient) GetFeeds(ctx context.Context, in *GetFeedsRequest return out, nil } +func (c *contentServiceClient) GetFeed(ctx context.Context, in *GetFeedRequest, opts ...grpc.CallOption) (*GetFeedResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(GetFeedResponse) + err := c.cc.Invoke(ctx, ContentService_GetFeed_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + // ContentServiceServer is the server API for ContentService service. // All implementations should embed UnimplementedContentServiceServer // for forward compatibility. @@ -91,6 +103,7 @@ type ContentServiceServer interface { CreateUploadArticle(context.Context, *CreateUploadArticleRequest) (*CreateArticleResponse, error) GetArticleOGP(context.Context, *GetArticleOGPRequest) (*GetArticleOGPResponse, error) GetFeeds(context.Context, *GetFeedsRequest) (*GetFeedsResponse, error) + GetFeed(context.Context, *GetFeedRequest) (*GetFeedResponse, error) } // UnimplementedContentServiceServer should be embedded to have @@ -112,6 +125,9 @@ func (UnimplementedContentServiceServer) GetArticleOGP(context.Context, *GetArti func (UnimplementedContentServiceServer) GetFeeds(context.Context, *GetFeedsRequest) (*GetFeedsResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method GetFeeds not implemented") } +func (UnimplementedContentServiceServer) GetFeed(context.Context, *GetFeedRequest) (*GetFeedResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetFeed not implemented") +} func (UnimplementedContentServiceServer) testEmbeddedByValue() {} // UnsafeContentServiceServer may be embedded to opt out of forward compatibility for this service. @@ -204,6 +220,24 @@ func _ContentService_GetFeeds_Handler(srv interface{}, ctx context.Context, dec return interceptor(ctx, in, info, handler) } +func _ContentService_GetFeed_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetFeedRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ContentServiceServer).GetFeed(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: ContentService_GetFeed_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ContentServiceServer).GetFeed(ctx, req.(*GetFeedRequest)) + } + return interceptor(ctx, in, info, handler) +} + // ContentService_ServiceDesc is the grpc.ServiceDesc for ContentService service. // It's only intended for direct use with grpc.RegisterService, // and not to be introspected or modified (even as a copy) @@ -227,6 +261,10 @@ var ContentService_ServiceDesc = grpc.ServiceDesc{ MethodName: "GetFeeds", Handler: _ContentService_GetFeeds_Handler, }, + { + MethodName: "GetFeed", + Handler: _ContentService_GetFeed_Handler, + }, }, Streams: []grpc.StreamDesc{}, Metadata: "content/content.proto", diff --git a/micro-service/user-service/grpc/content/content.pb.go b/micro-service/user-service/grpc/content/content.pb.go index 616ef59a..fa6021bb 100644 --- a/micro-service/user-service/grpc/content/content.pb.go +++ b/micro-service/user-service/grpc/content/content.pb.go @@ -550,6 +550,108 @@ func (x *GetFeedsRequest) GetLimit() int64 { return 0 } +type GetFeedResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Feed *Feed `protobuf:"bytes,1,opt,name=feed,proto3" json:"feed,omitempty"` +} + +func (x *GetFeedResponse) Reset() { + *x = GetFeedResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_content_content_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetFeedResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetFeedResponse) ProtoMessage() {} + +func (x *GetFeedResponse) ProtoReflect() protoreflect.Message { + mi := &file_content_content_proto_msgTypes[8] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetFeedResponse.ProtoReflect.Descriptor instead. +func (*GetFeedResponse) Descriptor() ([]byte, []int) { + return file_content_content_proto_rawDescGZIP(), []int{8} +} + +func (x *GetFeedResponse) GetFeed() *Feed { + if x != nil { + return x.Feed + } + return nil +} + +type GetFeedRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + FeedId string `protobuf:"bytes,1,opt,name=feed_id,json=feedId,proto3" json:"feed_id,omitempty"` + UserId string `protobuf:"bytes,2,opt,name=user_id,json=userId,proto3" json:"user_id,omitempty"` +} + +func (x *GetFeedRequest) Reset() { + *x = GetFeedRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_content_content_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetFeedRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetFeedRequest) ProtoMessage() {} + +func (x *GetFeedRequest) ProtoReflect() protoreflect.Message { + mi := &file_content_content_proto_msgTypes[9] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetFeedRequest.ProtoReflect.Descriptor instead. +func (*GetFeedRequest) Descriptor() ([]byte, []int) { + return file_content_content_proto_rawDescGZIP(), []int{9} +} + +func (x *GetFeedRequest) GetFeedId() string { + if x != nil { + return x.FeedId + } + return "" +} + +func (x *GetFeedRequest) GetUserId() string { + if x != nil { + return x.UserId + } + return "" +} + type PageInfo struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -562,7 +664,7 @@ type PageInfo struct { func (x *PageInfo) Reset() { *x = PageInfo{} if protoimpl.UnsafeEnabled { - mi := &file_content_content_proto_msgTypes[8] + mi := &file_content_content_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -575,7 +677,7 @@ func (x *PageInfo) String() string { func (*PageInfo) ProtoMessage() {} func (x *PageInfo) ProtoReflect() protoreflect.Message { - mi := &file_content_content_proto_msgTypes[8] + mi := &file_content_content_proto_msgTypes[10] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -588,7 +690,7 @@ func (x *PageInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use PageInfo.ProtoReflect.Descriptor instead. func (*PageInfo) Descriptor() ([]byte, []int) { - return file_content_content_proto_rawDescGZIP(), []int{8} + return file_content_content_proto_rawDescGZIP(), []int{10} } func (x *PageInfo) GetEndCursor() string { @@ -629,7 +731,7 @@ type Feed struct { func (x *Feed) Reset() { *x = Feed{} if protoimpl.UnsafeEnabled { - mi := &file_content_content_proto_msgTypes[9] + mi := &file_content_content_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -642,7 +744,7 @@ func (x *Feed) String() string { func (*Feed) ProtoMessage() {} func (x *Feed) ProtoReflect() protoreflect.Message { - mi := &file_content_content_proto_msgTypes[9] + mi := &file_content_content_proto_msgTypes[11] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -655,7 +757,7 @@ func (x *Feed) ProtoReflect() protoreflect.Message { // Deprecated: Use Feed.ProtoReflect.Descriptor instead. func (*Feed) Descriptor() ([]byte, []int) { - return file_content_content_proto_rawDescGZIP(), []int{9} + return file_content_content_proto_rawDescGZIP(), []int{11} } func (x *Feed) GetId() string { @@ -772,7 +874,7 @@ type Category struct { func (x *Category) Reset() { *x = Category{} if protoimpl.UnsafeEnabled { - mi := &file_content_content_proto_msgTypes[10] + mi := &file_content_content_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -785,7 +887,7 @@ func (x *Category) String() string { func (*Category) ProtoMessage() {} func (x *Category) ProtoReflect() protoreflect.Message { - mi := &file_content_content_proto_msgTypes[10] + mi := &file_content_content_proto_msgTypes[12] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -798,7 +900,7 @@ func (x *Category) ProtoReflect() protoreflect.Message { // Deprecated: Use Category.ProtoReflect.Descriptor instead. func (*Category) Descriptor() ([]byte, []int) { - return file_content_content_proto_rawDescGZIP(), []int{10} + return file_content_content_proto_rawDescGZIP(), []int{12} } func (x *Category) GetId() string { @@ -862,7 +964,7 @@ type Platform struct { func (x *Platform) Reset() { *x = Platform{} if protoimpl.UnsafeEnabled { - mi := &file_content_content_proto_msgTypes[11] + mi := &file_content_content_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -875,7 +977,7 @@ func (x *Platform) String() string { func (*Platform) ProtoMessage() {} func (x *Platform) ProtoReflect() protoreflect.Message { - mi := &file_content_content_proto_msgTypes[11] + mi := &file_content_content_proto_msgTypes[13] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -888,7 +990,7 @@ func (x *Platform) ProtoReflect() protoreflect.Message { // Deprecated: Use Platform.ProtoReflect.Descriptor instead. func (*Platform) Descriptor() ([]byte, []int) { - return file_content_content_proto_rawDescGZIP(), []int{11} + return file_content_content_proto_rawDescGZIP(), []int{13} } func (x *Platform) GetId() string { @@ -984,7 +1086,7 @@ type Article struct { func (x *Article) Reset() { *x = Article{} if protoimpl.UnsafeEnabled { - mi := &file_content_content_proto_msgTypes[12] + mi := &file_content_content_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -997,7 +1099,7 @@ func (x *Article) String() string { func (*Article) ProtoMessage() {} func (x *Article) ProtoReflect() protoreflect.Message { - mi := &file_content_content_proto_msgTypes[12] + mi := &file_content_content_proto_msgTypes[14] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1010,7 +1112,7 @@ func (x *Article) ProtoReflect() protoreflect.Message { // Deprecated: Use Article.ProtoReflect.Descriptor instead. func (*Article) Descriptor() ([]byte, []int) { - return file_content_content_proto_rawDescGZIP(), []int{12} + return file_content_content_proto_rawDescGZIP(), []int{14} } func (x *Article) GetId() string { @@ -1165,7 +1267,7 @@ type ArticleEdge struct { func (x *ArticleEdge) Reset() { *x = ArticleEdge{} if protoimpl.UnsafeEnabled { - mi := &file_content_content_proto_msgTypes[13] + mi := &file_content_content_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1178,7 +1280,7 @@ func (x *ArticleEdge) String() string { func (*ArticleEdge) ProtoMessage() {} func (x *ArticleEdge) ProtoReflect() protoreflect.Message { - mi := &file_content_content_proto_msgTypes[13] + mi := &file_content_content_proto_msgTypes[15] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1191,7 +1293,7 @@ func (x *ArticleEdge) ProtoReflect() protoreflect.Message { // Deprecated: Use ArticleEdge.ProtoReflect.Descriptor instead. func (*ArticleEdge) Descriptor() ([]byte, []int) { - return file_content_content_proto_rawDescGZIP(), []int{13} + return file_content_content_proto_rawDescGZIP(), []int{15} } func (x *ArticleEdge) GetArticle() *Article { @@ -1220,7 +1322,7 @@ type FeedEdge struct { func (x *FeedEdge) Reset() { *x = FeedEdge{} if protoimpl.UnsafeEnabled { - mi := &file_content_content_proto_msgTypes[14] + mi := &file_content_content_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1233,7 +1335,7 @@ func (x *FeedEdge) String() string { func (*FeedEdge) ProtoMessage() {} func (x *FeedEdge) ProtoReflect() protoreflect.Message { - mi := &file_content_content_proto_msgTypes[14] + mi := &file_content_content_proto_msgTypes[16] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1246,7 +1348,7 @@ func (x *FeedEdge) ProtoReflect() protoreflect.Message { // Deprecated: Use FeedEdge.ProtoReflect.Descriptor instead. func (*FeedEdge) Descriptor() ([]byte, []int) { - return file_content_content_proto_rawDescGZIP(), []int{14} + return file_content_content_proto_rawDescGZIP(), []int{16} } func (x *FeedEdge) GetFeed() *Feed { @@ -1280,7 +1382,7 @@ type OGP struct { func (x *OGP) Reset() { *x = OGP{} if protoimpl.UnsafeEnabled { - mi := &file_content_content_proto_msgTypes[15] + mi := &file_content_content_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1293,7 +1395,7 @@ func (x *OGP) String() string { func (*OGP) ProtoMessage() {} func (x *OGP) ProtoReflect() protoreflect.Message { - mi := &file_content_content_proto_msgTypes[15] + mi := &file_content_content_proto_msgTypes[17] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1306,7 +1408,7 @@ func (x *OGP) ProtoReflect() protoreflect.Message { // Deprecated: Use OGP.ProtoReflect.Descriptor instead. func (*OGP) Descriptor() ([]byte, []int) { - return file_content_content_proto_rawDescGZIP(), []int{15} + return file_content_content_proto_rawDescGZIP(), []int{17} } func (x *OGP) GetTitle() string { @@ -1455,201 +1557,215 @@ var file_content_content_proto_rawDesc = []byte{ 0x75, 0x65, 0x52, 0x07, 0x6b, 0x65, 0x79, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x22, 0x4d, 0x0a, 0x08, 0x50, 0x61, 0x67, - 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1d, 0x0a, 0x0a, 0x65, 0x6e, 0x64, 0x5f, 0x63, 0x75, 0x72, - 0x73, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x65, 0x6e, 0x64, 0x43, 0x75, - 0x72, 0x73, 0x6f, 0x72, 0x12, 0x22, 0x0a, 0x0d, 0x68, 0x61, 0x73, 0x5f, 0x6e, 0x65, 0x78, 0x74, - 0x5f, 0x70, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x68, 0x61, 0x73, - 0x4e, 0x65, 0x78, 0x74, 0x50, 0x61, 0x67, 0x65, 0x22, 0xe6, 0x04, 0x0a, 0x04, 0x46, 0x65, 0x65, - 0x64, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, - 0x64, 0x12, 0x3b, 0x0a, 0x08, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x69, 0x63, 0x6b, 0x73, - 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x6c, 0x61, 0x74, - 0x66, 0x6f, 0x72, 0x6d, 0x52, 0x08, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x12, 0x3b, - 0x0a, 0x08, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1f, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x69, 0x63, 0x6b, 0x73, 0x2e, 0x63, 0x6f, - 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, - 0x79, 0x52, 0x08, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x12, 0x1e, 0x0a, 0x0b, 0x6d, - 0x79, 0x5f, 0x66, 0x65, 0x65, 0x64, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, - 0x52, 0x09, 0x6d, 0x79, 0x46, 0x65, 0x65, 0x64, 0x49, 0x64, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, - 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x12, 0x17, 0x0a, 0x07, 0x72, 0x73, 0x73, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x07, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x06, 0x72, 0x73, 0x73, 0x55, 0x72, 0x6c, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x69, - 0x74, 0x65, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x69, - 0x74, 0x65, 0x55, 0x72, 0x6c, 0x12, 0x23, 0x0a, 0x0d, 0x74, 0x68, 0x75, 0x6d, 0x62, 0x6e, 0x61, - 0x69, 0x6c, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x74, 0x68, - 0x75, 0x6d, 0x62, 0x6e, 0x61, 0x69, 0x6c, 0x55, 0x72, 0x6c, 0x12, 0x2e, 0x0a, 0x13, 0x74, 0x72, - 0x65, 0x6e, 0x64, 0x5f, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x5f, 0x74, 0x79, 0x70, - 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x74, 0x72, 0x65, 0x6e, 0x64, 0x50, 0x6c, - 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x12, 0x44, 0x0a, 0x0f, 0x61, 0x70, - 0x69, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x18, 0x0b, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, - 0x65, 0x52, 0x0d, 0x61, 0x70, 0x69, 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, 0x61, 0x72, 0x61, 0x6d, - 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x0c, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, - 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x75, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x75, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x64, 0x5f, 0x61, 0x74, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, - 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x41, - 0x74, 0x22, 0xf3, 0x01, 0x0a, 0x08, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x12, 0x0e, - 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, - 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x64, 0x5f, 0x61, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, - 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, - 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, - 0x70, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, - 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x64, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x64, 0x41, 0x74, 0x22, 0xe0, 0x02, 0x0a, 0x08, 0x50, 0x6c, 0x61, 0x74, - 0x66, 0x6f, 0x72, 0x6d, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x69, 0x74, 0x65, - 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x69, 0x74, 0x65, - 0x55, 0x72, 0x6c, 0x12, 0x2c, 0x0a, 0x12, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x5f, - 0x73, 0x69, 0x74, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x10, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x53, 0x69, 0x74, 0x65, 0x54, 0x79, 0x70, - 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x66, 0x61, 0x76, 0x69, 0x63, 0x6f, 0x6e, 0x5f, 0x75, 0x72, 0x6c, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x66, 0x61, 0x76, 0x69, 0x63, 0x6f, 0x6e, 0x55, - 0x72, 0x6c, 0x12, 0x15, 0x0a, 0x06, 0x69, 0x73, 0x5f, 0x65, 0x6e, 0x67, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x05, 0x69, 0x73, 0x45, 0x6e, 0x67, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, + 0x28, 0x03, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x22, 0x42, 0x0a, 0x0f, 0x47, 0x65, 0x74, + 0x46, 0x65, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2f, 0x0a, 0x04, + 0x66, 0x65, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x63, 0x68, 0x65, + 0x63, 0x6b, 0x70, 0x69, 0x63, 0x6b, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, + 0x76, 0x31, 0x2e, 0x46, 0x65, 0x65, 0x64, 0x52, 0x04, 0x66, 0x65, 0x65, 0x64, 0x22, 0x42, 0x0a, + 0x0e, 0x47, 0x65, 0x74, 0x46, 0x65, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x17, 0x0a, 0x07, 0x66, 0x65, 0x65, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x06, 0x66, 0x65, 0x65, 0x64, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, + 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, + 0x64, 0x22, 0x4d, 0x0a, 0x08, 0x50, 0x61, 0x67, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1d, 0x0a, + 0x0a, 0x65, 0x6e, 0x64, 0x5f, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x09, 0x65, 0x6e, 0x64, 0x43, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x12, 0x22, 0x0a, 0x0d, + 0x68, 0x61, 0x73, 0x5f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x0b, 0x68, 0x61, 0x73, 0x4e, 0x65, 0x78, 0x74, 0x50, 0x61, 0x67, 0x65, + 0x22, 0xe6, 0x04, 0x0a, 0x04, 0x46, 0x65, 0x65, 0x64, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x3b, 0x0a, 0x08, 0x70, 0x6c, 0x61, + 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x63, 0x68, + 0x65, 0x63, 0x6b, 0x70, 0x69, 0x63, 0x6b, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, + 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x52, 0x08, 0x70, 0x6c, + 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x12, 0x3b, 0x0a, 0x08, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, + 0x72, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, + 0x70, 0x69, 0x63, 0x6b, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x76, 0x31, + 0x2e, 0x43, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x52, 0x08, 0x63, 0x61, 0x74, 0x65, 0x67, + 0x6f, 0x72, 0x79, 0x12, 0x1e, 0x0a, 0x0b, 0x6d, 0x79, 0x5f, 0x66, 0x65, 0x65, 0x64, 0x5f, 0x69, + 0x64, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x6d, 0x79, 0x46, 0x65, 0x65, 0x64, + 0x49, 0x64, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x17, 0x0a, 0x07, 0x72, 0x73, 0x73, + 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x73, 0x73, 0x55, + 0x72, 0x6c, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x69, 0x74, 0x65, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x08, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x69, 0x74, 0x65, 0x55, 0x72, 0x6c, 0x12, 0x23, 0x0a, + 0x0d, 0x74, 0x68, 0x75, 0x6d, 0x62, 0x6e, 0x61, 0x69, 0x6c, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x09, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x74, 0x68, 0x75, 0x6d, 0x62, 0x6e, 0x61, 0x69, 0x6c, 0x55, + 0x72, 0x6c, 0x12, 0x2e, 0x0a, 0x13, 0x74, 0x72, 0x65, 0x6e, 0x64, 0x5f, 0x70, 0x6c, 0x61, 0x74, + 0x66, 0x6f, 0x72, 0x6d, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x11, 0x74, 0x72, 0x65, 0x6e, 0x64, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x54, 0x79, + 0x70, 0x65, 0x12, 0x44, 0x0a, 0x0f, 0x61, 0x70, 0x69, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, + 0x70, 0x61, 0x72, 0x61, 0x6d, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0d, 0x61, 0x70, 0x69, 0x51, 0x75, + 0x65, 0x72, 0x79, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, + 0x74, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, + 0x0a, 0x0a, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x0e, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, + 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x41, 0x74, 0x22, 0xf3, 0x01, 0x0a, 0x08, 0x43, 0x61, + 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, + 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x39, + 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, + 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x75, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, - 0x61, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x5f, + 0x61, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, - 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, - 0x39, 0x0a, 0x0a, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x09, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, - 0x09, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x41, 0x74, 0x22, 0xe3, 0x06, 0x0a, 0x07, 0x41, - 0x72, 0x74, 0x69, 0x63, 0x6c, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x3b, 0x0a, 0x08, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, - 0x72, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, - 0x70, 0x69, 0x63, 0x6b, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x76, 0x31, - 0x2e, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x52, 0x08, 0x70, 0x6c, 0x61, 0x74, 0x66, - 0x6f, 0x72, 0x6d, 0x12, 0x31, 0x0a, 0x05, 0x66, 0x65, 0x65, 0x64, 0x73, 0x18, 0x03, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x69, 0x63, 0x6b, 0x73, 0x2e, - 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x46, 0x65, 0x65, 0x64, 0x52, - 0x05, 0x66, 0x65, 0x65, 0x64, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x12, 0x20, 0x0a, 0x0b, - 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1f, - 0x0a, 0x0b, 0x61, 0x72, 0x74, 0x69, 0x63, 0x6c, 0x65, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0a, 0x61, 0x72, 0x74, 0x69, 0x63, 0x6c, 0x65, 0x55, 0x72, 0x6c, 0x12, - 0x3d, 0x0a, 0x0c, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, + 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x41, 0x74, 0x22, + 0xe0, 0x02, 0x0a, 0x08, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x12, 0x0e, 0x0a, 0x02, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x12, 0x19, 0x0a, 0x08, 0x73, 0x69, 0x74, 0x65, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x07, 0x73, 0x69, 0x74, 0x65, 0x55, 0x72, 0x6c, 0x12, 0x2c, 0x0a, 0x12, 0x70, + 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x5f, 0x73, 0x69, 0x74, 0x65, 0x5f, 0x74, 0x79, 0x70, + 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, + 0x6d, 0x53, 0x69, 0x74, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x66, 0x61, 0x76, + 0x69, 0x63, 0x6f, 0x6e, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, + 0x66, 0x61, 0x76, 0x69, 0x63, 0x6f, 0x6e, 0x55, 0x72, 0x6c, 0x12, 0x15, 0x0a, 0x06, 0x69, 0x73, + 0x5f, 0x65, 0x6e, 0x67, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x69, 0x73, 0x45, 0x6e, + 0x67, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, - 0x70, 0x52, 0x0b, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x65, 0x64, 0x41, 0x74, 0x12, 0x3d, - 0x0a, 0x0b, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x08, 0x20, + 0x70, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, + 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x75, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x64, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, + 0x41, 0x74, 0x22, 0xe3, 0x06, 0x0a, 0x07, 0x41, 0x72, 0x74, 0x69, 0x63, 0x6c, 0x65, 0x12, 0x0e, + 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x3b, + 0x0a, 0x08, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1f, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x69, 0x63, 0x6b, 0x73, 0x2e, 0x63, 0x6f, + 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, + 0x6d, 0x52, 0x08, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x12, 0x31, 0x0a, 0x05, 0x66, + 0x65, 0x65, 0x64, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x63, 0x68, 0x65, + 0x63, 0x6b, 0x70, 0x69, 0x63, 0x6b, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, + 0x76, 0x31, 0x2e, 0x46, 0x65, 0x65, 0x64, 0x52, 0x05, 0x66, 0x65, 0x65, 0x64, 0x73, 0x12, 0x14, + 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, + 0x69, 0x74, 0x6c, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x72, 0x74, 0x69, 0x63, 0x6c, + 0x65, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x61, 0x72, 0x74, + 0x69, 0x63, 0x6c, 0x65, 0x55, 0x72, 0x6c, 0x12, 0x3d, 0x0a, 0x0c, 0x70, 0x75, 0x62, 0x6c, 0x69, + 0x73, 0x68, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0b, 0x70, 0x75, 0x62, 0x6c, 0x69, + 0x73, 0x68, 0x65, 0x64, 0x41, 0x74, 0x12, 0x3d, 0x0a, 0x0b, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0a, 0x61, 0x75, 0x74, 0x68, 0x6f, + 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x30, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, - 0x65, 0x52, 0x0a, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x30, 0x0a, - 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, - 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x12, - 0x23, 0x0a, 0x0d, 0x74, 0x68, 0x75, 0x6d, 0x62, 0x6e, 0x61, 0x69, 0x6c, 0x5f, 0x75, 0x72, 0x6c, - 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x74, 0x68, 0x75, 0x6d, 0x62, 0x6e, 0x61, 0x69, - 0x6c, 0x55, 0x72, 0x6c, 0x12, 0x15, 0x0a, 0x06, 0x69, 0x73, 0x5f, 0x65, 0x6e, 0x67, 0x18, 0x0b, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x69, 0x73, 0x45, 0x6e, 0x67, 0x12, 0x1d, 0x0a, 0x0a, 0x69, - 0x73, 0x5f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x09, 0x69, 0x73, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x12, 0x3d, 0x0a, 0x0b, 0x62, 0x6f, - 0x6f, 0x6b, 0x6d, 0x61, 0x72, 0x6b, 0x5f, 0x69, 0x64, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0a, 0x62, - 0x6f, 0x6f, 0x6b, 0x6d, 0x61, 0x72, 0x6b, 0x49, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x69, 0x73, 0x5f, - 0x62, 0x6f, 0x6f, 0x6b, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x64, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x0c, 0x69, 0x73, 0x42, 0x6f, 0x6f, 0x6b, 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x64, 0x12, 0x21, - 0x0a, 0x0c, 0x69, 0x73, 0x5f, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x69, 0x6e, 0x67, 0x18, 0x0f, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x69, 0x73, 0x46, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x69, 0x6e, - 0x67, 0x12, 0x3d, 0x0a, 0x1b, 0x66, 0x61, 0x76, 0x6f, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x61, 0x72, - 0x74, 0x69, 0x63, 0x6c, 0x65, 0x5f, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x73, - 0x18, 0x10, 0x20, 0x03, 0x28, 0x09, 0x52, 0x18, 0x66, 0x61, 0x76, 0x6f, 0x72, 0x69, 0x74, 0x65, - 0x41, 0x72, 0x74, 0x69, 0x63, 0x6c, 0x65, 0x46, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x49, 0x64, 0x73, - 0x12, 0x1d, 0x0a, 0x0a, 0x6c, 0x69, 0x6b, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x11, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x6c, 0x69, 0x6b, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, - 0x19, 0x0a, 0x08, 0x69, 0x73, 0x5f, 0x74, 0x72, 0x65, 0x6e, 0x64, 0x18, 0x12, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x07, 0x69, 0x73, 0x54, 0x72, 0x65, 0x6e, 0x64, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x13, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, - 0x5f, 0x61, 0x74, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, - 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, - 0x22, 0x5f, 0x0a, 0x0b, 0x41, 0x72, 0x74, 0x69, 0x63, 0x6c, 0x65, 0x45, 0x64, 0x67, 0x65, 0x12, - 0x38, 0x0a, 0x07, 0x61, 0x72, 0x74, 0x69, 0x63, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1e, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x69, 0x63, 0x6b, 0x73, 0x2e, 0x63, 0x6f, - 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x72, 0x74, 0x69, 0x63, 0x6c, 0x65, - 0x52, 0x07, 0x61, 0x72, 0x74, 0x69, 0x63, 0x6c, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x75, 0x72, - 0x73, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, - 0x72, 0x22, 0x53, 0x0a, 0x08, 0x46, 0x65, 0x65, 0x64, 0x45, 0x64, 0x67, 0x65, 0x12, 0x2f, 0x0a, - 0x04, 0x66, 0x65, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x63, 0x68, + 0x65, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x74, 0x68, 0x75, 0x6d, 0x62, + 0x6e, 0x61, 0x69, 0x6c, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, + 0x74, 0x68, 0x75, 0x6d, 0x62, 0x6e, 0x61, 0x69, 0x6c, 0x55, 0x72, 0x6c, 0x12, 0x15, 0x0a, 0x06, + 0x69, 0x73, 0x5f, 0x65, 0x6e, 0x67, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x69, 0x73, + 0x45, 0x6e, 0x67, 0x12, 0x1d, 0x0a, 0x0a, 0x69, 0x73, 0x5f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, + 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x69, 0x73, 0x50, 0x72, 0x69, 0x76, 0x61, + 0x74, 0x65, 0x12, 0x3d, 0x0a, 0x0b, 0x62, 0x6f, 0x6f, 0x6b, 0x6d, 0x61, 0x72, 0x6b, 0x5f, 0x69, + 0x64, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0a, 0x62, 0x6f, 0x6f, 0x6b, 0x6d, 0x61, 0x72, 0x6b, 0x49, + 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x69, 0x73, 0x5f, 0x62, 0x6f, 0x6f, 0x6b, 0x6d, 0x61, 0x72, 0x6b, + 0x65, 0x64, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x69, 0x73, 0x42, 0x6f, 0x6f, 0x6b, + 0x6d, 0x61, 0x72, 0x6b, 0x65, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x69, 0x73, 0x5f, 0x66, 0x6f, 0x6c, + 0x6c, 0x6f, 0x77, 0x69, 0x6e, 0x67, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x69, 0x73, + 0x46, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x69, 0x6e, 0x67, 0x12, 0x3d, 0x0a, 0x1b, 0x66, 0x61, 0x76, + 0x6f, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x61, 0x72, 0x74, 0x69, 0x63, 0x6c, 0x65, 0x5f, 0x66, 0x6f, + 0x6c, 0x64, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x10, 0x20, 0x03, 0x28, 0x09, 0x52, 0x18, + 0x66, 0x61, 0x76, 0x6f, 0x72, 0x69, 0x74, 0x65, 0x41, 0x72, 0x74, 0x69, 0x63, 0x6c, 0x65, 0x46, + 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x49, 0x64, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x6c, 0x69, 0x6b, 0x65, + 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x11, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x6c, 0x69, + 0x6b, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x69, 0x73, 0x5f, 0x74, 0x72, + 0x65, 0x6e, 0x64, 0x18, 0x12, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x69, 0x73, 0x54, 0x72, 0x65, + 0x6e, 0x64, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, + 0x18, 0x13, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x39, 0x0a, + 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x14, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x75, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x22, 0x5f, 0x0a, 0x0b, 0x41, 0x72, 0x74, 0x69, + 0x63, 0x6c, 0x65, 0x45, 0x64, 0x67, 0x65, 0x12, 0x38, 0x0a, 0x07, 0x61, 0x72, 0x74, 0x69, 0x63, + 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, + 0x70, 0x69, 0x63, 0x6b, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x76, 0x31, + 0x2e, 0x41, 0x72, 0x74, 0x69, 0x63, 0x6c, 0x65, 0x52, 0x07, 0x61, 0x72, 0x74, 0x69, 0x63, 0x6c, + 0x65, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x22, 0x53, 0x0a, 0x08, 0x46, 0x65, 0x65, + 0x64, 0x45, 0x64, 0x67, 0x65, 0x12, 0x2f, 0x0a, 0x04, 0x66, 0x65, 0x65, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x69, 0x63, 0x6b, 0x73, + 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x46, 0x65, 0x65, 0x64, + 0x52, 0x04, 0x66, 0x65, 0x65, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x22, 0xfa, + 0x01, 0x0a, 0x03, 0x4f, 0x47, 0x50, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x12, 0x3e, 0x0a, 0x0b, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, + 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1f, 0x0a, 0x0b, + 0x61, 0x72, 0x74, 0x69, 0x63, 0x6c, 0x65, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0a, 0x61, 0x72, 0x74, 0x69, 0x63, 0x6c, 0x65, 0x55, 0x72, 0x6c, 0x12, 0x19, 0x0a, + 0x08, 0x73, 0x69, 0x74, 0x65, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x07, 0x73, 0x69, 0x74, 0x65, 0x55, 0x72, 0x6c, 0x12, 0x1b, 0x0a, 0x09, 0x73, 0x69, 0x74, 0x65, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x69, 0x74, + 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x74, 0x68, 0x75, 0x6d, 0x62, 0x6e, 0x61, + 0x69, 0x6c, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x74, 0x68, + 0x75, 0x6d, 0x62, 0x6e, 0x61, 0x69, 0x6c, 0x55, 0x72, 0x6c, 0x12, 0x1f, 0x0a, 0x0b, 0x66, 0x61, + 0x76, 0x69, 0x63, 0x6f, 0x6e, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0a, 0x66, 0x61, 0x76, 0x69, 0x63, 0x6f, 0x6e, 0x55, 0x72, 0x6c, 0x32, 0x91, 0x04, 0x0a, 0x0e, + 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x64, + 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x41, 0x72, 0x74, 0x69, 0x63, 0x6c, 0x65, 0x73, 0x12, 0x29, 0x2e, + 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x69, 0x63, 0x6b, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, + 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x72, 0x74, 0x69, 0x63, 0x6c, 0x65, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, + 0x70, 0x69, 0x63, 0x6b, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x76, 0x31, + 0x2e, 0x47, 0x65, 0x74, 0x41, 0x72, 0x74, 0x69, 0x63, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x76, 0x0a, 0x13, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, 0x70, + 0x6c, 0x6f, 0x61, 0x64, 0x41, 0x72, 0x74, 0x69, 0x63, 0x6c, 0x65, 0x12, 0x31, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x69, 0x63, 0x6b, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, - 0x2e, 0x76, 0x31, 0x2e, 0x46, 0x65, 0x65, 0x64, 0x52, 0x04, 0x66, 0x65, 0x65, 0x64, 0x12, 0x16, - 0x0a, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, - 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x22, 0xfa, 0x01, 0x0a, 0x03, 0x4f, 0x47, 0x50, 0x12, 0x14, - 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, - 0x69, 0x74, 0x6c, 0x65, 0x12, 0x3e, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x69, - 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x72, 0x74, 0x69, 0x63, 0x6c, 0x65, 0x5f, - 0x75, 0x72, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x61, 0x72, 0x74, 0x69, 0x63, - 0x6c, 0x65, 0x55, 0x72, 0x6c, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x69, 0x74, 0x65, 0x5f, 0x75, 0x72, - 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x69, 0x74, 0x65, 0x55, 0x72, 0x6c, - 0x12, 0x1b, 0x0a, 0x09, 0x73, 0x69, 0x74, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x69, 0x74, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x23, 0x0a, - 0x0d, 0x74, 0x68, 0x75, 0x6d, 0x62, 0x6e, 0x61, 0x69, 0x6c, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x74, 0x68, 0x75, 0x6d, 0x62, 0x6e, 0x61, 0x69, 0x6c, 0x55, - 0x72, 0x6c, 0x12, 0x1f, 0x0a, 0x0b, 0x66, 0x61, 0x76, 0x69, 0x63, 0x6f, 0x6e, 0x5f, 0x75, 0x72, - 0x6c, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x66, 0x61, 0x76, 0x69, 0x63, 0x6f, 0x6e, - 0x55, 0x72, 0x6c, 0x32, 0xb7, 0x03, 0x0a, 0x0e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x64, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x41, 0x72, 0x74, - 0x69, 0x63, 0x6c, 0x65, 0x73, 0x12, 0x29, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x69, 0x63, - 0x6b, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, - 0x74, 0x41, 0x72, 0x74, 0x69, 0x63, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x2a, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x69, 0x63, 0x6b, 0x73, 0x2e, 0x63, 0x6f, - 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x72, 0x74, 0x69, - 0x63, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x76, 0x0a, 0x13, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x41, 0x72, 0x74, 0x69, - 0x63, 0x6c, 0x65, 0x12, 0x31, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x69, 0x63, 0x6b, 0x73, - 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x41, 0x72, 0x74, 0x69, 0x63, 0x6c, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x69, - 0x63, 0x6b, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, 0x72, 0x74, 0x69, 0x63, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6a, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x41, 0x72, 0x74, 0x69, 0x63, - 0x6c, 0x65, 0x4f, 0x47, 0x50, 0x12, 0x2b, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x69, 0x63, - 0x6b, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, - 0x74, 0x41, 0x72, 0x74, 0x69, 0x63, 0x6c, 0x65, 0x4f, 0x47, 0x50, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x69, 0x63, 0x6b, 0x73, 0x2e, - 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x72, - 0x74, 0x69, 0x63, 0x6c, 0x65, 0x4f, 0x47, 0x50, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x5b, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x46, 0x65, 0x65, 0x64, 0x73, 0x12, 0x26, 0x2e, 0x63, - 0x68, 0x65, 0x63, 0x6b, 0x70, 0x69, 0x63, 0x6b, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, - 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x65, 0x65, 0x64, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x69, 0x63, 0x6b, + 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, + 0x41, 0x72, 0x74, 0x69, 0x63, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, + 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x69, 0x63, 0x6b, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x74, + 0x65, 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, 0x72, 0x74, + 0x69, 0x63, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6a, 0x0a, 0x0d, + 0x47, 0x65, 0x74, 0x41, 0x72, 0x74, 0x69, 0x63, 0x6c, 0x65, 0x4f, 0x47, 0x50, 0x12, 0x2b, 0x2e, + 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x69, 0x63, 0x6b, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, + 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x72, 0x74, 0x69, 0x63, 0x6c, 0x65, + 0x4f, 0x47, 0x50, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x63, 0x68, 0x65, + 0x63, 0x6b, 0x70, 0x69, 0x63, 0x6b, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, + 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x72, 0x74, 0x69, 0x63, 0x6c, 0x65, 0x4f, 0x47, 0x50, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5b, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x46, + 0x65, 0x65, 0x64, 0x73, 0x12, 0x26, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x69, 0x63, 0x6b, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, - 0x46, 0x65, 0x65, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x2d, 0x5a, - 0x2b, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x59, 0x75, 0x6b, 0x69, - 0x4f, 0x6e, 0x69, 0x73, 0x68, 0x69, 0x31, 0x31, 0x32, 0x39, 0x2f, 0x74, 0x65, 0x63, 0x68, 0x70, - 0x69, 0x63, 0x6b, 0x73, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x62, 0x06, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x33, + 0x46, 0x65, 0x65, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x63, + 0x68, 0x65, 0x63, 0x6b, 0x70, 0x69, 0x63, 0x6b, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, + 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x65, 0x65, 0x64, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x58, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x46, 0x65, 0x65, 0x64, + 0x12, 0x25, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x69, 0x63, 0x6b, 0x73, 0x2e, 0x63, 0x6f, + 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x65, 0x65, 0x64, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x70, + 0x69, 0x63, 0x6b, 0x73, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x2e, + 0x47, 0x65, 0x74, 0x46, 0x65, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, + 0x2d, 0x5a, 0x2b, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x59, 0x75, + 0x6b, 0x69, 0x4f, 0x6e, 0x69, 0x73, 0x68, 0x69, 0x31, 0x31, 0x32, 0x39, 0x2f, 0x74, 0x65, 0x63, + 0x68, 0x70, 0x69, 0x63, 0x6b, 0x73, 0x2f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x62, 0x06, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -1664,7 +1780,7 @@ func file_content_content_proto_rawDescGZIP() []byte { return file_content_content_proto_rawDescData } -var file_content_content_proto_msgTypes = make([]protoimpl.MessageInfo, 16) +var file_content_content_proto_msgTypes = make([]protoimpl.MessageInfo, 18) var file_content_content_proto_goTypes = []any{ (*GetArticlesRequest)(nil), // 0: checkpicks.content.v1.GetArticlesRequest (*GetArticlesResponse)(nil), // 1: checkpicks.content.v1.GetArticlesResponse @@ -1674,68 +1790,73 @@ var file_content_content_proto_goTypes = []any{ (*GetArticleOGPRequest)(nil), // 5: checkpicks.content.v1.GetArticleOGPRequest (*GetFeedsResponse)(nil), // 6: checkpicks.content.v1.GetFeedsResponse (*GetFeedsRequest)(nil), // 7: checkpicks.content.v1.GetFeedsRequest - (*PageInfo)(nil), // 8: checkpicks.content.v1.PageInfo - (*Feed)(nil), // 9: checkpicks.content.v1.Feed - (*Category)(nil), // 10: checkpicks.content.v1.Category - (*Platform)(nil), // 11: checkpicks.content.v1.Platform - (*Article)(nil), // 12: checkpicks.content.v1.Article - (*ArticleEdge)(nil), // 13: checkpicks.content.v1.ArticleEdge - (*FeedEdge)(nil), // 14: checkpicks.content.v1.FeedEdge - (*OGP)(nil), // 15: checkpicks.content.v1.OGP - (*wrapperspb.StringValue)(nil), // 16: google.protobuf.StringValue - (*wrapperspb.Int64Value)(nil), // 17: google.protobuf.Int64Value - (*timestamppb.Timestamp)(nil), // 18: google.protobuf.Timestamp + (*GetFeedResponse)(nil), // 8: checkpicks.content.v1.GetFeedResponse + (*GetFeedRequest)(nil), // 9: checkpicks.content.v1.GetFeedRequest + (*PageInfo)(nil), // 10: checkpicks.content.v1.PageInfo + (*Feed)(nil), // 11: checkpicks.content.v1.Feed + (*Category)(nil), // 12: checkpicks.content.v1.Category + (*Platform)(nil), // 13: checkpicks.content.v1.Platform + (*Article)(nil), // 14: checkpicks.content.v1.Article + (*ArticleEdge)(nil), // 15: checkpicks.content.v1.ArticleEdge + (*FeedEdge)(nil), // 16: checkpicks.content.v1.FeedEdge + (*OGP)(nil), // 17: checkpicks.content.v1.OGP + (*wrapperspb.StringValue)(nil), // 18: google.protobuf.StringValue + (*wrapperspb.Int64Value)(nil), // 19: google.protobuf.Int64Value + (*timestamppb.Timestamp)(nil), // 20: google.protobuf.Timestamp } var file_content_content_proto_depIdxs = []int32{ - 16, // 0: checkpicks.content.v1.GetArticlesRequest.user_id:type_name -> google.protobuf.StringValue - 17, // 1: checkpicks.content.v1.GetArticlesRequest.language_status:type_name -> google.protobuf.Int64Value - 16, // 2: checkpicks.content.v1.GetArticlesRequest.tag:type_name -> google.protobuf.StringValue - 16, // 3: checkpicks.content.v1.GetArticlesRequest.feed_ids:type_name -> google.protobuf.StringValue - 13, // 4: checkpicks.content.v1.GetArticlesResponse.articlesEdge:type_name -> checkpicks.content.v1.ArticleEdge - 8, // 5: checkpicks.content.v1.GetArticlesResponse.page_info:type_name -> checkpicks.content.v1.PageInfo - 12, // 6: checkpicks.content.v1.CreateArticleResponse.article:type_name -> checkpicks.content.v1.Article - 15, // 7: checkpicks.content.v1.GetArticleOGPResponse.ogp:type_name -> checkpicks.content.v1.OGP - 14, // 8: checkpicks.content.v1.GetFeedsResponse.feed_edge:type_name -> checkpicks.content.v1.FeedEdge - 8, // 9: checkpicks.content.v1.GetFeedsResponse.page_info:type_name -> checkpicks.content.v1.PageInfo - 17, // 10: checkpicks.content.v1.GetFeedsRequest.platform_site_type:type_name -> google.protobuf.Int64Value - 16, // 11: checkpicks.content.v1.GetFeedsRequest.platform_id:type_name -> google.protobuf.StringValue - 16, // 12: checkpicks.content.v1.GetFeedsRequest.keyword:type_name -> google.protobuf.StringValue - 11, // 13: checkpicks.content.v1.Feed.platform:type_name -> checkpicks.content.v1.Platform - 10, // 14: checkpicks.content.v1.Feed.category:type_name -> checkpicks.content.v1.Category - 16, // 15: checkpicks.content.v1.Feed.api_query_param:type_name -> google.protobuf.StringValue - 18, // 16: checkpicks.content.v1.Feed.created_at:type_name -> google.protobuf.Timestamp - 18, // 17: checkpicks.content.v1.Feed.updated_at:type_name -> google.protobuf.Timestamp - 18, // 18: checkpicks.content.v1.Feed.deleted_at:type_name -> google.protobuf.Timestamp - 18, // 19: checkpicks.content.v1.Category.created_at:type_name -> google.protobuf.Timestamp - 18, // 20: checkpicks.content.v1.Category.updated_at:type_name -> google.protobuf.Timestamp - 18, // 21: checkpicks.content.v1.Category.deleted_at:type_name -> google.protobuf.Timestamp - 18, // 22: checkpicks.content.v1.Platform.created_at:type_name -> google.protobuf.Timestamp - 18, // 23: checkpicks.content.v1.Platform.updated_at:type_name -> google.protobuf.Timestamp - 18, // 24: checkpicks.content.v1.Platform.deleted_at:type_name -> google.protobuf.Timestamp - 11, // 25: checkpicks.content.v1.Article.platform:type_name -> checkpicks.content.v1.Platform - 9, // 26: checkpicks.content.v1.Article.feeds:type_name -> checkpicks.content.v1.Feed - 18, // 27: checkpicks.content.v1.Article.published_at:type_name -> google.protobuf.Timestamp - 16, // 28: checkpicks.content.v1.Article.author_name:type_name -> google.protobuf.StringValue - 16, // 29: checkpicks.content.v1.Article.tags:type_name -> google.protobuf.StringValue - 16, // 30: checkpicks.content.v1.Article.bookmark_id:type_name -> google.protobuf.StringValue - 18, // 31: checkpicks.content.v1.Article.created_at:type_name -> google.protobuf.Timestamp - 18, // 32: checkpicks.content.v1.Article.updated_at:type_name -> google.protobuf.Timestamp - 12, // 33: checkpicks.content.v1.ArticleEdge.article:type_name -> checkpicks.content.v1.Article - 9, // 34: checkpicks.content.v1.FeedEdge.feed:type_name -> checkpicks.content.v1.Feed - 16, // 35: checkpicks.content.v1.OGP.description:type_name -> google.protobuf.StringValue - 0, // 36: checkpicks.content.v1.ContentService.GetArticles:input_type -> checkpicks.content.v1.GetArticlesRequest - 3, // 37: checkpicks.content.v1.ContentService.CreateUploadArticle:input_type -> checkpicks.content.v1.CreateUploadArticleRequest - 5, // 38: checkpicks.content.v1.ContentService.GetArticleOGP:input_type -> checkpicks.content.v1.GetArticleOGPRequest - 7, // 39: checkpicks.content.v1.ContentService.GetFeeds:input_type -> checkpicks.content.v1.GetFeedsRequest - 1, // 40: checkpicks.content.v1.ContentService.GetArticles:output_type -> checkpicks.content.v1.GetArticlesResponse - 2, // 41: checkpicks.content.v1.ContentService.CreateUploadArticle:output_type -> checkpicks.content.v1.CreateArticleResponse - 4, // 42: checkpicks.content.v1.ContentService.GetArticleOGP:output_type -> checkpicks.content.v1.GetArticleOGPResponse - 6, // 43: checkpicks.content.v1.ContentService.GetFeeds:output_type -> checkpicks.content.v1.GetFeedsResponse - 40, // [40:44] is the sub-list for method output_type - 36, // [36:40] is the sub-list for method input_type - 36, // [36:36] is the sub-list for extension type_name - 36, // [36:36] is the sub-list for extension extendee - 0, // [0:36] is the sub-list for field type_name + 18, // 0: checkpicks.content.v1.GetArticlesRequest.user_id:type_name -> google.protobuf.StringValue + 19, // 1: checkpicks.content.v1.GetArticlesRequest.language_status:type_name -> google.protobuf.Int64Value + 18, // 2: checkpicks.content.v1.GetArticlesRequest.tag:type_name -> google.protobuf.StringValue + 18, // 3: checkpicks.content.v1.GetArticlesRequest.feed_ids:type_name -> google.protobuf.StringValue + 15, // 4: checkpicks.content.v1.GetArticlesResponse.articlesEdge:type_name -> checkpicks.content.v1.ArticleEdge + 10, // 5: checkpicks.content.v1.GetArticlesResponse.page_info:type_name -> checkpicks.content.v1.PageInfo + 14, // 6: checkpicks.content.v1.CreateArticleResponse.article:type_name -> checkpicks.content.v1.Article + 17, // 7: checkpicks.content.v1.GetArticleOGPResponse.ogp:type_name -> checkpicks.content.v1.OGP + 16, // 8: checkpicks.content.v1.GetFeedsResponse.feed_edge:type_name -> checkpicks.content.v1.FeedEdge + 10, // 9: checkpicks.content.v1.GetFeedsResponse.page_info:type_name -> checkpicks.content.v1.PageInfo + 19, // 10: checkpicks.content.v1.GetFeedsRequest.platform_site_type:type_name -> google.protobuf.Int64Value + 18, // 11: checkpicks.content.v1.GetFeedsRequest.platform_id:type_name -> google.protobuf.StringValue + 18, // 12: checkpicks.content.v1.GetFeedsRequest.keyword:type_name -> google.protobuf.StringValue + 11, // 13: checkpicks.content.v1.GetFeedResponse.feed:type_name -> checkpicks.content.v1.Feed + 13, // 14: checkpicks.content.v1.Feed.platform:type_name -> checkpicks.content.v1.Platform + 12, // 15: checkpicks.content.v1.Feed.category:type_name -> checkpicks.content.v1.Category + 18, // 16: checkpicks.content.v1.Feed.api_query_param:type_name -> google.protobuf.StringValue + 20, // 17: checkpicks.content.v1.Feed.created_at:type_name -> google.protobuf.Timestamp + 20, // 18: checkpicks.content.v1.Feed.updated_at:type_name -> google.protobuf.Timestamp + 20, // 19: checkpicks.content.v1.Feed.deleted_at:type_name -> google.protobuf.Timestamp + 20, // 20: checkpicks.content.v1.Category.created_at:type_name -> google.protobuf.Timestamp + 20, // 21: checkpicks.content.v1.Category.updated_at:type_name -> google.protobuf.Timestamp + 20, // 22: checkpicks.content.v1.Category.deleted_at:type_name -> google.protobuf.Timestamp + 20, // 23: checkpicks.content.v1.Platform.created_at:type_name -> google.protobuf.Timestamp + 20, // 24: checkpicks.content.v1.Platform.updated_at:type_name -> google.protobuf.Timestamp + 20, // 25: checkpicks.content.v1.Platform.deleted_at:type_name -> google.protobuf.Timestamp + 13, // 26: checkpicks.content.v1.Article.platform:type_name -> checkpicks.content.v1.Platform + 11, // 27: checkpicks.content.v1.Article.feeds:type_name -> checkpicks.content.v1.Feed + 20, // 28: checkpicks.content.v1.Article.published_at:type_name -> google.protobuf.Timestamp + 18, // 29: checkpicks.content.v1.Article.author_name:type_name -> google.protobuf.StringValue + 18, // 30: checkpicks.content.v1.Article.tags:type_name -> google.protobuf.StringValue + 18, // 31: checkpicks.content.v1.Article.bookmark_id:type_name -> google.protobuf.StringValue + 20, // 32: checkpicks.content.v1.Article.created_at:type_name -> google.protobuf.Timestamp + 20, // 33: checkpicks.content.v1.Article.updated_at:type_name -> google.protobuf.Timestamp + 14, // 34: checkpicks.content.v1.ArticleEdge.article:type_name -> checkpicks.content.v1.Article + 11, // 35: checkpicks.content.v1.FeedEdge.feed:type_name -> checkpicks.content.v1.Feed + 18, // 36: checkpicks.content.v1.OGP.description:type_name -> google.protobuf.StringValue + 0, // 37: checkpicks.content.v1.ContentService.GetArticles:input_type -> checkpicks.content.v1.GetArticlesRequest + 3, // 38: checkpicks.content.v1.ContentService.CreateUploadArticle:input_type -> checkpicks.content.v1.CreateUploadArticleRequest + 5, // 39: checkpicks.content.v1.ContentService.GetArticleOGP:input_type -> checkpicks.content.v1.GetArticleOGPRequest + 7, // 40: checkpicks.content.v1.ContentService.GetFeeds:input_type -> checkpicks.content.v1.GetFeedsRequest + 9, // 41: checkpicks.content.v1.ContentService.GetFeed:input_type -> checkpicks.content.v1.GetFeedRequest + 1, // 42: checkpicks.content.v1.ContentService.GetArticles:output_type -> checkpicks.content.v1.GetArticlesResponse + 2, // 43: checkpicks.content.v1.ContentService.CreateUploadArticle:output_type -> checkpicks.content.v1.CreateArticleResponse + 4, // 44: checkpicks.content.v1.ContentService.GetArticleOGP:output_type -> checkpicks.content.v1.GetArticleOGPResponse + 6, // 45: checkpicks.content.v1.ContentService.GetFeeds:output_type -> checkpicks.content.v1.GetFeedsResponse + 8, // 46: checkpicks.content.v1.ContentService.GetFeed:output_type -> checkpicks.content.v1.GetFeedResponse + 42, // [42:47] is the sub-list for method output_type + 37, // [37:42] is the sub-list for method input_type + 37, // [37:37] is the sub-list for extension type_name + 37, // [37:37] is the sub-list for extension extendee + 0, // [0:37] is the sub-list for field type_name } func init() { file_content_content_proto_init() } @@ -1841,7 +1962,7 @@ func file_content_content_proto_init() { } } file_content_content_proto_msgTypes[8].Exporter = func(v any, i int) any { - switch v := v.(*PageInfo); i { + switch v := v.(*GetFeedResponse); i { case 0: return &v.state case 1: @@ -1853,7 +1974,7 @@ func file_content_content_proto_init() { } } file_content_content_proto_msgTypes[9].Exporter = func(v any, i int) any { - switch v := v.(*Feed); i { + switch v := v.(*GetFeedRequest); i { case 0: return &v.state case 1: @@ -1865,7 +1986,7 @@ func file_content_content_proto_init() { } } file_content_content_proto_msgTypes[10].Exporter = func(v any, i int) any { - switch v := v.(*Category); i { + switch v := v.(*PageInfo); i { case 0: return &v.state case 1: @@ -1877,7 +1998,7 @@ func file_content_content_proto_init() { } } file_content_content_proto_msgTypes[11].Exporter = func(v any, i int) any { - switch v := v.(*Platform); i { + switch v := v.(*Feed); i { case 0: return &v.state case 1: @@ -1889,7 +2010,7 @@ func file_content_content_proto_init() { } } file_content_content_proto_msgTypes[12].Exporter = func(v any, i int) any { - switch v := v.(*Article); i { + switch v := v.(*Category); i { case 0: return &v.state case 1: @@ -1901,7 +2022,7 @@ func file_content_content_proto_init() { } } file_content_content_proto_msgTypes[13].Exporter = func(v any, i int) any { - switch v := v.(*ArticleEdge); i { + switch v := v.(*Platform); i { case 0: return &v.state case 1: @@ -1913,7 +2034,7 @@ func file_content_content_proto_init() { } } file_content_content_proto_msgTypes[14].Exporter = func(v any, i int) any { - switch v := v.(*FeedEdge); i { + switch v := v.(*Article); i { case 0: return &v.state case 1: @@ -1925,6 +2046,30 @@ func file_content_content_proto_init() { } } file_content_content_proto_msgTypes[15].Exporter = func(v any, i int) any { + switch v := v.(*ArticleEdge); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_content_content_proto_msgTypes[16].Exporter = func(v any, i int) any { + switch v := v.(*FeedEdge); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_content_content_proto_msgTypes[17].Exporter = func(v any, i int) any { switch v := v.(*OGP); i { case 0: return &v.state @@ -1943,7 +2088,7 @@ func file_content_content_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_content_content_proto_rawDesc, NumEnums: 0, - NumMessages: 16, + NumMessages: 18, NumExtensions: 0, NumServices: 1, }, diff --git a/micro-service/user-service/grpc/content/content_grpc.pb.go b/micro-service/user-service/grpc/content/content_grpc.pb.go index d6c3acbf..2ee8c359 100644 --- a/micro-service/user-service/grpc/content/content_grpc.pb.go +++ b/micro-service/user-service/grpc/content/content_grpc.pb.go @@ -23,6 +23,7 @@ const ( ContentService_CreateUploadArticle_FullMethodName = "/checkpicks.content.v1.ContentService/CreateUploadArticle" ContentService_GetArticleOGP_FullMethodName = "/checkpicks.content.v1.ContentService/GetArticleOGP" ContentService_GetFeeds_FullMethodName = "/checkpicks.content.v1.ContentService/GetFeeds" + ContentService_GetFeed_FullMethodName = "/checkpicks.content.v1.ContentService/GetFeed" ) // ContentServiceClient is the client API for ContentService service. @@ -33,6 +34,7 @@ type ContentServiceClient interface { CreateUploadArticle(ctx context.Context, in *CreateUploadArticleRequest, opts ...grpc.CallOption) (*CreateArticleResponse, error) GetArticleOGP(ctx context.Context, in *GetArticleOGPRequest, opts ...grpc.CallOption) (*GetArticleOGPResponse, error) GetFeeds(ctx context.Context, in *GetFeedsRequest, opts ...grpc.CallOption) (*GetFeedsResponse, error) + GetFeed(ctx context.Context, in *GetFeedRequest, opts ...grpc.CallOption) (*GetFeedResponse, error) } type contentServiceClient struct { @@ -83,6 +85,16 @@ func (c *contentServiceClient) GetFeeds(ctx context.Context, in *GetFeedsRequest return out, nil } +func (c *contentServiceClient) GetFeed(ctx context.Context, in *GetFeedRequest, opts ...grpc.CallOption) (*GetFeedResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(GetFeedResponse) + err := c.cc.Invoke(ctx, ContentService_GetFeed_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + // ContentServiceServer is the server API for ContentService service. // All implementations should embed UnimplementedContentServiceServer // for forward compatibility. @@ -91,6 +103,7 @@ type ContentServiceServer interface { CreateUploadArticle(context.Context, *CreateUploadArticleRequest) (*CreateArticleResponse, error) GetArticleOGP(context.Context, *GetArticleOGPRequest) (*GetArticleOGPResponse, error) GetFeeds(context.Context, *GetFeedsRequest) (*GetFeedsResponse, error) + GetFeed(context.Context, *GetFeedRequest) (*GetFeedResponse, error) } // UnimplementedContentServiceServer should be embedded to have @@ -112,6 +125,9 @@ func (UnimplementedContentServiceServer) GetArticleOGP(context.Context, *GetArti func (UnimplementedContentServiceServer) GetFeeds(context.Context, *GetFeedsRequest) (*GetFeedsResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method GetFeeds not implemented") } +func (UnimplementedContentServiceServer) GetFeed(context.Context, *GetFeedRequest) (*GetFeedResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetFeed not implemented") +} func (UnimplementedContentServiceServer) testEmbeddedByValue() {} // UnsafeContentServiceServer may be embedded to opt out of forward compatibility for this service. @@ -204,6 +220,24 @@ func _ContentService_GetFeeds_Handler(srv interface{}, ctx context.Context, dec return interceptor(ctx, in, info, handler) } +func _ContentService_GetFeed_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetFeedRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ContentServiceServer).GetFeed(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: ContentService_GetFeed_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ContentServiceServer).GetFeed(ctx, req.(*GetFeedRequest)) + } + return interceptor(ctx, in, info, handler) +} + // ContentService_ServiceDesc is the grpc.ServiceDesc for ContentService service. // It's only intended for direct use with grpc.RegisterService, // and not to be introspected or modified (even as a copy) @@ -227,6 +261,10 @@ var ContentService_ServiceDesc = grpc.ServiceDesc{ MethodName: "GetFeeds", Handler: _ContentService_GetFeeds_Handler, }, + { + MethodName: "GetFeed", + Handler: _ContentService_GetFeed_Handler, + }, }, Streams: []grpc.StreamDesc{}, Metadata: "content/content.proto", diff --git a/scripts/protoc-generate.sh b/scripts/protoc-generate.sh index 70f3b335..5842624f 100755 --- a/scripts/protoc-generate.sh +++ b/scripts/protoc-generate.sh @@ -114,3 +114,17 @@ mkdir "${OUT_DIR_BFF}" cd "${ROOT_DIR}/bff/apollo-gateway" npm run gen:proto > /dev/null 2>&1 || exit 1 + +# Generate mock rpc client +cd "${ROOT_DIR}/micro-service/content-service" +make gen-client-mock source=grpc/bookmark/bookmark_grpc.pb.go output=bookmark_service.go > /dev/null 2>&1 || exit 1 +make gen-client-mock source=grpc/favorite/favorite_grpc.pb.go output=favorite_service.go > /dev/null 2>&1 || exit 1 + +cd "${ROOT_DIR}/micro-service/bookmark-service" +make gen-client-mock source=grpc/content/content_grpc.pb.go output=content_service.go > /dev/null 2>&1 || exit 1 +make gen-client-mock source=grpc/favorite/favorite_grpc.pb.go output=favorite_service.go > /dev/null 2>&1 || exit 1 + +cd "${ROOT_DIR}/micro-service/favorite-service" +make gen-client-mock source=grpc/content/content_grpc.pb.go output=content_service.go > /dev/null 2>&1 || exit 1 +make gen-client-mock source=grpc/bookmark/bookmark_grpc.pb.go output=bookmark_service.go > /dev/null 2>&1 || exit 1 + diff --git a/web/client-v2/src/features/feeds/components/Template/FeedArticleListTemplate/FeedArticleListTemplate.tsx b/web/client-v2/src/features/feeds/components/Template/FeedArticleListTemplate/FeedArticleListTemplate.tsx index f445fac2..6b9cd280 100644 --- a/web/client-v2/src/features/feeds/components/Template/FeedArticleListTemplate/FeedArticleListTemplate.tsx +++ b/web/client-v2/src/features/feeds/components/Template/FeedArticleListTemplate/FeedArticleListTemplate.tsx @@ -5,6 +5,7 @@ import { BreadCrumbType, PageBreadcrumb } from "@/components/ui/breadcrumb"; import { PreloadQuery } from "@/lib/apollo/client"; +import { getServerFeedArticleTemplateQuery } from "./actGetServerFeedArticleTemplateQuery"; import { FeedArticleListTemplateQuery } from "./FeedArticleListTemplateQuery"; import { FeedArticleList } from "../../List"; @@ -13,10 +14,14 @@ type FeedArticleListTemplateProps = { keyword?: string; }; -export const FeedArticleListTemplate: FC = ({ - id, - keyword, -}) => { +export const FeedArticleListTemplate: FC< + FeedArticleListTemplateProps +> = async ({ id, keyword }) => { + const { data, error } = await getServerFeedArticleTemplateQuery(id); + if (error) { + return
Not Found
; + } + const breadcrumbs: BreadCrumbType[] = [ { title: "Home", @@ -27,7 +32,7 @@ export const FeedArticleListTemplate: FC = ({ href: "/feed", }, { - title: "", + title: data?.feed?.name || "", href: `/feed/${id}`, }, ]; diff --git a/web/client-v2/src/features/feeds/components/Template/FeedArticleListTemplate/actGetFeedArticleListTemplateQuery.ts b/web/client-v2/src/features/feeds/components/Template/FeedArticleListTemplate/actGetFeedArticleListTemplateQuery.ts deleted file mode 100644 index 908fe79e..00000000 --- a/web/client-v2/src/features/feeds/components/Template/FeedArticleListTemplate/actGetFeedArticleListTemplateQuery.ts +++ /dev/null @@ -1 +0,0 @@ -"use server"; diff --git a/web/client-v2/src/features/feeds/components/Template/FeedArticleListTemplate/actGetServerFeedArticleTemplateQuery.ts b/web/client-v2/src/features/feeds/components/Template/FeedArticleListTemplate/actGetServerFeedArticleTemplateQuery.ts new file mode 100644 index 00000000..0fbb3d6e --- /dev/null +++ b/web/client-v2/src/features/feeds/components/Template/FeedArticleListTemplate/actGetServerFeedArticleTemplateQuery.ts @@ -0,0 +1,28 @@ +"use server"; + +import { graphql } from "gql.tada"; + +import { getClient } from "@/lib/apollo/client"; + +const GetServerFeedArticleTemplateQuery = graphql(` + query GetServerFeedArticleTemplateQuery($input: FeedInput!) { + feed(feedInput: $input) { + id + name + } + } +`); + +export const getServerFeedArticleTemplateQuery = async (id: string) => { + const { data, error, loading } = await getClient().query({ + query: GetServerFeedArticleTemplateQuery, + variables: { + input: { + id, + }, + }, + errorPolicy: "all", + }); + + return { data, error, loading }; +}; diff --git a/web/client-v2/src/graphql/type.ts b/web/client-v2/src/graphql/type.ts index 297140b0..2083c17a 100644 --- a/web/client-v2/src/graphql/type.ts +++ b/web/client-v2/src/graphql/type.ts @@ -789,6 +789,13 @@ export type FeedArticleListTemplateQueryQueryVariables = Exact<{ export type FeedArticleListTemplateQueryQuery = { __typename?: 'Query', articles: { __typename?: 'ArticleConnection', pageInfo: { __typename?: 'PageInfo', hasNextPage: boolean, hasPreviousPage: boolean, startCursor?: string | null, endCursor?: string | null }, edges: Array<{ __typename?: 'ArticleEdge', node: { __typename: 'Article', id: string, title: string, description: string, articleUrl: string, publishedAt?: number | null, authorName?: string | null, tags?: string | null, thumbnailUrl: string, isEng: boolean, isPrivate: boolean, isBookmarked: boolean, bookmarkId?: string | null, likeCount?: number | null, isFollowing: boolean, favoriteArticleFolderIds: Array, platform?: { __typename?: 'Platform', id: string, name: string, siteUrl: string, faviconUrl: string } | null, feeds?: Array<{ __typename?: 'Feed', id: string, name: string }> | null } }> }, favoriteArticleFolders: { __typename?: 'FavoriteArticleFolderConnection', edges: Array<{ __typename?: 'FavoriteArticleFolderEdge', node: { __typename?: 'FavoriteArticleFolder', id: string, title: string } }> } }; +export type GetServerFeedArticleTemplateQueryQueryVariables = Exact<{ + input: FeedInput; +}>; + + +export type GetServerFeedArticleTemplateQueryQuery = { __typename?: 'Query', feed: { __typename?: 'Feed', id: string, name: string } }; + export type FeedListTemplateQueryQueryVariables = Exact<{ input: FeedsInput; }>; @@ -2407,6 +2414,47 @@ export type FeedArticleListTemplateQueryQueryHookResult = ReturnType; export type FeedArticleListTemplateQuerySuspenseQueryHookResult = ReturnType; export type FeedArticleListTemplateQueryQueryResult = Apollo.QueryResult; +export const GetServerFeedArticleTemplateQueryDocument = gql` + query GetServerFeedArticleTemplateQuery($input: FeedInput!) { + feed(feedInput: $input) { + id + name + } +} + `; + +/** + * __useGetServerFeedArticleTemplateQueryQuery__ + * + * To run a query within a React component, call `useGetServerFeedArticleTemplateQueryQuery` and pass it any options that fit your needs. + * When your component renders, `useGetServerFeedArticleTemplateQueryQuery` returns an object from Apollo Client that contains loading, error, and data properties + * you can use to render your UI. + * + * @param baseOptions options that will be passed into the query, supported options are listed on: https://www.apollographql.com/docs/react/api/react-hooks/#options; + * + * @example + * const { data, loading, error } = useGetServerFeedArticleTemplateQueryQuery({ + * variables: { + * input: // value for 'input' + * }, + * }); + */ +export function useGetServerFeedArticleTemplateQueryQuery(baseOptions: Apollo.QueryHookOptions & ({ variables: GetServerFeedArticleTemplateQueryQueryVariables; skip?: boolean; } | { skip: boolean; }) ) { + const options = {...defaultOptions, ...baseOptions} + return Apollo.useQuery(GetServerFeedArticleTemplateQueryDocument, options); + } +export function useGetServerFeedArticleTemplateQueryLazyQuery(baseOptions?: Apollo.LazyQueryHookOptions) { + const options = {...defaultOptions, ...baseOptions} + return Apollo.useLazyQuery(GetServerFeedArticleTemplateQueryDocument, options); + } +export function useGetServerFeedArticleTemplateQuerySuspenseQuery(baseOptions?: Apollo.SuspenseQueryHookOptions) { + const options = {...defaultOptions, ...baseOptions} + return Apollo.useSuspenseQuery(GetServerFeedArticleTemplateQueryDocument, options); + } +export type GetServerFeedArticleTemplateQueryQueryHookResult = ReturnType; +export type GetServerFeedArticleTemplateQueryLazyQueryHookResult = ReturnType; +export type GetServerFeedArticleTemplateQuerySuspenseQueryHookResult = ReturnType; +export type GetServerFeedArticleTemplateQueryQueryResult = Apollo.QueryResult; export const FeedListTemplateQueryDocument = gql` query FeedListTemplateQuery($input: FeedsInput!) { feeds(feedsInput: $input) {