Lists list and CUD

Custom forms list
Updated DB schema (not yet implemented in the server, which means that most of the server is not broken).
- custom forms are independent of a list
- order and visibility of fields is now in custom_fields
- first_name and last_name has been turned to a regular custom field
This commit is contained in:
Tomas Bures 2017-07-29 22:42:07 +03:00
parent 216fe40b53
commit f6e1938ff9
47 changed files with 1245 additions and 122 deletions

View file

@ -10,12 +10,13 @@ function getRequestContext(req) {
return context;
}
function getServiceContext() {
function getAdminContext() {
const context = {
user: {
id: 1,
username: 'admin',
name: 'Service worker',
admin: true,
id: 0,
username: '',
name: '',
email: ''
}
};
@ -25,5 +26,5 @@ function getServiceContext() {
module.exports = {
getRequestContext,
getServiceContext
getAdminContext
};

View file

@ -1,7 +1,7 @@
'use strict';
let config = require('config');
let mysql = require('mysql');
let mysql = require('mysql2');
let redis = require('redis');
let Lock = require('redfour');
let stringifyDate = require('json-stringify-date');

View file

@ -5,7 +5,7 @@ This module handles Mailtrain database initialization and upgrades
*/
let config = require('config');
let mysql = require('mysql');
let mysql = require('mysql2');
let log = require('npmlog');
let fs = require('fs');
let pathlib = require('path');

View file

@ -6,15 +6,7 @@ let shortid = require('shortid');
let segments = require('./segments');
let _ = require('../translate')._;
let tableHelpers = require('../table-helpers');
const UnsubscriptionMode = {
ONE_STEP: 0,
ONE_STEP_WITH_FORM: 1,
TWO_STEP: 2,
TWO_STEP_WITH_FORM: 3,
MANUAL: 4,
MAX: 5
};
const UnsubscriptionMode = require('../../shared/lists').UnsubscriptionMode;
module.exports.UnsubscriptionMode = UnsubscriptionMode;

View file

@ -11,6 +11,14 @@ async function validateEntity(tx, entity) {
}
}
async function validateMove(context, entity, existing, entityTypeId, createOperation, deleteOperation) {
if (existing.namespace !== entity.namespace) {
await shares.enforceEntityPermission(context, 'namespace', entity.namespace, createOperation);
await shares.enforceEntityPermission(context, entityTypeId, entity.id, deleteOperation);
}
}
module.exports = {
validateEntity
validateEntity,
validateMove
};

View file

@ -14,6 +14,7 @@ const bodyParser = require('body-parser');
const users = require('../models/users');
const { nodeifyFunction, nodeifyPromise } = require('./nodeify');
const interoperableErrors = require('../shared/interoperable-errors');
const contextHelpers = require('./context-helpers');
let LdapStrategy;
try {
@ -143,6 +144,6 @@ if (config.ldap.enabled && LdapStrategy) {
})));
passport.serializeUser((user, done) => done(null, user.id));
passport.deserializeUser((id, done) => nodeifyPromise(users.getById(null, id), done));
passport.deserializeUser((id, done) => nodeifyPromise(users.getById(contextHelpers.getAdminContext(), id), done));
}

View file

@ -6,6 +6,16 @@ const entityTypes = {
sharesTable: 'shares_namespace',
permissionsTable: 'permissions_namespace'
},
list: {
entitiesTable: 'lists',
sharesTable: 'shares_list',
permissionsTable: 'permissions_list'
},
customForm: {
entitiesTable: 'custom_forms',
sharesTable: 'shares_custom_form',
permissionsTable: 'permissions_custom_form'
},
report: {
entitiesTable: 'reports',
sharesTable: 'shares_report',