/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements. See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership. The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License. You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied. See the License for the
 * specific language governing permissions and limitations
 * under the License.
 *
 */

syntax = "proto3";

option java_multiple_files = true;
package org.apache.custos.core.tenant.management.api;

import "TenantProfile.proto";


message CreateTenantResponse {
    string client_id = 1;
    string client_secret = 2;
    bool is_activated = 3;
    double client_id_issued_at = 4;
    double client_secret_expires_at = 5;
    string registration_client_uri = 6;
    string token_endpoint_auth_method = 17;
    string msg = 7;
}

message GetTenantResponse {
    string client_id = 1;
    string client_name = 2;
    string requester_email = 3;
    string admin_first_name = 4;
    string admin_last_name = 5;
    string admin_email = 6;
    repeated string contacts = 7;
    repeated string redirect_uris = 8;
    repeated string grant_types = 9;
    double client_id_issued_at = 10;
    string client_uri = 11;
    string scope = 12;
    string domain = 13;
    string comment = 14;
    string logo_uri = 15;
    string application_type = 16;
    string jwks_uri = 17;
    string example_extension_parameter = 18;
    string tos_uri = 19;
    string policy_uri = 20;
    map<string, string> jwks = 21;
    string software_id = 22;
    string software_version = 23;
    string admin_username = 24;
}


message GetTenantRequest {
    string client_id = 1;
    int64 tenant_id = 2;
    org.apache.custos.core.tenant.profile.api.Tenant tenant = 4;
    Credentials credentials = 5;
}


message Credentials {
    string iam_client_id = 1;
    string iam_client_secret = 2;
    string ci_logon_client_id = 3;
    string ci_logon_client_secret = 4;
    string custos_client_id = 5;
    string custos_client_secret = 6;
    double custos_client_id_issued_at = 7;
    double custos_client_secret_expired_at = 8;
}

message UpdateTenantRequest {
    string client_id = 1;
    int64 tenant_id = 2;
    Credentials credentials = 3;
    org.apache.custos.core.tenant.profile.api.Tenant body = 4;
}


message DeleteTenantRequest {
    string client_id = 1;
    int64 tenant_id = 2;
    Credentials credentials = 3;
    org.apache.custos.core.tenant.profile.api.Tenant body = 4;
}

message GetCredentialsRequest {
    int64 tenant_id = 1;
}

message GetCredentialsResponse {
    string iam_client_id = 1;
    string iam_client_secret = 2;
    string ci_logon_client_id = 3;
    string ci_logon_client_secret = 4;
}

message TenantValidationRequest {
    string client_id = 1;
    string client_sec = 2;
}
