aboutsummaryrefslogtreecommitdiff
path: root/crates/secd/proto/authzed/api/v1alpha1/watchresources_service.proto
blob: 27c028ad118281256c4b3e7b6acccf980e22b3c8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
syntax = "proto3";
package authzed.api.v1alpha1;

option go_package = "github.com/authzed/authzed-go/proto/authzed/api/v1alpha1";
option java_package = "com.authzed.api.v1alpha1";

import "google/api/annotations.proto";
import "validate/validate.proto";

import "authzed/api/v1/core.proto";

// WatchResourcesService is used to receive a stream of updates for resources of a
// specific (resource type, permission, subject) combination.
service WatchResourcesService {

  // WatchResources initiates a watch for permission changes for the provided
  // (resource type, permission, subject) pair.
  rpc WatchResources(WatchResourcesRequest)
    returns (stream WatchResourcesResponse) {
      option (google.api.http) = {
        post: "/v1alpha1/lookupwatch"
        body: "*"
      }; 
    }
}

// WatchResourcesRequest starts a watch for specific permission updates
// for the given resource and subject types.
message WatchResourcesRequest {

  // resource_object_type is the type of resource object for which we will
  // watch for changes.
  string resource_object_type = 1 [ (validate.rules).string = {
    pattern : "^([a-z][a-z0-9_]{1,61}[a-z0-9]/)?[a-z][a-z0-9_]{1,62}[a-z0-9]$",
    max_bytes : 128,
  } ];

  // permission is the name of the permission or relation for which we will
  // watch for changes.
  string permission = 2 [ (validate.rules).string = {
    pattern : "^[a-z][a-z0-9_]{1,62}[a-z0-9]$",
    max_bytes : 64,
  } ];

  // subject_object_type is the type of the subject resource for which we will
  // watch for changes.
  string subject_object_type = 3;

  // optional_subject_relation allows you to specify a group of subjects to watch
  // for a given subject type.
  string optional_subject_relation = 4;

  authzed.api.v1.ZedToken optional_start_cursor = 5;
}

// PermissionUpdate represents a single permission update for a specific
// subject's permissions.
message PermissionUpdate {
  
  // todo: work this into the v1 core API at some point since it's used
  // across services.
  enum Permissionship {
    PERMISSIONSHIP_UNSPECIFIED = 0;
    PERMISSIONSHIP_NO_PERMISSION = 1;
    PERMISSIONSHIP_HAS_PERMISSION = 2;
  }

  // subject defines the subject resource whose permissions have changed.
  authzed.api.v1.SubjectReference subject = 1;

  // resource defines the specific object in the system.
  authzed.api.v1.ObjectReference resource = 2;

  string relation = 3;
  Permissionship updated_permission = 4;
}

// WatchResourcesResponse enumerates the list of permission updates that have
// occurred as a result of one or more relationship updates.
message WatchResourcesResponse {
  repeated PermissionUpdate updates = 1;
  authzed.api.v1.ZedToken changes_through = 2;
}