syntax = "proto3";
package paralus.dev.rpc.system.v3;

import "google/api/annotations.proto";
import "protoc-gen-openapiv2/options/annotations.proto";
import "proto/types/systempb/v3/organization.proto";

option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_swagger) = {
  info: {
    title: "Organization Service"
    version: "3.0"
    contact: { name: "Paralus Dev" }
  }
  schemes: HTTPS
  consumes: "application/json"
  consumes: "application/yaml"
  produces: "application/json"
  produces: "application/yaml"
  security_definitions: {
    security: {
      key: "BasicAuth"
      value: { type: TYPE_BASIC }
    }
    security: {
      key: "ApiKeyAuth"
      value: { type: TYPE_API_KEY in: IN_HEADER name: "X-PARALUS-API-KEYID" }
    }
  }
  security: {
    security_requirement: {
      key: "BasicAuth"
      value: {}
    }
    security_requirement: {
      key: "ApiKeyAuth"
      value: {}
    }
  }
  responses: {
    key: "403"
    value: {
      description: "Returned when the user does not have permission to access the resource."
    }
  }
  responses: {
    key: "404"
    value: {
      description: "Returned when the resource does not exist."
      schema: { json_schema: { type: STRING } }
    }
  }
};

service OrganizationService {
  rpc CreateOrganization(paralus.dev.types.system.v3.Organization)
      returns (paralus.dev.types.system.v3.Organization) {
    option (google.api.http) = {
      post : "/auth/v3/partner/{metadata.partner}/organization"
      body : "*"
    };

    option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = {
      responses : {
        key : "201"
        value : {
          description : "Returned when organization is created successfully."
        }
      }
    };
  };

  rpc GetOrganizations(paralus.dev.types.system.v3.Organization)
      returns (paralus.dev.types.system.v3.OrganizationList) {
    option (google.api.http) = {
      get : "/auth/v3/partner/{metadata.partner}/organizations"
    };
  };

  rpc GetOrganization(paralus.dev.types.system.v3.Organization)
      returns (paralus.dev.types.system.v3.Organization) {
    option (google.api.http) = {
      get : "/auth/v3/partner/{metadata.partner}/organization/"
            "{metadata.name}"
    };
  };

  rpc UpdateOrganization(paralus.dev.types.system.v3.Organization)
      returns (paralus.dev.types.system.v3.Organization) {
    option (google.api.http) = {
      put : "/auth/v3/partner/{metadata.partner}/organization/"
            "{metadata.name}"
      body : "*"
    };
  };

  rpc DeleteOrganization(paralus.dev.types.system.v3.Organization)
      returns (paralus.dev.types.system.v3.Organization) {
    option (google.api.http) = {
      delete : "/auth/v3/partner/{metadata.partner}/organization/"
               "{metadata.name}"
    };

    option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = {
      responses : {
        key : "204"
        value : {
          description : "Returned when organization is deleted successfully."
        }
      }
    };
  };
}