syntax = "proto3";

package memos.api.v2;

import "api/v2/common.proto";
import "google/api/annotations.proto";
import "google/api/client.proto";

option go_package = "gen/api/v2";

service MemoService {
  rpc CreateMemo(CreateMemoRequest) returns (CreateMemoResponse) {
    option (google.api.http) = {post: "/api/v2/memos"};
  }

  rpc ListMemos(ListMemosRequest) returns (ListMemosResponse) {
    option (google.api.http) = {get: "/api/v2/memos"};
  }

  rpc GetMemo(GetMemoRequest) returns (GetMemoResponse) {
    option (google.api.http) = {get: "/api/v2/memos/{id}"};
    option (google.api.method_signature) = "id";
  }

  rpc CreateMemoComment(CreateMemoCommentRequest) returns (CreateMemoCommentResponse) {
    option (google.api.http) = {post: "/api/v2/memos/{id}/comments"};
    option (google.api.method_signature) = "id";
  }

  rpc ListMemoComments(ListMemoCommentsRequest) returns (ListMemoCommentsResponse) {
    option (google.api.http) = {get: "/api/v2/memos/{id}/comments"};
    option (google.api.method_signature) = "id";
  }
}

enum Visibility {
  VISIBILITY_UNSPECIFIED = 0;

  PRIVATE = 1;

  PROTECTED = 2;

  PUBLIC = 3;
}

message Memo {
  int32 id = 1;

  RowStatus row_status = 2;

  int32 creator_id = 3;

  int64 created_ts = 4;

  int64 updated_ts = 5;

  string content = 6;

  Visibility visibility = 7;

  bool pinned = 8;
}

message CreateMemoRequest {
  string content = 1;

  Visibility visibility = 2;
}

message CreateMemoResponse {
  Memo memo = 1;
}

message ListMemosRequest {
  int32 page = 1;

  int32 page_size = 2;

  // Filter is used to filter memos returned in the list.
  string filter = 3;
}

message ListMemosResponse {
  repeated Memo memos = 1;
}

message GetMemoRequest {
  int32 id = 1;
}

message GetMemoResponse {
  Memo memo = 1;
}

message CreateMemoCommentRequest {
  // id is the memo id to create comment for.
  int32 id = 1;

  CreateMemoRequest create = 2;
}

message CreateMemoCommentResponse {
  Memo memo = 1;
}

message ListMemoCommentsRequest {
  int32 id = 1;
}

message ListMemoCommentsResponse {
  repeated Memo memos = 1;
}
