syntax = "proto3";
option go_package = "github.com/argoproj/argo-cd/v2/reposerver/apiclient";

package repository;

import "gogoproto/gogo.proto";
import "google/api/annotations.proto";
import "k8s.io/api/core/v1/generated.proto";
import "github.com/argoproj/argo-cd/v2/pkg/apis/application/v1alpha1/generated.proto";

// ManifestRequest is a query for manifest generation.
message ManifestRequest {
    github.com.argoproj.argo_cd.v2.pkg.apis.application.v1alpha1.Repository repo = 1;
    // revision, potentially un-resolved
    string revision = 2;
    bool noCache = 3;
    string appLabelKey = 4;
    // Name of the application for which the request is triggered
    string appName = 5;
    string namespace = 8;
    github.com.argoproj.argo_cd.v2.pkg.apis.application.v1alpha1.ApplicationSource applicationSource = 10;
    repeated github.com.argoproj.argo_cd.v2.pkg.apis.application.v1alpha1.Repository repos = 11;
    repeated github.com.argoproj.argo_cd.v2.pkg.apis.application.v1alpha1.ConfigManagementPlugin plugins = 12;
    github.com.argoproj.argo_cd.v2.pkg.apis.application.v1alpha1.KustomizeOptions kustomizeOptions = 13;
    string kubeVersion = 14;
    repeated string apiVersions = 15;
    // Request to verify the signature when generating the manifests (only for Git repositories)
    bool verifySignature = 16;
    repeated github.com.argoproj.argo_cd.v2.pkg.apis.application.v1alpha1.RepoCreds helmRepoCreds = 17;
    bool noRevisionCache = 18;
}

// TestRepositoryRequest is a query to test repository is valid or not and has valid access.
message TestRepositoryRequest {
    github.com.argoproj.argo_cd.v2.pkg.apis.application.v1alpha1.Repository repo = 1;
}

// TestRepositoryRequest is a query to test repository is valid or not and has valid access.
message TestRepositoryResponse {
    // Request to verify the signature when generating the manifests (only for Git repositories)
    bool verifiedRepository = 1;
}

message ManifestResponse {
    repeated string manifests = 1;
    string namespace = 2;
    string server = 3;
    // resolved revision
    string revision = 4;
    string sourceType = 6;
    // Raw response of git verify-commit operation (always the empty string for Helm)
    string verifyResult = 7;
}

message ListRefsRequest {
  github.com.argoproj.argo_cd.v2.pkg.apis.application.v1alpha1.Repository repo = 1;
}

// A subset of the repository's named refs
message Refs {
  repeated string branches = 1;
  repeated string tags = 2;
}

// ListAppsRequest requests a repository directory structure
message ListAppsRequest {
    github.com.argoproj.argo_cd.v2.pkg.apis.application.v1alpha1.Repository repo = 1;
    string revision = 2;
}

// AppList returns the contents of the repo of a ListApps request
message AppList {
    map<string, string> apps = 1;
}

// RepoServerAppDetailsQuery contains query information for app details request
message RepoServerAppDetailsQuery {
    github.com.argoproj.argo_cd.v2.pkg.apis.application.v1alpha1.Repository repo = 1;
    github.com.argoproj.argo_cd.v2.pkg.apis.application.v1alpha1.ApplicationSource source = 2;
    repeated github.com.argoproj.argo_cd.v2.pkg.apis.application.v1alpha1.Repository repos = 3;
    github.com.argoproj.argo_cd.v2.pkg.apis.application.v1alpha1.KustomizeOptions kustomizeOptions = 4;
    string appName = 5;
    bool noCache = 6;
    bool noRevisionCache = 7;
}

// RepoAppDetailsResponse application details
message RepoAppDetailsResponse {
	string type = 1;
	KsonnetAppSpec ksonnet = 2;
	HelmAppSpec helm = 3;
	KustomizeAppSpec kustomize = 4;
	DirectoryAppSpec directory = 5;
}

message RepoServerRevisionMetadataRequest {
    // the repo
    github.com.argoproj.argo_cd.v2.pkg.apis.application.v1alpha1.Repository repo = 1;
    // the revision within the repo
    string revision = 2;
    // whether to check signature on revision
    bool checkSignature = 3;
}

// KsonnetAppSpec contains Ksonnet app response
// This roughly reflects: ksonnet/ksonnet/metadata/app/schema.go
message KsonnetAppSpec {
	string name = 1;
	map<string, KsonnetEnvironment> environments = 3;
	repeated github.com.argoproj.argo_cd.v2.pkg.apis.application.v1alpha1.KsonnetParameter parameters = 4;
}

// HelmAppSpec contains helm app name  in source repo
message HelmAppSpec {
	string name = 1;
	repeated string valueFiles = 3;
	// the output of `helm inspect values`
	repeated github.com.argoproj.argo_cd.v2.pkg.apis.application.v1alpha1.HelmParameter parameters = 4;
	// the contents of values.yaml
	string values = 5;
    // helm file parameters
    repeated github.com.argoproj.argo_cd.v2.pkg.apis.application.v1alpha1.HelmFileParameter fileParameters = 6;
}

// KustomizeAppSpec contains kustomize images
message KustomizeAppSpec {
	// images is a list of available images.
	repeated string images = 3;
}

message KsonnetEnvironment {
    // Name is the user defined name of an environment
    string name = 1;
    // KubernetesVersion is the kubernetes version the targeted cluster is running on.
    string k8sVersion = 2;
    // Destination stores the cluster address that this environment points to.
    KsonnetEnvironmentDestination destination = 4;
}

message KsonnetEnvironmentDestination {
    // Server is the Kubernetes server that the cluster is running on.
    string server = 1;
    // Namespace is the namespace of the Kubernetes server that targets should be deployed to
    string namespace = 2;
}

// DirectoryAppSpec contains directory
message DirectoryAppSpec {
}


message HelmChartsRequest {
    github.com.argoproj.argo_cd.v2.pkg.apis.application.v1alpha1.Repository repo = 1;
}

message HelmChart {
    string name = 1;
    repeated string versions = 2;
}

message HelmChartsResponse {
    repeated HelmChart items = 1;
}

// ManifestService
service RepoServerService {

    // GenerateManifest generates manifest for application in specified repo name and revision
    rpc GenerateManifest(ManifestRequest) returns (ManifestResponse) {
    }

    // Returns a bool val if the repository is valid and has proper access
    rpc TestRepository(TestRepositoryRequest) returns (TestRepositoryResponse) {
    }
    
    // Returns a list of refs (e.g. branches and tags) in the repo
    rpc ListRefs(ListRefsRequest) returns (Refs) {
    }

    // ListApps returns a list of apps in the repo
    rpc ListApps(ListAppsRequest) returns (AppList) {
    }

    // Generate manifest for application in specified repo name and revision
    rpc GetAppDetails(RepoServerAppDetailsQuery) returns (RepoAppDetailsResponse) {
    }

    // Get the meta-data (author, date, tags, message) for a specific revision of the repo
    rpc GetRevisionMetadata(RepoServerRevisionMetadataRequest) returns (github.com.argoproj.argo_cd.v2.pkg.apis.application.v1alpha1.RevisionMetadata) {
    }

    // GetHelmCharts returns list of helm charts in the specified repository
    rpc GetHelmCharts(HelmChartsRequest) returns (HelmChartsResponse) {
    }
}
