@live-change/user-service
Advanced tools
Comparing version 0.3.20 to 0.3.21
@@ -88,2 +88,2 @@ const definition = require('./definition.js') | ||
module.exports = { User, AuthenticatedUser } | ||
module.exports = { User, Session, AuthenticatedUser } |
{ | ||
"name": "@live-change/user-service", | ||
"version": "0.3.20", | ||
"version": "0.3.21", | ||
"description": "", | ||
@@ -24,7 +24,7 @@ "main": "index.js", | ||
"dependencies": { | ||
"@live-change/framework": "0.7.21", | ||
"@live-change/relations-plugin": "0.7.21", | ||
"@live-change/framework": "0.7.22", | ||
"@live-change/relations-plugin": "0.7.22", | ||
"pluralize": "8.0.0" | ||
}, | ||
"gitHead": "3d22506f09d6c649cd63a342720f396122b0d3a7" | ||
"gitHead": "70c50fb3eaafe7d1cf5c07b9916ab5a6bfcc8e34" | ||
} |
const definition = require("./definition.js") | ||
const App = require("@live-change/framework") | ||
const { PropertyDefinition, ViewDefinition, IndexDefinition, ActionDefinition, EventDefinition } = App | ||
const { User } = require("./model.js") | ||
const { PropertyDefinition, ViewDefinition, IndexDefinition, ActionDefinition, EventDefinition, TriggerDefinition } = App | ||
const { User, Session } = require("./model.js") | ||
@@ -38,6 +38,111 @@ const pluralize = require('pluralize') | ||
/// TODO: merge on signedIn trigger | ||
/// TODO: delete on userDeleted trigger | ||
service.trigger({ | ||
name: 'signedIn', | ||
properties: { | ||
user: { | ||
type: User, | ||
validation: ['nonEmpty'] | ||
}, | ||
session: { | ||
type: Session, | ||
validation: ['nonEmpty'] | ||
}, | ||
}, | ||
async execute({ user, session }, { service }, emit) { | ||
const sessionPath = ['session_Session', session] | ||
const sessionItems = await modelRuntime().indexRangeGet('bySessionOrUser', sessionPath, {} ) | ||
if(config.merge) { | ||
const userPath = ['user_User', user] | ||
const userItems = await modelRuntime().indexRangeGet('bySessionOrUser', userPath, {} ) | ||
const mergeResult = await config.merge(sessionItems, userItems) | ||
if(mergeResult) { | ||
const { transferred, updated, deleted } = mergeResult | ||
for(const entity of transferred) { | ||
emit({ | ||
type: 'sessionOrUserOwned' + modelName + 'Transferred', | ||
[modelPropertyName]: entity.id, | ||
to: { | ||
sessionOrUserType: 'user_User', | ||
sessionOrUser: user | ||
} | ||
}) | ||
} | ||
for(const entity of updated) { | ||
emit({ | ||
type: 'sessionOrUserOwned' + modelName + 'Updated', | ||
[modelPropertyName]: entity.id, | ||
identifiers: { | ||
id: entity.id, | ||
sessionOrUserType: 'user_User', | ||
sessionOrUser: user | ||
}, | ||
data: entity | ||
}) | ||
} | ||
for(const entity of deleted) { | ||
emit({ | ||
type: 'sessionOrUserOwned' + modelName + 'Deleted', | ||
[modelPropertyName]: entity.id, | ||
}) | ||
} | ||
} | ||
} else { | ||
for(const entity of sessionItems) { | ||
emit({ | ||
type: 'sessionOrUserOwned' + modelName + 'Transferred', | ||
[modelPropertyName]: entity.id, | ||
identifiers: { | ||
id: entity.id | ||
}, | ||
to: { | ||
sessionOrUserType: 'user_User', | ||
sessionOrUser: user | ||
} | ||
}) | ||
} | ||
} | ||
} | ||
}) | ||
service.trigger({ | ||
name: 'userDeleted', | ||
properties: { | ||
user: { | ||
type: User, | ||
validation: ['nonEmpty'] | ||
} | ||
}, | ||
async execute({ user, session }, { service }, emit) { | ||
/// TODO: delete on userDeleted trigger | ||
} | ||
}) | ||
if(config.ownerReadAccess) { | ||
const viewName = 'my' + modelName | ||
const propertyName = modelName[0].toLowerCase() + modelName.slice(1) | ||
service.views[viewName] = new ViewDefinition({ | ||
name: viewName, | ||
access(params, context) { | ||
return config.ownerReadAccess ? config.ownerReadAccess(params, context) : true | ||
}, | ||
properties: { | ||
[propertyName]: { | ||
type: `${service.name}_${modelName}`, | ||
validation: ['nonEmpty'] | ||
} | ||
}, | ||
async daoPath(params, { client, context }) { | ||
const owner = client.user ? ['user_User', client.user] : ['session_Session', client.session] | ||
const range = { | ||
gte: '_'+ params[propertyName], | ||
lte: '_'+ params[propertyName] | ||
} | ||
const path = modelRuntime().indexObjectPath('bySessionOrUser', owner, range ) | ||
console.log("DAO PATH", path, "range", range, 'params', params) | ||
return path | ||
} | ||
}) | ||
} | ||
if(config.ownerReadAccess) { | ||
const viewName = 'my' + pluralize(modelName) | ||
@@ -53,2 +158,3 @@ service.views[viewName] = new ViewDefinition({ | ||
const path = modelRuntime().indexRangePath('bySessionOrUser', owner, range ) | ||
console.log("DAO PATH", path, "range", range) | ||
return path | ||
@@ -162,3 +268,3 @@ } | ||
if(config.userDeleteAccess || config.userWriteAccess) { | ||
const eventName = 'userOwned' + modelName + 'Deleted' | ||
const eventName = 'sessionOrUser' + modelName + 'Deleted' | ||
const actionName = 'deleteMyUser' + modelName | ||
@@ -203,2 +309,2 @@ service.actions[actionName] = new ActionDefinition({ | ||
}) | ||
}) |
const definition = require("./definition.js") | ||
const App = require("@live-change/framework") | ||
const { PropertyDefinition, ViewDefinition, IndexDefinition, ActionDefinition, EventDefinition } = App | ||
const { User } = require("./model.js") | ||
const { User, Session } = require("./model.js") | ||
const { allCombinations } = require("./combinations.js") | ||
@@ -42,6 +42,117 @@ const { createIdentifiersProperties } = require('./utils.js') | ||
/// TODO: merge on signedIn trigger | ||
/// TODO: delete on userDeleted trigger | ||
const transferEventName = ['sessionOrUser', ...(extendedWith.map(e => e[0].toUpperCase() + e.slice(1)))] | ||
.join('And') + 'Owned' + modelName + 'Transferred' | ||
service.trigger({ | ||
name: 'signedIn', | ||
properties: { | ||
user: { | ||
type: User, | ||
validation: ['nonEmpty'] | ||
}, | ||
session: { | ||
type: Session, | ||
validation: ['nonEmpty'] | ||
}, | ||
}, | ||
async execute({ user, session }, { service }, emit) { | ||
const sessionPath = ['session_Session', session] | ||
const sessionPropertyId = sessionPath.map(p => JSON.stringify(p)).join(':') | ||
const range = { | ||
gte: sessionPropertyId + '', // '' because it can be not-extended | ||
lte: sessionPropertyId + ':\xFF' | ||
} | ||
const sessionProperties = await modelRuntime().rangeGet(range) | ||
for(const sessionProperty of sessionProperties) { | ||
console.log("SESSION PROPERTY FOUND!", sessionProperty, "MERGE =", config.merge) | ||
const extendedIdentifiers = {} | ||
for(const key of extendedWith) { | ||
extendedIdentifiers[key+'Type'] = sessionProperty[key+'Type'] | ||
extendedIdentifiers[key] = sessionProperty[key] | ||
} | ||
const userPath = ['user_User', user] | ||
for(const key of extendedWith) { | ||
userPath.push(extendedIdentifiers[key+'Type'], extendedIdentifiers[key]) | ||
} | ||
const userPropertyId = userPath.map(p => JSON.stringify(p)).join(':') | ||
const userProperty = await modelRuntime().get(userPropertyId) | ||
if(config.merge) { | ||
const mergeResult = await config.merge(sessionProperty, userProperty) | ||
if(mergeResult && userProperty) { | ||
emit({ | ||
type: 'sessionOrUserOwned' + modelName + 'Updated', | ||
identifiers: { | ||
sessionOrUserType: 'user_User', | ||
sessionOrUser: user | ||
}, | ||
data: mergeResult | ||
}) | ||
} else { | ||
emit({ | ||
type: 'sessionOrUserOwned' + modelName + 'Set', | ||
identifiers: { | ||
sessionOrUserType: 'user_User', | ||
sessionOrUser: user | ||
}, | ||
data: mergeResult | ||
}) | ||
} | ||
if(!config.mergeWithoutDelete) { | ||
emit({ | ||
type: 'sessionOrUserOwned' + modelName + 'Reset', | ||
identifiers: { | ||
sessionOrUserType: 'session_Session', | ||
sessionOrUser: session | ||
} | ||
}) | ||
} | ||
} else { | ||
if(!userProperty) { | ||
await service.trigger({ | ||
type: 'contactOrUserOwned' + modelName + 'Moved', | ||
from: { | ||
sessionOrUserType: 'session_Session', | ||
sessionOrUser: session, | ||
...extendedIdentifiers | ||
}, | ||
to: { | ||
sessionOrUserType: 'user_User', | ||
sessionOrUser: user, | ||
...extendedIdentifiers | ||
}, | ||
}) | ||
emit({ | ||
type: transferEventName, | ||
from: { | ||
sessionOrUserType: 'session_Session', | ||
sessionOrUser: session, | ||
...extendedIdentifiers | ||
}, | ||
to: { | ||
sessionOrUserType: 'user_User', | ||
sessionOrUser: user, | ||
...extendedIdentifiers | ||
} | ||
}) | ||
} // else ignore - user property is more important by default | ||
} | ||
} | ||
} | ||
}) | ||
service.trigger({ | ||
name: 'userDeleted', | ||
properties: { | ||
user: { | ||
type: User, | ||
validation: ['nonEmpty'] | ||
} | ||
}, | ||
async execute({ user, session }, { service }, emit) { | ||
/// TODO: delete on userDeleted trigger | ||
} | ||
}) | ||
if(config.ownerReadAccess) { // single item view | ||
@@ -48,0 +159,0 @@ const viewName = 'my' + modelName |
70810
1767
+ Added@live-change/framework@0.7.22(transitive)
+ Added@live-change/relations-plugin@0.7.22(transitive)
- Removed@live-change/framework@0.7.21(transitive)
- Removed@live-change/relations-plugin@0.7.21(transitive)