Skip to content

Commit

Permalink
bring back more current version of frontend
Browse files Browse the repository at this point in the history
  • Loading branch information
vkarpov15 committed Jun 11, 2024
1 parent c1bf864 commit be33e15
Show file tree
Hide file tree
Showing 18 changed files with 622 additions and 382 deletions.
41 changes: 35 additions & 6 deletions backend/authorize.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
'use strict';

const Archetype = require('archetype');
const Log = require('../db/log');
const Player = require('../db/player');
const connect = require('../db/connect');
const { inspect } = require('util');
const oso = require('../oso');

const AuthorizeParams = new Archetype({
Expand Down Expand Up @@ -28,11 +32,36 @@ const AuthorizeParams = new Archetype({

module.exports = async function authorize(params) {
params = new AuthorizeParams(params);
const authorized = await oso.authorize(
{ type: 'User', id: `${params.sessionId}_${params.userId}` },
params.action,
{ type: params.resourceType, id: params.resourceId }
);
const { sessionId } = params;

return { authorized };
await connect();

await Log.info(`authorize ${inspect(params)}`, {
...params,
function: 'authorize'
});

try {
const player = await Player.findOne({ sessionId }).orFail();

console.log('Authorize', params, player.contextFacts);

const authorized = await oso.authorize(
{ type: 'User', id: params.userId },
params.action,
{ type: params.resourceType, id: params.resourceId },
player.contextFacts
);
return { authorized };
} catch (err) {
await Log.error(`authorize: ${err.message}`, {
...params,
function: 'authorize',
message: err.message,
stack: err.stack,
err: inspect(err)
});

throw err;
}
};
46 changes: 46 additions & 0 deletions backend/clearContextFacts.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
'use strict';

const Archetype = require('archetype');
const Log = require('../db/log');
const Player = require('../db/player');
const connect = require('../db/connect');
const extrovert = require('extrovert');
const { inspect } = require('util');

const ClearContextFactsParams = new Archetype({
sessionId: {
$type: 'string',
$required: true
}
}).compile('ClearContextFactsParams');

module.exports = extrovert.toNetlifyFunction(async params => {
params = new ClearContextFactsParams(params);

await connect();

await Log.info(`clearContextFacts ${inspect(params)}`, {
...params,
function: 'clearContextFacts'
});

try {
const { sessionId } = params;
const player = await Player.findOne({ sessionId }).orFail();

player.contextFacts = [];

await player.save();
return { ok: true };
} catch (err) {
await Log.error(`clearContextFacts: ${err.message}`, {
...params,
function: 'clearContextFacts',
message: err.message,
stack: err.stack,
err: inspect(err)
});

throw err;
}
}, null, 'clearContextFacts');
93 changes: 72 additions & 21 deletions backend/deleteFact.js
Original file line number Diff line number Diff line change
@@ -1,8 +1,11 @@
'use strict';

const Archetype = require('archetype');
const Log = require('../db/log');
const Player = require('../db/player');
const assert = require('assert');
const oso = require('../oso');
const connect = require('../db/connect');
const { inspect } = require('util');

const DeleteFactParams = new Archetype({
sessionId: {
Expand All @@ -24,38 +27,86 @@ const DeleteFactParams = new Archetype({
},
resourceType: {
$type: 'string',
$required: true
$required: (v, type, doc) => assert.ok(v != null || doc.role !== 'superadmin')
},
resourceId: {
$type: 'string',
$required: true
$required: (v, type, doc) => assert.ok(v != null || doc.role !== 'superadmin')
},
attribute: {
$type: 'string',
$validate: (v, type, doc) => assert.ok(v != null || doc.factType !== 'attribute')
},
attributeValue: {
$type: 'boolean',
$type: 'string',
$validate: (v, type, doc) => assert.ok(v != null || doc.factType !== 'attribute')
},
actorType: {
$type: 'string'
}
}).compile('DeleteFactParams');

module.exports = async function deleteFact(params) {
module.exports = deleteFact;

async function deleteFact(params) {
params = new DeleteFactParams(params);
if (params.factType === 'role') {
const resourceId = params.resourceType === 'Repository' ? `${params.sessionId}_${params.resourceId}` : params.resourceId;
await oso.delete(
'has_role',
{ type: 'User', id: `${params.sessionId}_${params.userId}` },
params.role,
{ type: params.resourceType, id: resourceId }
);
} else {
await oso.delete(
params.attribute,
{ type: 'Repository', id: `${params.sessionId}_${params.resourceId}` },
{ type: 'Boolean', id: !!params.attributeValue + '' }
);

await connect();

await Log.info(`deleteFact ${inspect(params)}`, {
...params,
function: 'deleteFact'
});

try {
const { sessionId } = params;
const player = await Player.findOne({ sessionId }).orFail();

if (params.factType === 'role') {
if (params.role === 'superadmin') {
player.contextFacts = player.contextFacts.filter(fact => {
return fact[0] !== 'has_role' ||
fact[1].type !== 'User' ||
fact[1].id !== params.userId ||
fact[2] !== params.role;
});
} else {
player.contextFacts = player.contextFacts.filter(fact => {
return fact[0] !== 'has_role' ||
fact[1].type !== (params.actorType ?? 'User') ||
fact[1].id !== params.userId ||
fact[2] !== params.role ||
fact[3]?.type !== params.resourceType ||
fact[3]?.id !== params.resourceId;
});
}

} else if (params.attribute === 'has_default_role') {
player.contextFacts = player.contextFacts.filter(fact => {
return fact[0] !== 'has_default_role' ||
fact[1].type !== params.resourceType ||
fact[1].id !== params.resourceId ||
fact[2] !== params.attributeValue;
});
} else {
player.contextFacts = player.contextFacts.filter(fact => {
return fact[0] !== params.attribute ||
fact[1].type !== params.resourceType ||
fact[1].id !== params.resourceId ||
fact[2].id !== params.attributeValue;
});
}
await player.save();
return { ok: true, player };
} catch (err) {
await Log.error(`deleteFact: ${err.message}`, {
...params,
function: 'deleteFact',
message: err.message,
stack: err.stack,
err: inspect(err)
});

throw err;
}
return { ok: true };
};
}
48 changes: 0 additions & 48 deletions backend/facts.js

This file was deleted.

25 changes: 22 additions & 3 deletions backend/resumeGame.js
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
'use strict';

const Archetype = require('archetype');
const Log = require('../db/log');
const Player = require('../db/player');
const connect = require('../db/connect');
const { inspect } = require('util');

const ResumeGameParams = new Archetype({
sessionId: {
Expand All @@ -16,9 +18,26 @@ module.exports = async function resumeGame(params) {

await connect();

const player = await Player.findOne({
sessionId
await Log.info(`resumeGame ${inspect(params)}`, {
...params,
function: 'resumeGame'
});

try {
const player = await Player.findOne({
sessionId
});

return { player };
return { player };
} catch (err) {
await Log.error(`resumeGame: ${err.message}`, {
...params,
function: 'resumeGame',
message: err.message,
stack: err.stack,
err: inspect(err)
});

throw err;
}
};
Loading

0 comments on commit be33e15

Please sign in to comment.