// Copyright (c) 2021 Gitpod GmbH. All rights reserved.
// Licensed under the GNU Affero General Public License (AGPL).
// See License-AGPL.txt in the project root for license information.

syntax = "proto3";

package supervisor;

import "google/api/annotations.proto";

option go_package = "github.com/gitpod-io/gitpod/supervisor/api";

// Notification serivce allows external processes to notify the user and ask for decisions.
service NotificationService {

    // Prompts the user and asks for a decision. Typically called by some external process.
    // If the list of actions is empty this service returns immediately,
    // otherwise it blocks until the user has made their choice.
    rpc Notify(NotifyRequest) returns (NotifyResponse) {
        option (google.api.http) = {
            post: "/v1/notification/notify"
        };
    }

    // Subscribe to notifications. Typically called by the IDE.
    rpc Subscribe(SubscribeRequest) returns (stream SubscribeResponse) {
        option (google.api.http) = {
            get: "/v1/notification/subscribe"
        };
    }

    // Report a user's choice as a response to a notification. Typically called by the IDE.
    rpc Respond(RespondRequest) returns (RespondResponse) {
        option (google.api.http) = {
            post: "/v1/notification/respond"
        };
    }
}

message NotifyRequest {
    enum Level {
        ERROR = 0;
        WARNING = 1;
        INFO = 2;
    }
    Level level = 1;
    string message = 2;
    // if actions are empty, Notify will return immediately
    repeated string actions = 3;
}

message NotifyResponse {
    // action chosen by the user or empty string if cancelled
    string action = 1;
}

message SubscribeRequest {}

message SubscribeResponse {
    uint64 requestId = 1;
    NotifyRequest request = 2;
}

message RespondRequest {
    uint64 requestId = 1;
    NotifyResponse response = 2;
}

message RespondResponse {}