diff --git a/package.json b/package.json index 2cf01d5..e08efb8 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@permify/permify-node", - "version": "0.3.4", + "version": "0.3.5", "description": "permify nodejs client", "main": "dist/src/index.js", "types": "dist/src/index.d.ts", diff --git a/proto/base/v1/base.proto b/proto/base/v1/base.proto index af41d98..9dbe948 100644 --- a/proto/base/v1/base.proto +++ b/proto/base/v1/base.proto @@ -138,7 +138,7 @@ message Tuple { // Tuples message Tuples { - repeated Tuple tuples = 1; + repeated Tuple tuples = 1 [json_name = "tuples"]; } // Entity @@ -155,9 +155,9 @@ message Entity { } message EntityAndRelation { - Entity entity = 1 [(validate.rules).message.required = true]; + Entity entity = 1 [json_name = "entity", (validate.rules).message.required = true]; - string relation = 2 [(validate.rules).string = { + string relation = 2 [json_name = "relation", (validate.rules).string = { pattern : "^([a-z][a-z0-9_]{1,64}[a-z0-9])$", max_bytes : 64, }]; @@ -186,9 +186,9 @@ message Subject { // TupleFilter is used to filter tuples message TupleFilter { - EntityFilter entity = 1 [(validate.rules).message.required = true]; + EntityFilter entity = 1 [json_name = "entity", (validate.rules).message.required = true]; - string relation = 2 [(validate.rules).string = { + string relation = 2 [json_name = "relation", (validate.rules).string = { pattern : "^([a-z][a-z0-9_]{1,62}[a-z0-9])$", max_bytes : 64, ignore_empty: true, @@ -197,17 +197,6 @@ message TupleFilter { SubjectFilter subject = 3 [json_name = "subject"]; } -// EntityAndRelationFilter is used to filter entities and relations -message EntityAndRelationFilter { - EntityFilter entity = 1 [(validate.rules).message.required = true]; - - string relation = 2 [(validate.rules).string = { - pattern : "^([a-z][a-z0-9_]{1,64}[a-z0-9])$", - max_bytes : 64, - ignore_empty: true, - }]; -} - // EntityFilter is used to filter entities message EntityFilter { string type = 1 [json_name = "type"]; @@ -221,7 +210,7 @@ message SubjectFilter { repeated string ids = 2 [json_name = "ids"]; - string relation = 3 [(validate.rules).string = { + string relation = 3 [json_name = "relation", (validate.rules).string = { pattern : "^([.&a-z][.&a-z0-9_]{1,62}[.&a-z0-9])$", max_bytes : 64, ignore_empty: true, @@ -254,7 +243,7 @@ message Expand { // Result message Subjects { - repeated Subject subjects = 1; + repeated Subject subjects = 1 [json_name = "subjects"]; } // Tenant diff --git a/proto/base/v1/errors.proto b/proto/base/v1/errors.proto index 9d9918f..9f94a1b 100644 --- a/proto/base/v1/errors.proto +++ b/proto/base/v1/errors.proto @@ -31,6 +31,9 @@ enum ErrorCode { ERROR_CODE_SUBJECT_RELATION_CANNOT_BE_EMPTY = 2018; ERROR_CODE_SCHEMA_MUST_HAVE_USER_ENTITY_DEFINITION = 2019; ERROR_CODE_UNIQUE_CONSTRAINT = 2020; + ERROR_CODE_INVALID_CONTINUOUS_TOKEN = 2021; + ERROR_CODE_INVALID_KEY = 2022; + ERROR_CODE_ENTITY_TYPE_REQUIRED = 2023; // not found ERROR_CODE_NOT_FOUND = 4000; @@ -43,7 +46,6 @@ enum ErrorCode { ERROR_CODE_RELATION_DEFINITION_NOT_FOUND = 4007; ERROR_CODE_RECORD_NOT_FOUND = 4008; ERROR_CODE_TENANT_NOT_FOUND = 4009; - ERROR_CODE_INVALID_CONTINUOUS_TOKEN = 4010; // internal ERROR_CODE_INTERNAL = 5000; diff --git a/proto/base/v1/openapi.proto b/proto/base/v1/openapi.proto index bf491e5..76c0364 100644 --- a/proto/base/v1/openapi.proto +++ b/proto/base/v1/openapi.proto @@ -9,7 +9,7 @@ option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_swagger) = { info: { title: "Permify API"; description: "Permify is an open-source authorization service for creating and maintaining fine-grained authorizations across your individual applications and services. Permify converts authorization data as relational tuples into a database you point at. We called that database a Write Database (WriteDB) and it behaves as a centralized data source for your authorization system. You can model of your authorization with Permify's DSL - Permify Schema - and perform access checks with a single API call anywhere on your stack. Access decisions made according to stored relational tuples."; - version: "v0.4.4"; + version: "v0.4.5"; contact: { name: "API Support"; url: "https://github.com/Permify/permify/issues"; diff --git a/proto/base/v1/service.proto b/proto/base/v1/service.proto index c319ba2..1ea5de8 100644 --- a/proto/base/v1/service.proto +++ b/proto/base/v1/service.proto @@ -112,6 +112,8 @@ message PermissionCheckRequest { }]; Subject subject = 5 [json_name = "subject", (validate.rules).message.required = true]; + + repeated Tuple contextual_tuples = 6 [json_name = "contextual_tuples"]; } // PermissionCheckRequestMetadata @@ -158,6 +160,8 @@ message PermissionExpandRequest { max_bytes : 64, ignore_empty: true, }]; + + repeated Tuple contextual_tuples = 5 [json_name = "contextual_tuples"]; } // PermissionExpandRequestMetadata @@ -196,6 +200,8 @@ message PermissionLookupEntityRequest { }]; Subject subject = 5 [json_name = "subject", (validate.rules).message.required = true]; + + repeated Tuple contextual_tuples = 6 [json_name = "contextual_tuples"]; } // PermissionLookupEntityRequestMetadata @@ -228,9 +234,11 @@ message PermissionEntityFilterRequest { RelationReference entity_reference = 3 [json_name = "entity_reference"]; Subject subject = 4 [json_name = "subject"]; + + repeated Tuple contextual_tuples = 5 [json_name = "contextual_tuples"]; } -// PermissionLookupEntityRequestMetadata +// PermissionEntityFilterRequestMetadata message PermissionEntityFilterRequestMetadata { string schema_version = 1 [json_name = "schema_version"]; string snap_token = 2 [json_name = "snap_token"]; @@ -257,6 +265,8 @@ message PermissionLookupSubjectRequest { }]; RelationReference subject_reference = 5 [json_name = "subject_reference"]; + + repeated Tuple contextual_tuples = 6 [json_name = "contextual_tuples"]; } // PermissionLookupSubjectRequestMetadata @@ -473,7 +483,7 @@ message RelationshipReadRequest { RelationshipReadRequestMetadata metadata = 2 [json_name = "metadata", (validate.rules).message.required = true]; - TupleFilter filter = 3 [json_name = "filter"]; + TupleFilter filter = 3 [json_name = "filter", (validate.rules).message.required = true]; uint32 page_size = 4 [ json_name = "page_size", @@ -502,7 +512,7 @@ message RelationshipDeleteRequest { ignore_empty: false, }]; - TupleFilter filter = 2 [json_name = "filter"]; + TupleFilter filter = 2 [json_name = "filter", (validate.rules).message.required = true]; } // RelationshipDeleteResponse diff --git a/src/grpc/generated/base/v1/base.ts b/src/grpc/generated/base/v1/base.ts index a468f0f..0a05f21 100644 --- a/src/grpc/generated/base/v1/base.ts +++ b/src/grpc/generated/base/v1/base.ts @@ -217,12 +217,6 @@ export interface TupleFilter { subject: SubjectFilter | undefined; } -/** EntityAndRelationFilter is used to filter entities and relations */ -export interface EntityAndRelationFilter { - entity: EntityFilter | undefined; - relation: string; -} - /** EntityFilter is used to filter entities */ export interface EntityFilter { type: string; @@ -1730,66 +1724,6 @@ export const TupleFilter = { }, }; -function createBaseEntityAndRelationFilter(): EntityAndRelationFilter { - return { entity: undefined, relation: "" }; -} - -export const EntityAndRelationFilter = { - encode(message: EntityAndRelationFilter, writer: _m0.Writer = _m0.Writer.create()): _m0.Writer { - if (message.entity !== undefined) { - EntityFilter.encode(message.entity, writer.uint32(10).fork()).ldelim(); - } - if (message.relation !== "") { - writer.uint32(18).string(message.relation); - } - return writer; - }, - - decode(input: _m0.Reader | Uint8Array, length?: number): EntityAndRelationFilter { - const reader = input instanceof _m0.Reader ? input : new _m0.Reader(input); - let end = length === undefined ? reader.len : reader.pos + length; - const message = createBaseEntityAndRelationFilter(); - while (reader.pos < end) { - const tag = reader.uint32(); - switch (tag >>> 3) { - case 1: - message.entity = EntityFilter.decode(reader, reader.uint32()); - break; - case 2: - message.relation = reader.string(); - break; - default: - reader.skipType(tag & 7); - break; - } - } - return message; - }, - - fromJSON(object: any): EntityAndRelationFilter { - return { - entity: isSet(object.entity) ? EntityFilter.fromJSON(object.entity) : undefined, - relation: isSet(object.relation) ? String(object.relation) : "", - }; - }, - - toJSON(message: EntityAndRelationFilter): unknown { - const obj: any = {}; - message.entity !== undefined && (obj.entity = message.entity ? EntityFilter.toJSON(message.entity) : undefined); - message.relation !== undefined && (obj.relation = message.relation); - return obj; - }, - - fromPartial(object: DeepPartial): EntityAndRelationFilter { - const message = createBaseEntityAndRelationFilter(); - message.entity = (object.entity !== undefined && object.entity !== null) - ? EntityFilter.fromPartial(object.entity) - : undefined; - message.relation = object.relation ?? ""; - return message; - }, -}; - function createBaseEntityFilter(): EntityFilter { return { type: "", ids: [] }; } diff --git a/src/grpc/generated/base/v1/errors.ts b/src/grpc/generated/base/v1/errors.ts index 9042205..4f76c91 100644 --- a/src/grpc/generated/base/v1/errors.ts +++ b/src/grpc/generated/base/v1/errors.ts @@ -29,6 +29,9 @@ export enum ErrorCode { ERROR_CODE_SUBJECT_RELATION_CANNOT_BE_EMPTY = 2018, ERROR_CODE_SCHEMA_MUST_HAVE_USER_ENTITY_DEFINITION = 2019, ERROR_CODE_UNIQUE_CONSTRAINT = 2020, + ERROR_CODE_INVALID_CONTINUOUS_TOKEN = 2021, + ERROR_CODE_INVALID_KEY = 2022, + ERROR_CODE_ENTITY_TYPE_REQUIRED = 2023, /** ERROR_CODE_NOT_FOUND - not found */ ERROR_CODE_NOT_FOUND = 4000, ERROR_CODE_ENTITY_TYPE_NOT_FOUND = 4001, @@ -40,7 +43,6 @@ export enum ErrorCode { ERROR_CODE_RELATION_DEFINITION_NOT_FOUND = 4007, ERROR_CODE_RECORD_NOT_FOUND = 4008, ERROR_CODE_TENANT_NOT_FOUND = 4009, - ERROR_CODE_INVALID_CONTINUOUS_TOKEN = 4010, /** ERROR_CODE_INTERNAL - internal */ ERROR_CODE_INTERNAL = 5000, ERROR_CODE_CANCELLED = 5001, @@ -125,6 +127,15 @@ export function errorCodeFromJSON(object: any): ErrorCode { case 2020: case "ERROR_CODE_UNIQUE_CONSTRAINT": return ErrorCode.ERROR_CODE_UNIQUE_CONSTRAINT; + case 2021: + case "ERROR_CODE_INVALID_CONTINUOUS_TOKEN": + return ErrorCode.ERROR_CODE_INVALID_CONTINUOUS_TOKEN; + case 2022: + case "ERROR_CODE_INVALID_KEY": + return ErrorCode.ERROR_CODE_INVALID_KEY; + case 2023: + case "ERROR_CODE_ENTITY_TYPE_REQUIRED": + return ErrorCode.ERROR_CODE_ENTITY_TYPE_REQUIRED; case 4000: case "ERROR_CODE_NOT_FOUND": return ErrorCode.ERROR_CODE_NOT_FOUND; @@ -155,9 +166,6 @@ export function errorCodeFromJSON(object: any): ErrorCode { case 4009: case "ERROR_CODE_TENANT_NOT_FOUND": return ErrorCode.ERROR_CODE_TENANT_NOT_FOUND; - case 4010: - case "ERROR_CODE_INVALID_CONTINUOUS_TOKEN": - return ErrorCode.ERROR_CODE_INVALID_CONTINUOUS_TOKEN; case 5000: case "ERROR_CODE_INTERNAL": return ErrorCode.ERROR_CODE_INTERNAL; @@ -247,6 +255,12 @@ export function errorCodeToJSON(object: ErrorCode): string { return "ERROR_CODE_SCHEMA_MUST_HAVE_USER_ENTITY_DEFINITION"; case ErrorCode.ERROR_CODE_UNIQUE_CONSTRAINT: return "ERROR_CODE_UNIQUE_CONSTRAINT"; + case ErrorCode.ERROR_CODE_INVALID_CONTINUOUS_TOKEN: + return "ERROR_CODE_INVALID_CONTINUOUS_TOKEN"; + case ErrorCode.ERROR_CODE_INVALID_KEY: + return "ERROR_CODE_INVALID_KEY"; + case ErrorCode.ERROR_CODE_ENTITY_TYPE_REQUIRED: + return "ERROR_CODE_ENTITY_TYPE_REQUIRED"; case ErrorCode.ERROR_CODE_NOT_FOUND: return "ERROR_CODE_NOT_FOUND"; case ErrorCode.ERROR_CODE_ENTITY_TYPE_NOT_FOUND: @@ -267,8 +281,6 @@ export function errorCodeToJSON(object: ErrorCode): string { return "ERROR_CODE_RECORD_NOT_FOUND"; case ErrorCode.ERROR_CODE_TENANT_NOT_FOUND: return "ERROR_CODE_TENANT_NOT_FOUND"; - case ErrorCode.ERROR_CODE_INVALID_CONTINUOUS_TOKEN: - return "ERROR_CODE_INVALID_CONTINUOUS_TOKEN"; case ErrorCode.ERROR_CODE_INTERNAL: return "ERROR_CODE_INTERNAL"; case ErrorCode.ERROR_CODE_CANCELLED: diff --git a/src/grpc/generated/base/v1/service.ts b/src/grpc/generated/base/v1/service.ts index 5e158e5..e657b55 100644 --- a/src/grpc/generated/base/v1/service.ts +++ b/src/grpc/generated/base/v1/service.ts @@ -26,6 +26,7 @@ export interface PermissionCheckRequest { /** its can be permission or relation */ permission: string; subject: Subject | undefined; + contextualTuples: Tuple[]; } /** PermissionCheckRequestMetadata */ @@ -92,6 +93,7 @@ export interface PermissionExpandRequest { metadata: PermissionExpandRequestMetadata | undefined; entity: Entity | undefined; permission: string; + contextualTuples: Tuple[]; } /** PermissionExpandRequestMetadata */ @@ -112,6 +114,7 @@ export interface PermissionLookupEntityRequest { entityType: string; permission: string; subject: Subject | undefined; + contextualTuples: Tuple[]; } /** PermissionLookupEntityRequestMetadata */ @@ -137,9 +140,10 @@ export interface PermissionEntityFilterRequest { metadata: PermissionEntityFilterRequestMetadata | undefined; entityReference: RelationReference | undefined; subject: Subject | undefined; + contextualTuples: Tuple[]; } -/** PermissionLookupEntityRequestMetadata */ +/** PermissionEntityFilterRequestMetadata */ export interface PermissionEntityFilterRequestMetadata { schemaVersion: string; snapToken: string; @@ -156,6 +160,7 @@ export interface PermissionLookupSubjectRequest { /** its can be permission or relation */ permission: string; subjectReference: RelationReference | undefined; + contextualTuples: Tuple[]; } /** PermissionLookupSubjectRequestMetadata */ @@ -289,7 +294,14 @@ export interface TenantListResponse { } function createBasePermissionCheckRequest(): PermissionCheckRequest { - return { tenantId: "", metadata: undefined, entity: undefined, permission: "", subject: undefined }; + return { + tenantId: "", + metadata: undefined, + entity: undefined, + permission: "", + subject: undefined, + contextualTuples: [], + }; } export const PermissionCheckRequest = { @@ -309,6 +321,9 @@ export const PermissionCheckRequest = { if (message.subject !== undefined) { Subject.encode(message.subject, writer.uint32(42).fork()).ldelim(); } + for (const v of message.contextualTuples) { + Tuple.encode(v!, writer.uint32(50).fork()).ldelim(); + } return writer; }, @@ -334,6 +349,9 @@ export const PermissionCheckRequest = { case 5: message.subject = Subject.decode(reader, reader.uint32()); break; + case 6: + message.contextualTuples.push(Tuple.decode(reader, reader.uint32())); + break; default: reader.skipType(tag & 7); break; @@ -349,6 +367,9 @@ export const PermissionCheckRequest = { entity: isSet(object.entity) ? Entity.fromJSON(object.entity) : undefined, permission: isSet(object.permission) ? String(object.permission) : "", subject: isSet(object.subject) ? Subject.fromJSON(object.subject) : undefined, + contextualTuples: Array.isArray(object?.contextual_tuples) + ? object.contextual_tuples.map((e: any) => Tuple.fromJSON(e)) + : [], }; }, @@ -360,6 +381,11 @@ export const PermissionCheckRequest = { message.entity !== undefined && (obj.entity = message.entity ? Entity.toJSON(message.entity) : undefined); message.permission !== undefined && (obj.permission = message.permission); message.subject !== undefined && (obj.subject = message.subject ? Subject.toJSON(message.subject) : undefined); + if (message.contextualTuples) { + obj.contextual_tuples = message.contextualTuples.map((e) => e ? Tuple.toJSON(e) : undefined); + } else { + obj.contextual_tuples = []; + } return obj; }, @@ -376,6 +402,7 @@ export const PermissionCheckRequest = { message.subject = (object.subject !== undefined && object.subject !== null) ? Subject.fromPartial(object.subject) : undefined; + message.contextualTuples = object.contextualTuples?.map((e) => Tuple.fromPartial(e)) || []; return message; }, }; @@ -556,7 +583,7 @@ export const PermissionCheckResponseMetadata = { }; function createBasePermissionExpandRequest(): PermissionExpandRequest { - return { tenantId: "", metadata: undefined, entity: undefined, permission: "" }; + return { tenantId: "", metadata: undefined, entity: undefined, permission: "", contextualTuples: [] }; } export const PermissionExpandRequest = { @@ -573,6 +600,9 @@ export const PermissionExpandRequest = { if (message.permission !== "") { writer.uint32(34).string(message.permission); } + for (const v of message.contextualTuples) { + Tuple.encode(v!, writer.uint32(42).fork()).ldelim(); + } return writer; }, @@ -595,6 +625,9 @@ export const PermissionExpandRequest = { case 4: message.permission = reader.string(); break; + case 5: + message.contextualTuples.push(Tuple.decode(reader, reader.uint32())); + break; default: reader.skipType(tag & 7); break; @@ -609,6 +642,9 @@ export const PermissionExpandRequest = { metadata: isSet(object.metadata) ? PermissionExpandRequestMetadata.fromJSON(object.metadata) : undefined, entity: isSet(object.entity) ? Entity.fromJSON(object.entity) : undefined, permission: isSet(object.permission) ? String(object.permission) : "", + contextualTuples: Array.isArray(object?.contextual_tuples) + ? object.contextual_tuples.map((e: any) => Tuple.fromJSON(e)) + : [], }; }, @@ -619,6 +655,11 @@ export const PermissionExpandRequest = { (obj.metadata = message.metadata ? PermissionExpandRequestMetadata.toJSON(message.metadata) : undefined); message.entity !== undefined && (obj.entity = message.entity ? Entity.toJSON(message.entity) : undefined); message.permission !== undefined && (obj.permission = message.permission); + if (message.contextualTuples) { + obj.contextual_tuples = message.contextualTuples.map((e) => e ? Tuple.toJSON(e) : undefined); + } else { + obj.contextual_tuples = []; + } return obj; }, @@ -632,6 +673,7 @@ export const PermissionExpandRequest = { ? Entity.fromPartial(object.entity) : undefined; message.permission = object.permission ?? ""; + message.contextualTuples = object.contextualTuples?.map((e) => Tuple.fromPartial(e)) || []; return message; }, }; @@ -742,7 +784,14 @@ export const PermissionExpandResponse = { }; function createBasePermissionLookupEntityRequest(): PermissionLookupEntityRequest { - return { tenantId: "", metadata: undefined, entityType: "", permission: "", subject: undefined }; + return { + tenantId: "", + metadata: undefined, + entityType: "", + permission: "", + subject: undefined, + contextualTuples: [], + }; } export const PermissionLookupEntityRequest = { @@ -762,6 +811,9 @@ export const PermissionLookupEntityRequest = { if (message.subject !== undefined) { Subject.encode(message.subject, writer.uint32(42).fork()).ldelim(); } + for (const v of message.contextualTuples) { + Tuple.encode(v!, writer.uint32(50).fork()).ldelim(); + } return writer; }, @@ -787,6 +839,9 @@ export const PermissionLookupEntityRequest = { case 5: message.subject = Subject.decode(reader, reader.uint32()); break; + case 6: + message.contextualTuples.push(Tuple.decode(reader, reader.uint32())); + break; default: reader.skipType(tag & 7); break; @@ -802,6 +857,9 @@ export const PermissionLookupEntityRequest = { entityType: isSet(object.entity_type) ? String(object.entity_type) : "", permission: isSet(object.permission) ? String(object.permission) : "", subject: isSet(object.subject) ? Subject.fromJSON(object.subject) : undefined, + contextualTuples: Array.isArray(object?.contextual_tuples) + ? object.contextual_tuples.map((e: any) => Tuple.fromJSON(e)) + : [], }; }, @@ -813,6 +871,11 @@ export const PermissionLookupEntityRequest = { message.entityType !== undefined && (obj.entity_type = message.entityType); message.permission !== undefined && (obj.permission = message.permission); message.subject !== undefined && (obj.subject = message.subject ? Subject.toJSON(message.subject) : undefined); + if (message.contextualTuples) { + obj.contextual_tuples = message.contextualTuples.map((e) => e ? Tuple.toJSON(e) : undefined); + } else { + obj.contextual_tuples = []; + } return obj; }, @@ -827,6 +890,7 @@ export const PermissionLookupEntityRequest = { message.subject = (object.subject !== undefined && object.subject !== null) ? Subject.fromPartial(object.subject) : undefined; + message.contextualTuples = object.contextualTuples?.map((e) => Tuple.fromPartial(e)) || []; return message; }, }; @@ -997,7 +1061,7 @@ export const PermissionLookupEntityStreamResponse = { }; function createBasePermissionEntityFilterRequest(): PermissionEntityFilterRequest { - return { tenantId: "", metadata: undefined, entityReference: undefined, subject: undefined }; + return { tenantId: "", metadata: undefined, entityReference: undefined, subject: undefined, contextualTuples: [] }; } export const PermissionEntityFilterRequest = { @@ -1014,6 +1078,9 @@ export const PermissionEntityFilterRequest = { if (message.subject !== undefined) { Subject.encode(message.subject, writer.uint32(34).fork()).ldelim(); } + for (const v of message.contextualTuples) { + Tuple.encode(v!, writer.uint32(42).fork()).ldelim(); + } return writer; }, @@ -1036,6 +1103,9 @@ export const PermissionEntityFilterRequest = { case 4: message.subject = Subject.decode(reader, reader.uint32()); break; + case 5: + message.contextualTuples.push(Tuple.decode(reader, reader.uint32())); + break; default: reader.skipType(tag & 7); break; @@ -1050,6 +1120,9 @@ export const PermissionEntityFilterRequest = { metadata: isSet(object.metadata) ? PermissionEntityFilterRequestMetadata.fromJSON(object.metadata) : undefined, entityReference: isSet(object.entity_reference) ? RelationReference.fromJSON(object.entity_reference) : undefined, subject: isSet(object.subject) ? Subject.fromJSON(object.subject) : undefined, + contextualTuples: Array.isArray(object?.contextual_tuples) + ? object.contextual_tuples.map((e: any) => Tuple.fromJSON(e)) + : [], }; }, @@ -1061,6 +1134,11 @@ export const PermissionEntityFilterRequest = { message.entityReference !== undefined && (obj.entity_reference = message.entityReference ? RelationReference.toJSON(message.entityReference) : undefined); message.subject !== undefined && (obj.subject = message.subject ? Subject.toJSON(message.subject) : undefined); + if (message.contextualTuples) { + obj.contextual_tuples = message.contextualTuples.map((e) => e ? Tuple.toJSON(e) : undefined); + } else { + obj.contextual_tuples = []; + } return obj; }, @@ -1076,6 +1154,7 @@ export const PermissionEntityFilterRequest = { message.subject = (object.subject !== undefined && object.subject !== null) ? Subject.fromPartial(object.subject) : undefined; + message.contextualTuples = object.contextualTuples?.map((e) => Tuple.fromPartial(e)) || []; return message; }, }; @@ -1148,7 +1227,14 @@ export const PermissionEntityFilterRequestMetadata = { }; function createBasePermissionLookupSubjectRequest(): PermissionLookupSubjectRequest { - return { tenantId: "", metadata: undefined, entity: undefined, permission: "", subjectReference: undefined }; + return { + tenantId: "", + metadata: undefined, + entity: undefined, + permission: "", + subjectReference: undefined, + contextualTuples: [], + }; } export const PermissionLookupSubjectRequest = { @@ -1168,6 +1254,9 @@ export const PermissionLookupSubjectRequest = { if (message.subjectReference !== undefined) { RelationReference.encode(message.subjectReference, writer.uint32(42).fork()).ldelim(); } + for (const v of message.contextualTuples) { + Tuple.encode(v!, writer.uint32(50).fork()).ldelim(); + } return writer; }, @@ -1193,6 +1282,9 @@ export const PermissionLookupSubjectRequest = { case 5: message.subjectReference = RelationReference.decode(reader, reader.uint32()); break; + case 6: + message.contextualTuples.push(Tuple.decode(reader, reader.uint32())); + break; default: reader.skipType(tag & 7); break; @@ -1210,6 +1302,9 @@ export const PermissionLookupSubjectRequest = { subjectReference: isSet(object.subject_reference) ? RelationReference.fromJSON(object.subject_reference) : undefined, + contextualTuples: Array.isArray(object?.contextual_tuples) + ? object.contextual_tuples.map((e: any) => Tuple.fromJSON(e)) + : [], }; }, @@ -1224,6 +1319,11 @@ export const PermissionLookupSubjectRequest = { (obj.subject_reference = message.subjectReference ? RelationReference.toJSON(message.subjectReference) : undefined); + if (message.contextualTuples) { + obj.contextual_tuples = message.contextualTuples.map((e) => e ? Tuple.toJSON(e) : undefined); + } else { + obj.contextual_tuples = []; + } return obj; }, @@ -1240,6 +1340,7 @@ export const PermissionLookupSubjectRequest = { message.subjectReference = (object.subjectReference !== undefined && object.subjectReference !== null) ? RelationReference.fromPartial(object.subjectReference) : undefined; + message.contextualTuples = object.contextualTuples?.map((e) => Tuple.fromPartial(e)) || []; return message; }, };