syntax = "proto3"; import "github.com/gogo/protobuf/gogoproto/gogo.proto"; import "google/protobuf/empty.proto"; package bbq.service.topic.v1; option go_package = "api"; option (gogoproto.goproto_getters_all) = false; message ListExtensionReq { repeated int64 svids = 1; } message ListExtensionReply { repeated VideoExtension list = 1; } message UpdateVideoScoreReq { int64 svid = 1; double score = 2; } message UpdateVideoStateReq { int64 svid = 1; int32 state = 2; } message TopicVideosReq { int64 topic_id = 1[(gogoproto.moretags)='form:"topic_id"']; string cursor_prev = 2[(gogoproto.moretags)='form:"cursor_prev"']; string cursor_next = 3[(gogoproto.moretags)='form:"cursor_next"']; } message ListMultiTopicVideosReq { repeated TopicVideosReq list = 1; } message VideoItem { int64 svid = 1; string cursor_value = 2; int64 hot_type = 3; } message TopicDetail { TopicInfo topic_info = 1; repeated VideoItem list = 2; bool has_more = 3[(gogoproto.jsontag) = "has_more"]; } message ListDiscoveryTopicReq { int32 page = 1[(gogoproto.moretags)='form:"page" validate:"required"']; } message ListDiscoveryTopicReply { repeated TopicDetail list = 1; bool has_more = 2; } message ListTopicsReq { int32 page = 1[(gogoproto.moretags)='form:"page" validate:"required"']; } message ListTopicsReply { bool has_more = 1[(gogoproto.jsontag) = "has_more"]; repeated TopicInfo list = 2; } message StickTopicReq { int64 topic_id = 1[(gogoproto.moretags)='form:"topic_id" validate:"required"']; int64 op = 2[(gogoproto.moretags)='form:"op"'];// 0表示取消置顶,1表示置顶 } message StickTopicVideoReq { int64 topic_id = 1[(gogoproto.moretags)='form:"topic_id" validate:"required"']; int64 svid = 2[(gogoproto.moretags)='form:"svid" validate:"required"']; int64 op = 3[(gogoproto.moretags)='form:"op"'];// 0表示取消置顶,1表示置顶 } message SetStickTopicVideoReq { int64 topic_id = 1[(gogoproto.moretags)='form:"topic_id" validate:"required"']; repeated int64 svids = 2[(gogoproto.moretags)='form:"svids"']; } // 所有查找走同一个接口 message ListCmsTopicsReq { int32 page = 1[(gogoproto.moretags)='form:"page" validate:"required"']; string name = 2[(gogoproto.moretags)='form:"name"']; int64 topic_id = 3[(gogoproto.moretags)='form:"topic_id"']; int32 state = 4[(gogoproto.moretags)='form:"state"']; } message ListCmsTopicsReply { bool has_more = 1[(gogoproto.jsontag) = "has_more"]; repeated TopicInfo list = 2; } service Topic { ////////////////extension//////////////// rpc Register (VideoExtension) returns (.google.protobuf.Empty); rpc ListExtension (ListExtensionReq) returns (ListExtensionReply); //////////////////topic/////////////////// rpc UpdateVideoScore(UpdateVideoScoreReq) returns (.google.protobuf.Empty); rpc UpdateVideoState(UpdateVideoStateReq) returns (.google.protobuf.Empty); // 获取话题下的视频 rpc ListTopicVideos (TopicVideosReq) returns (TopicDetail); // TODO: to deleted. 发现页分成先请求话题,再请求话题下视频 // 获取发现页下的话题 rpc ListDiscoveryTopics (ListDiscoveryTopicReq) returns (ListDiscoveryTopicReply); // 推荐的话题,不会返回话题内的视频 rpc ListTopics (ListTopicsReq) returns (ListTopicsReply); ///// cms ///// rpc StickTopic(StickTopicReq) returns (.google.protobuf.Empty); // 置顶、取消置顶话题下的视频(需要cms先去判断该视频是否可以放在话题中) rpc StickTopicVideo(StickTopicVideoReq) returns (.google.protobuf.Empty); rpc SetStickTopicVideo(SetStickTopicVideoReq) returns (.google.protobuf.Empty); // 注意:该接口不支持复杂条件,当以下三种同时请求的时候只会按顺序选择一种进行返回: // 话题name查找接口,不区分隐藏,返回数组,但是暂时只会完全匹配, // 话题隐藏列表接口,按照时间反向排序 // 话题推荐列表接口,按照热度反向排序,其中第一页会包含置顶话题 rpc ListCmsTopics(ListCmsTopicsReq) returns (ListCmsTopicsReply); // 修改话题简介,topic_id必传传,直接放在http请求里 rpc UpdateTopicDesc(TopicInfo) returns (.google.protobuf.Empty); rpc UpdateTopicState(TopicInfo) returns (.google.protobuf.Empty); // 话题详情页,含话题信息+视频信息 // 使用video-c的topic/detail接口,php内部转换成cms逻辑 // 根据svid返回topic_id列表 rpc VideoTopic(VideoTopicReq) returns (VideoTopicReply); } message TopicVideoItem { int64 topic_id = 1; int64 svid = 2; double score = 3; int32 state = 4; } message VideoTopicReq { int64 svid = 1[(gogoproto.moretags)='form:"svid"']; } message VideoTopicReply { repeated TopicVideoItem list = 1; } message UpdateTopicStateReq { int64 topic_id = 1[(gogoproto.moretags)='form:"topic_id"']; int32 op = 2[(gogoproto.moretags)='form:"op"'];// 0表示通过,1表示下架 } message TopicInfo { int64 topic_id = 1[(gogoproto.moretags)='form:"topic_id"']; string name = 2; string desc = 3[(gogoproto.moretags)='form:"desc"']; double score = 4; int32 state = 5[(gogoproto.moretags)='form:"state"'];// 0表示通过,1表示下架 int32 hot_type = 6[(gogoproto.jsontag)="hot_type"]; string cover_url = 7[(gogoproto.moretags)='form:"cover_url"']; } message TitleExtraItem { int64 id = 1[(gogoproto.jsontag) = "id"]; int64 type = 2[(gogoproto.jsontag) = "type"]; string name = 3[(gogoproto.jsontag) = "name"]; int64 start = 4[(gogoproto.jsontag) = "start"]; int64 end = 5[(gogoproto.jsontag) = "end"]; string scheme = 6[(gogoproto.jsontag) = "scheme"]; } // 用于传递给上游的extension,通过序列化赋值给extension message VideoExtension { int64 svid = 1; string extension = 2; // 序列化后的Extension会放在这里 } // 结构化的extension,真正的extension message Extension { repeated TitleExtraItem title_extra = 1; }