syntax = "proto3";

import "google/protobuf/timestamp.proto";
import "gogoproto/gogo.proto";
// import "validate/validate.proto";
import "google/api/annotations.proto";
import "google/protobuf/empty.proto";
import "api/v1/attachment.proto";
import "api/v1/user.proto";

package api.v1;

option go_package = "moredoc/api/v1;v1";
option java_multiple_files = true;
option java_package = "api.v1";

// 文档
message Document {
  int64 id = 1;              // 文档ID
  string title = 2;          // 文档标题
  string keywords = 3;       // 文档关键字
  string description = 4;    // 文档描述
  int64 user_id = 5;         // 文档作者
  string cover = 6;          // 文档封面
  int32 width = 7;           // 文档宽度
  int32 height = 8;          // 文档高度
  int32 preview = 9;         // 文档可预览页数，0表示不限制
  int32 pages = 10;          // 文档页数
  string uuid = 11;          // 文档UUID
  int32 download_count = 12; // 文档下载次数
  int32 view_count = 13;     // 文档浏览次数
  int32 favorite_count = 14; // 文档收藏次数
  int32 comment_count = 15;  // 文档评论次数
  int32 score = 16;          // 文档评分
  int32 score_count = 17;    // 文档评分次数
  int32 price = 18;          // 文档价格
  int64 size = 19;           // 文档大小
  int32 status = 20;         // 文档状态，见 web/utils/enum.js
  google.protobuf.Timestamp created_at = 21
      [ (gogoproto.stdtime) = true ]; // 文档创建时间
  google.protobuf.Timestamp updated_at = 22
      [ (gogoproto.stdtime) = true ]; // 文档更新时间
  google.protobuf.Timestamp deleted_at = 23
      [ (gogoproto.stdtime) = true ]; // 文档删除时间
  google.protobuf.Timestamp recommend_at = 29
      [ (gogoproto.stdtime) = true ]; // 文档推荐时间
  int64 deleted_user_id = 24;         // 删除文档的用户
  string username = 25;               // 文档作者用户名
  repeated int64 category_id = 26;    // 文档分类ID
  string deleted_username = 27;       // 删除文档的用户名
  string ext = 28;                    // 文档扩展名
  Attachment attachment = 30;         // 文档附件
  User user = 31;                     // 文档作者
  bool enable_gzip = 32;              // 是否启用gzip压缩
  string convert_error = 33;          // 转换错误信息
}

// 删除文档，放入回收站
message DeleteDocumentRequest { repeated int64 id = 1; }

// 恢复文档
message RecoverRecycleDocumentRequest { repeated int64 id = 1; }

// 查询文档
message GetDocumentRequest {
  int64 id = 1;         // 文档ID
  bool with_author = 2; // 是否查询作者信息
}

// 文档列表
message ListDocumentRequest {
  int64 page = 1;                 // 页码
  int64 size = 2;                 // 每页数量
  string wd = 3;                  // 搜索关键字
  repeated string field = 4;      // 查询字段
  string order = 5;               // 排序
  repeated int64 category_id = 6; // 分类ID
  repeated int64 user_id = 7;     // 用户ID
  repeated int32 status = 8;      // 文档状态
  repeated bool is_recommend = 9; // 是否推荐
  int64 limit = 10; // 查询数量显示。当该值大于0时，page和size无效
}

// 文档列表
message ListDocumentReply {
  int64 total = 1;                // 文档总数
  repeated Document document = 2; // 文档列表
}

// 创建文档
message CreateDocumentItem {
  string title = 1;        // 文档标题
  int64 attachment_id = 2; // 文档附件ID
  int32 price = 3;         // 文档价格
}

// 创建文档
message CreateDocumentRequest {
  bool overwrite = 1;                       // 是否覆盖。暂时用不到
  repeated int64 category_id = 2;           // 文档分类ID
  repeated CreateDocumentItem document = 3; // 文档列表
}

// 设置文档推荐
message SetDocumentRecommendRequest {
  repeated int64 id = 1; // 文档ID
  int32 type = 2;        // 0, 取消推荐，1:推荐 2:重新推荐
}

// 查询文档（针对首页的查询）
message ListDocumentForHomeRequest { int64 limit = 1; }

// 首页文档查询返回项
message ListDocumentForHomeItem {
  int64 category_id = 1;          // 分类ID
  string category_cover = 2;      // 分类封面
  string category_name = 3;       // 分类名称
  repeated Document document = 4; // 文档列表
}

// 查询文档（针对首页的查询）
message ListDocumentForHomeResponse {
  repeated ListDocumentForHomeItem document = 1; // 文档列表
}

// 文档搜索
message SearchDocumentRequest {
  int32 page = 1;                 // 页码
  int32 size = 2;                 // 每页数量
  string wd = 3;                  // 搜索关键字
  repeated int64 category_id = 4; // 分类
  string sort = 5;                // 排序
  string ext = 7;                 // 类型
}

// 文档评分
message DocumentScore {
  int64 id = 1;          // 评分ID
  int64 document_id = 2; // 文档ID
  int64 user_id = 3;     // 用户ID
  int32 score = 4;       // 评分，100~500，100为1分，500为5分
  google.protobuf.Timestamp created_at = 5
      [ (gogoproto.stdtime) = true ]; // 评分时间
  google.protobuf.Timestamp updated_at = 6
      [ (gogoproto.stdtime) = true ]; // 更新时间
}

// 文档搜索响应
message SearchDocumentReply {
  int64 total = 1;                // 文档总数
  string spend = 2;               // 搜索耗时
  repeated Document document = 3; // 文档列表
}

// 文档下载
message DownloadDocumentReply { string url = 1; }

// 文档服务
service DocumentAPI {

  // 针对首页的文档查询
  rpc ListDocumentForHome(ListDocumentForHomeRequest)
      returns (ListDocumentForHomeResponse) {
    option (google.api.http) = {
      get : '/api/v1/document/home',
    };
  }

  // 设置文档推荐
  rpc SetDocumentRecommend(SetDocumentRecommendRequest)
      returns (google.protobuf.Empty) {
    option (google.api.http) = {
      put : '/api/v1/document/recommend',
      body : '*',
    };
  }

  // 创建文档
  rpc CreateDocument(CreateDocumentRequest) returns (google.protobuf.Empty) {
    option (google.api.http) = {
      post : '/api/v1/document',
      body : '*',
    };
  }

  // 更新文档
  rpc UpdateDocument(Document) returns (google.protobuf.Empty) {
    option (google.api.http) = {
      put : '/api/v1/document',
      body : '*',
    };
  }

  // 删除文档
  rpc DeleteDocument(DeleteDocumentRequest) returns (google.protobuf.Empty) {
    option (google.api.http) = {
      delete : '/api/v1/document',
    };
  }

  // 查询文档
  rpc GetDocument(GetDocumentRequest) returns (Document) {
    option (google.api.http) = {
      get : '/api/v1/document',
    };
  }

  // 根据文档ID查询当前文档的相关文档
  rpc GetRelatedDocuments(Document) returns (ListDocumentReply) {
    option (google.api.http) = {
      get : '/api/v1/document/related',
    };
  }

  // 根据文档ID，获取文档下载链接
  rpc DownloadDocument(Document) returns (DownloadDocumentReply) {
    option (google.api.http) = {
      get : '/api/v1/document/download',
    };
  }

  // 文档列表查询
  rpc ListDocument(ListDocumentRequest) returns (ListDocumentReply) {
    option (google.api.http) = {
      get : '/api/v1/document/list',
    };
  }

  // 文档搜索
  rpc SearchDocument(SearchDocumentRequest) returns (SearchDocumentReply) {
    option (google.api.http) = {
      get : '/api/v1/document/search',
    };
  }

  // 设置文档评分
  rpc SetDocumentScore(DocumentScore) returns (google.protobuf.Empty) {
    option (google.api.http) = {
      post : '/api/v1/document/score',
      body : '*',
    };
  }

  // 获取当前登录用户的文档评分
  rpc GetDocumentScore(DocumentScore) returns (DocumentScore) {
    option (google.api.http) = {
      get : '/api/v1/document/score',
    };
  }

  // 将文档一键设置为重转
  rpc SetDocumentReconvert(google.protobuf.Empty)
      returns (google.protobuf.Empty) {
    option (google.api.http) = {
      put : '/api/v1/document/reconvert',
    };
  }
}

service RecycleAPI {
  // 文档回收站列表
  rpc ListRecycleDocument(ListDocumentRequest) returns (ListDocumentReply) {
    option (google.api.http) = {
      get : '/api/v1/document/recycle',
    };
  }

  // 恢复回收站文档，支持恢复单个文档或者是批量恢复
  rpc RecoverRecycleDocument(RecoverRecycleDocumentRequest)
      returns (google.protobuf.Empty) {
    option (google.api.http) = {
      put : '/api/v1/document/recycle',
      body : '*',
    };
  }

  // 删除回收站文档
  rpc DeleteRecycleDocument(DeleteDocumentRequest)
      returns (google.protobuf.Empty) {
    option (google.api.http) = {
      delete : '/api/v1/document/recycle',
    };
  }

  // 清空回收站文档
  rpc ClearRecycleDocument(google.protobuf.Empty)
      returns (google.protobuf.Empty) {
    option (google.api.http) = {
      delete : '/api/v1/document/recycle/all',
    };
  }
}