syntax = "proto3";

package memos.api.v2;

import "google/api/annotations.proto";
import "google/api/client.proto";
import "google/protobuf/field_mask.proto";
import "google/protobuf/timestamp.proto";

option go_package = "gen/api/v2";

service ResourceService {
  // CreateResource creates a new resource.
  rpc CreateResource(CreateResourceRequest) returns (CreateResourceResponse) {
    option (google.api.http) = {post: "/api/v2/resources"};
  }
  // ListResources lists all resources.
  rpc ListResources(ListResourcesRequest) returns (ListResourcesResponse) {
    option (google.api.http) = {get: "/api/v2/resources"};
  }
  // GetResource returns a resource by id.
  rpc GetResource(GetResourceRequest) returns (GetResourceResponse) {
    option (google.api.http) = {get: "/api/v2/resources/{id}"};
    option (google.api.method_signature) = "id";
  }
  // GetResourceByName returns a resource by name.
  rpc GetResourceByName(GetResourceByNameRequest) returns (GetResourceByNameResponse) {
    option (google.api.http) = {get: "/api/v2/resources/name/{name}"};
    option (google.api.method_signature) = "name";
  }
  // UpdateResource updates a resource.
  rpc UpdateResource(UpdateResourceRequest) returns (UpdateResourceResponse) {
    option (google.api.http) = {
      patch: "/api/v2/resources/{resource.id}",
      body: "resource"
    };
    option (google.api.method_signature) = "resource,update_mask";
  }
  // DeleteResource deletes a resource by id.
  rpc DeleteResource(DeleteResourceRequest) returns (DeleteResourceResponse) {
    option (google.api.http) = {delete: "/api/v2/resources/{id}"};
    option (google.api.method_signature) = "id";
  }
}

message Resource {
  // id is the system generated unique identifier.
  int32 id = 1;

  // name is the user provided name.
  string name = 2;

  google.protobuf.Timestamp create_time = 3;

  string filename = 4;

  string external_link = 5;

  string type = 6;

  int64 size = 7;

  optional int32 memo_id = 8;
}

message CreateResourceRequest {
  string filename = 1;
  string external_link = 2;
  string type = 3;
  optional int32 memo_id = 4;
}

message CreateResourceResponse {
  Resource resource = 1;
}

message ListResourcesRequest {}

message ListResourcesResponse {
  repeated Resource resources = 1;
}

message GetResourceRequest {
  int32 id = 1;
}

message GetResourceResponse {
  Resource resource = 1;
}

message GetResourceByNameRequest {
  string name = 1;
}

message GetResourceByNameResponse {
  Resource resource = 1;
}

message UpdateResourceRequest {
  Resource resource = 1;

  google.protobuf.FieldMask update_mask = 2;
}

message UpdateResourceResponse {
  Resource resource = 1;
}

message DeleteResourceRequest {
  int32 id = 1;
}

message DeleteResourceResponse {}
