@live-change/access-control-service 0.8.124 → 0.8.126

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. package/model.js +4 -0
  2. package/package.json +3 -3
  3. package/request.js +63 -1
package/model.js CHANGED
@@ -55,6 +55,10 @@ const PublicAccess = definition.model({
55
55
  availableRoles: rolesArrayType,
56
56
  lastUpdate: {
57
57
  type: Date
58
+ },
59
+ autoGrantRequests: {
60
+ type: Number,
61
+ default: 0
58
62
  }
59
63
  },
60
64
  indexes: {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@live-change/access-control-service",
3
- "version": "0.8.124",
3
+ "version": "0.8.126",
4
4
  "description": "",
5
5
  "main": "index.js",
6
6
  "scripts": {
@@ -21,8 +21,8 @@
21
21
  "url": "https://www.viamage.com/"
22
22
  },
23
23
  "dependencies": {
24
- "@live-change/framework": "^0.8.124"
24
+ "@live-change/framework": "^0.8.126"
25
25
  },
26
- "gitHead": "837e7729f4cbd909d6c7ae32189c562b39cc3122",
26
+ "gitHead": "2aa34c0589d115aeaa573bd2cae09bb43a66d162",
27
27
  "type": "module"
28
28
  }
package/request.js CHANGED
@@ -3,7 +3,7 @@ const app = App.app()
3
3
  import definition from './definition.js'
4
4
  const config = definition.config
5
5
 
6
- import { Access, AccessRequest, rolesArrayType } from './model.js'
6
+ import { PublicAccess, Access, AccessRequest, rolesArrayType } from './model.js'
7
7
  import accessModule from './access.js'
8
8
  const access = accessModule(definition)
9
9
 
@@ -19,6 +19,68 @@ definition.event({
19
19
  }
20
20
  })
21
21
 
22
+ definition.action({
23
+ name: 'requestAccess',
24
+ properties: {
25
+ objectType: {
26
+ type: String,
27
+ validation: ['nonEmpty']
28
+ },
29
+ object: {
30
+ type: String,
31
+ validation: ['nonEmpty']
32
+ },
33
+ roles: rolesArrayType
34
+ },
35
+ queuedBy: ['objectType', 'object'],
36
+ waitForEvents: true,
37
+ access: (params, { client, context, visibilityTest }) =>
38
+ visibilityTest || access.clientCanInvite(client, params),
39
+ async execute({ objectType, object, roles }, { client, service }, emit) {
40
+ const publicAccess = await PublicAccess.get(App.encodeIdentifier([objectType, object]))
41
+ const [sessionOrUserType, sessionOrUser] =
42
+ client.user ? ['user_User', client.user] : ['session_Session', client.session]
43
+
44
+ if(!publicAccess.availableRoles) throw 'notAuthorized'
45
+ for(const requestedRole of roles) {
46
+ if(!publicAccess.availableRoles.includes(requestedRole)) throw 'notAuthorized'
47
+ }
48
+
49
+ const request = App.encodeIdentifier([ sessionOrUserType, sessionOrUser, objectType, object ])
50
+ const requestData = await AccessRequest.get(request)
51
+ if(requestData) throw 'already_requested'
52
+
53
+ if(publicAccess.autoGrantRequests) {
54
+ emit({
55
+ type: 'accessRequestAccepted',
56
+ objectType, object, sessionOrUserType, sessionOrUser, roles,
57
+ autoAccept: true
58
+ })
59
+ emit({
60
+ type: 'objectOwnedPublicAccessUpdated',
61
+ identifiers: {
62
+ objectType, object
63
+ },
64
+ data: {
65
+ autoGrantRequests: publicAccess.autoGrantRequests - 1
66
+ },
67
+ })
68
+ } else {
69
+ emit({
70
+ type: 'sessionOrUserAndObjectOwnedAccessRequestSet',
71
+ data: {
72
+ roles
73
+ },
74
+ identifiers: {
75
+ sessionOrUserType, sessionOrUser,
76
+ objectType, object,
77
+ roles
78
+ }
79
+ })
80
+ }
81
+ }
82
+ })
83
+
22
84
  definition.action({
23
85
  name: 'acceptAccessRequest',
24
86
  waitForEvents: true,