syntax = "proto3";

package memos.api.v1;

import "google/api/annotations.proto";
import "google/api/client.proto";
import "google/api/field_behavior.proto";

option go_package = "gen/api/v1";

service WorkspaceSettingService {
  // ListWorkspaceSetting returns the list of settings.
  rpc ListWorkspaceSettings(ListWorkspaceSettingsRequest) returns (ListWorkspaceSettingsResponse) {
    option (google.api.http) = {get: "/api/v1/workspace/settings"};
  }
  // GetWorkspaceSetting returns the setting by name.
  rpc GetWorkspaceSetting(GetWorkspaceSettingRequest) returns (WorkspaceSetting) {
    option (google.api.http) = {get: "/api/v1/workspace/{name=settings/*}"};
    option (google.api.method_signature) = "name";
  }
  // SetWorkspaceSetting updates the setting.
  rpc SetWorkspaceSetting(SetWorkspaceSettingRequest) returns (WorkspaceSetting) {
    option (google.api.http) = {
      patch: "/api/v1/workspace/{setting.name=settings/*}",
      body: "setting"
    };
    option (google.api.method_signature) = "setting";
  }
}

message WorkspaceSetting {
  // name is the name of the setting.
  // Format: settings/{setting}
  string name = 1;
  oneof value {
    WorkspaceGeneralSetting general_setting = 2;
    WorkspaceStorageSetting storage_setting = 3;
    WorkspaceMemoRelatedSetting memo_related_setting = 4;
  }
}

message WorkspaceGeneralSetting {
  // instance_url is the instance URL.
  string instance_url = 1;
  // disallow_signup is the flag to disallow signup.
  bool disallow_signup = 2;
  // disallow_password_login is the flag to disallow password login.
  bool disallow_password_login = 3;
  // additional_script is the additional script.
  string additional_script = 4;
  // additional_style is the additional style.
  string additional_style = 5;
  // custom_profile is the custom profile.
  WorkspaceCustomProfile custom_profile = 6;
}

message WorkspaceCustomProfile {
  string title = 1;
  string description = 2;
  string logo_url = 3;
  string locale = 4;
  string appearance = 5;
}

message WorkspaceStorageSetting {
  enum StorageType {
    STORAGE_TYPE_UNSPECIFIED = 0;
    // STORAGE_TYPE_DATABASE is the database storage type.
    STORAGE_TYPE_DATABASE = 1;
    // STORAGE_TYPE_LOCAL is the local storage type.
    STORAGE_TYPE_LOCAL = 2;
    // STORAGE_TYPE_S3 is the S3 storage type.
    STORAGE_TYPE_S3 = 3;
  }
  // storage_type is the storage type.
  StorageType storage_type = 1;
  // The template of file path.
  // e.g. assets/{timestamp}_{filename}
  string filepath_template = 2;
  // The max upload size in megabytes.
  int64 upload_size_limit_mb = 3;
  // Reference: https://developers.cloudflare.com/r2/examples/aws/aws-sdk-go/
  message S3Config {
    string access_key_id = 1;
    string access_key_secret = 2;
    string endpoint = 3;
    string region = 4;
    string bucket = 5;
  }
  // The S3 config.
  S3Config s3_config = 4;
}

message WorkspaceMemoRelatedSetting {
  // disallow_public_share disallows set memo as public visible.
  bool disallow_public_visible = 1;
  // display_with_update_time orders and displays memo with update time.
  bool display_with_update_time = 2;
  // content_length_limit is the limit of content length.
  int64 content_length_limit = 3;
}

message ListWorkspaceSettingsRequest {}

message ListWorkspaceSettingsResponse {
  repeated WorkspaceSetting settings = 1;
}

message GetWorkspaceSettingRequest {
  // The resource name of the workspace setting.
  // Format: settings/{setting}
  string name = 1 [(google.api.field_behavior) = REQUIRED];
}

message SetWorkspaceSettingRequest {
  // setting is the setting to update.
  WorkspaceSetting setting = 1;
}
