Skip to content
This repository has been archived by the owner on Dec 23, 2020. It is now read-only.

Commit

Permalink
API feat: Add Role resolvers and seed script.
Browse files Browse the repository at this point in the history
It's now possible to generate default scopes and request them via GQL.

Related #7
  • Loading branch information
Themimitoof committed Jun 30, 2020
1 parent 86c5a06 commit 548f0ce
Show file tree
Hide file tree
Showing 5 changed files with 172 additions and 4 deletions.
8 changes: 8 additions & 0 deletions api/api/helpers/graphql-errors.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,14 @@ function GQLNotFoundByID(type, id) {
);
}

function GQLNotFoundByName(type, name) {
return new ApolloError(
`${type} with name '${name}' cannot be fetched.`,
'CAN_NOT_FETCH_BY_NAME'
);
}

module.exports = {
GQLNotFoundByID,
GQLNotFoundByName,
};
54 changes: 54 additions & 0 deletions api/api/resolvers/Role.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
const { GQLNotFoundByName } = require('../helpers/graphql-errors');
const context = require('../context').createContext();
const prisma = context.prisma;

async function RoleCollection() {
const results = await prisma.role.findMany();
const scopes = {};

for (Result in results) {
const result = results[Result];
const scope = result.name;

if (
Object.keys(scopes).includes(scope) &&
!scopes[scope].permissions.includes(result.permission)
) {
scopes[scope].permissions.push(result.permission);
} else {
scopes[scope] = {
id: result.id,
name: scope,
permissions: [result.permission],
};
}
}

return Object.values(scopes);
}

async function getRoleByName(args) {
const results = await prisma.role.findMany({
where: { name: args.name },
});

if (results.length == 0) return GQLNotFoundByName('Role', args.name);

const permissions = [];

for (Result in results) {
const result = results[Result];
permissions.push(result.permission);
}

return {
id: results[0].id,
name: results[0].name,
permissions,
};
}

module.exports = {
RoleCollection,
getRoleByName,
};
5 changes: 3 additions & 2 deletions api/api/resolvers/index.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
const Logements = require('./Logements');
const LogementType = require('./LogementType');
const Role = require('./Role');

module.exports = {
Query: {
Expand All @@ -8,7 +9,7 @@ module.exports = {
LogementTypes: () => LogementType.LogementTypeCollection(),
Evenements: () => '',
Employes: () => '',
Roles: () => '',
Roles: () => Role.RoleCollection(),
Reservations: () => '',
EtatsLieux: () => '',
Clients: () => '',
Expand All @@ -18,7 +19,7 @@ module.exports = {
LogementType: (_parent, args) => LogementType.getLogementType(args),
Evenement: (_parent, args) => '',
Employe: (_parent, args) => '',
Role: (_parent, args) => '',
Role: (_parent, args) => Role.getRoleByName(args),
Reservation: (_parent, args) => '',
EtatLieu: (_parent, args) => '',
Client: (_parent, args) => '',
Expand Down
4 changes: 2 additions & 2 deletions api/api/typeDefs.js
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ const typeDefs = gql`
LogementType(id: String!): LogementType
Evenement(id: String!): Evenement
Employe(id: String!): Employe
Role(id: String!): Role
Role(name: String!): Role
Reservation(id: String!): Reservation
EtatLieu(id: String!): EtatLieu
Client(id: String!): Client
Expand Down Expand Up @@ -67,7 +67,7 @@ const typeDefs = gql`
type Role {
id: String!
name: String!
permission: String!
permissions: [String]!
}
type Reservation {
Expand Down
105 changes: 105 additions & 0 deletions api/tests/seedRoles.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,105 @@
const context = require('../api/context').createContext();
const prisma = context.prisma;

const permissionsList = {
god: [
'Logement:view',
'Logement:add',
'Logement:edit',
'Logement:delete',
'Evenement:view',
'Evenement:add',
'Employe:view',
'Employe:add',
'Employe:edit',
'Employe:delete',
'LogementType:view',
'Role:view',
'Reservation:view',
'Reservation:add',
'Reservation:edit',
'Reservation:delete',
'EtatLieu:view',
'EtatLieu:add',
'Client:view',
'Client:add',
'Client:edit',
'Client:delete',
],
employee: [
'Logement:view',
'Logement:edit',
'Evenement:view',
'Evenement:add',
'Employe:view',
'Employe:add',
'Employe:edit',
'LogementType:view',
'Role:view',
'Reservation:view',
'Reservation:add',
'Reservation:edit',
'EtatLieu:view',
'EtatLieu:add',
'Client:view',
],
manager: [
'Logement:view',
'Logement:add',
'Logement:edit',
'Logement:delete',
'Evenement:view',
'Evenement:add',
'Evenement:delete',
'Employe:view',
'Employe:add',
'Employe:edit',
'Employe:delete',
'LogementType:view',
'Role:view',
'Reservation:view',
'Reservation:add',
'Reservation:edit',
'Reservation:delete',
'EtatLieu:view',
'EtatLieu:add',
'Client:view',
'Client:add',
'Client:edit',
'Client:delete',
],
};

(async () => {
console.log('Seeding database with new data...');

for (scope in permissionsList) {
try {
await prisma.role.deleteMany({
where: { name: scope },
});
} catch (err) {
console.error(err);
}

for (idx in permissionsList[scope]) {
const permission = permissionsList[scope][idx];

try {
await prisma.role.create({
data: {
name: scope,
permission,
},
});

console.log(`Role '${scope}' with permission '${permission}' created.`);
} catch (err) {
console.error(err);
}
}
}

console.log('Done!');
process.exit(0);
})();

0 comments on commit 548f0ce

Please sign in to comment.