# v1.16.10
## Feature list
* CRUD API credentials
* [universal sessions] Sending files in Facebook
* Add cache headers for cdn response
* [universal sessions] "Entity type 12" (universal session system user)
* [universal sessions] Sending system eventId:2 to facebook and twilio users
* self session issues
## Services to deploy
* admin service
* main worker // progress
* core service // progress
* rake user app module // progress
* user app worker // progress
## DB
### Collection system config
```
db.getCollection("systemConfigs").update(
{ nodeEnv: 'test' },
{
$set: {
"templates.workspaceRegistration.body.workspaceName": "{{workspace.name}}"
}
})
```
### Collection workspaceSystemUsers
```
const users = db.systemUsers.aggregate([
{
$match: { isRegistered: false/true }
},
{
$lookup: {
from: 'sessions',
as: 'sessions',
localField: 'entityId',
foreignField: 'entities.entityId',
}
},
{
$match: {
sessions: { $gt: { $size: 0 } }
}
},
{
$project: { systemUserId: 1 }
}
]).toArray();
users.forEach((one) => {
console.log('one.systemUserId', one.systemUserId);
db.workspaceSystemUsers.updateMany({ systemUserId: one.systemUserId }, {
$set: { entityTypeId: 12/4 }
});
});
db.workspaceSystemUsers.createIndex( // done
{
"status": 1,
"referenceValues.entity.firstName": 1,
"referenceValues.entity.lastName": 1
},
{
name: "SortIndex_status_referenceValues.entity.firstName_referenceValues.entity.lastName",
collation: { locale: 'en', strength: 2 }
}
);
db.workspaceSystemUsers.createIndex( // done
{
"referenceValues.entity.firstName": 1,
"referenceValues.entity.lastName": 1
},
{
name: "SortIndex_referenceValues.entity.firstName_referenceValues.entity.lastName",
collation: { locale: 'en', strength: 2 }
}
)
db.workspaceSystemUsers.createIndex( // done
{
"referenceValues.entity.lastName": 1,
"referenceValues.entity.firstName": 1,
},
{
name: "SortIndex_referenceValues.entity.lastName_referenceValues.entity.firstName",
collation: { locale: 'en', strength: 2 }
}
);
db.workspaceSystemUsers.updateMany({ status: { $exists: false } }, { $set: { status: 0 } }) // done
```
### Collection entityTypes // done
| entityTypeId | priority | isRoleEligible |
| ------------ | -------- | -------------- |
| 0 | 4 | false |
| 4 | 1 | true |
| 11 | 3 | true |
| 12 | 2 | true |
```
db.entityTypes.insert({ // done
entityTypeId: 12,
priority: 2,
isRoleEligible: true,
name: 'Universal User'
});
const updates = [ // done
{ entityTypeId: 0, priority: 4, isRoleEligible: false },
{ entityTypeId: 4, priority: 1, isRoleEligible: true },
{ entityTypeId: 11, priority: 3, isRoleEligible: true },
{ entityTypeId: 12, priority: 2, isRoleEligible: true },
];
updates.forEach((one) => { // done
db.entityTypes.updateOne({ entityTypeId: one.entityTypeId }, {
$set: { ...one },
});
});
```
### Collection roles // done
```
db.getCollection("roles").update(
{ roleId: 7 },
{ $push: { "systemFunctionIds": { "id": 591, "availablePermissionTypeIds": [ 2, 3 ] } } }
)
db.roles.update(
{
parentRoleId: { $exists: false },
'scope.typeId': 'system',
},
{ $set: { defaultEntityTypeId: 4 } }
);
db.roles.updateMany({ parentRoleId: { $exists: false } }, { $set: {defaultEntityTypeId:4} })
const prototypes = [
// {label: 'organization', roleId: 1, name: "Organization API User", model: db.organizations, getId: doc => doc.organizationId },
{label: 'project', roleId: 4, name: "Project API User", model: db.projects, getId: doc => doc.projectId },
{label: 'workspace', roleId: 8, name: "Workspace API User", model: db.workspaces, getId: doc => doc.workspaceId }
];
for (const proto of prototypes){
const roleId = proto.roleId;
const [role] = db.roles.find({ roleId }).toArray();
const pack = {
"systemApplicationId": 1,
"name": proto.name,
"description": "",
"systemFunctionIds": role.systemFunctionIds,
"scope": role.scope,
"createdAt": new Date(),
"updatedAt": new Date(),
"assignments": role.assignments,
"defaultEntityTypeId": 11
};
const { count } = db.identitycounters.findOneAndUpdate({ model: 'roles' }, { $inc: { count: 1 } }, { returnNewDocument: true });
pack.roleId = count;
db.roles.insert(pack);
const parentRoleId = count;
const elements = proto.model.find({ }).projection({ "workspaceId": 1, "organizationId": 1, "projectId":1, "_id": 0 }).toArray();
for (const [i, doc] of elements.entries()){
const id = +proto.getId(doc).toString();
console.log(`[${i}:${elements.length}] Insert new child role for ${proto.label} ${id}`);
const duplicate = db.roles.findOne({
'assignments.ids': [id],
'assignments.type': proto.label,
"parentRoleId": parentRoleId
});
if (duplicate) continue;
const pack = {
"systemApplicationId": 1,
"name": proto.name,
"description": "",
"systemFunctionIds": [],
"scope": { type: proto.label },
"createdAt": new Date(),
"updatedAt": new Date(),
"assignments": {"ids": [id], "type": proto.label },
parentRoleId
};
const { count } = db.identitycounters.findOneAndUpdate({ model: 'roles' }, { $inc: { count: 1 } }, { returnNewDocument: true });
pack.roleId = count;
db.roles.insert(pack);
}
}
```
### Collection platforms // done
```
db.platforms.findOneAndUpdate(
{
"platformId": 3
},
{
$set: {
"limitations.fileTransfer":
[
{
"type":"default",
"maxSize": 26214400,
"prohibitedFileExtensions": ["js", "exe", "zip", "rar"],
"allowedFileExtensions": ["json", "txt", "pdf", "csv" ]
},
{
"type":"audio",
"maxSize": 26214400,
"prohibitedFileExtensions": [],
"allowedFileExtensions": []
},
{
"type":"image",
"maxSize": 26214400,
"prohibitedFileExtensions": [],
"allowedFileExtensions": ["jpg", "png"]
}
]
}
}
);
```
### Collection Sessions // done
```
const updateDoc = [
{
$set: {
'referenceValues.entitiesCount': { $size: '$entities' }
}
}
]
db.sessions.updateMany({ isActive: true } , updateDoc)
```
### SystemEventId: 2 // done
```
const localization = db.localizations.insertOne({
"languages": [
{
"code": "en",
"text": "{{firstName}} {{lastName}} just joined the {{channelName}} channel"
}
],
"systemApplicationIds": []
})
db.events.update({systemEventId:2}, {
$set: {
"localizations": {
"defaultLocalizationId": localization.insertedId.toString(),
"platforms": []
}
}
})
```