Skip to content

Commit

Permalink
createAssessmentSchema: add activity_log (#1007)
Browse files Browse the repository at this point in the history
* createAssessmentSchema: add activity_log

* fix typo, remove constraint

* meta/activityLog: created definition

* repository/activityLog: add insertActivityLog

* service/createAssessment: add transaction with activityLog

* core/activityLog: countryIso optional

* schemas: useassessment.props.name

* repository/insertActivityLog: minor changes

* repository/assessment: add createAssessment

* createAssessment: minor updates

* service/createAssessment: return assessment only

* repository/createAssessment: use one instead of query

* Meta/users (#1011)

* service/createAssessment: return assessment only

* repository/createAssessment: use one instead of query

* add users migartions

* service/assessment: move old code under _legacy

* repository/user: old code under _legacy

* add jest

* core/user: add user definitions

* jest config

* server: use create

* tsconfig test

* temporary path for integration tests

* rename tables without _legacy in legacy schema

* core/user: rename Provider to AuthProvider

* create-users-tables-up.sql: add defaults

* create-users-tables-up: set unique email

* {service,repository}/user: read, update

* test/integration: added password, provider

* repository/userProvider: create

* test/integration: set user inactive/active

* General changes

Drop row if user_id deleted from users (different tables)
Add user remove service and test
Use single index under test/integration

* move tests under test/

* minor changes

- activityLog target createdAssessment
- rename test files

* core/activityLog: use meta/user

* server/schemas: update assessment type

* test: create, remove assessment

* server/assessment: read, remove, minor updates

* test: rename tests without dash

* server/repository: add camelize

* test/removeAssessment: test no assessment returned after remove

* github/test: add integration test

* github/test: remove integration test

* .github/test: use docker, run integration tests

* add .github/test: yarn watch

* server/db: add run-migrations

* server/run-migrations: remove .env

* .github/test: add local env

* add debug

* .github/test: update prot

* .github/test: add inline vars

* add test env

* remove inline variables
  • Loading branch information
sorja authored Nov 18, 2021
1 parent 62ed917 commit 61f070a
Show file tree
Hide file tree
Showing 103 changed files with 2,608 additions and 63 deletions.
14 changes: 14 additions & 0 deletions .env.test
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
NODE_ENV=test

# Default web server port
PORT=9001
APP_URI=http://localhost:9001

# DB
PGHOST=localhost
PGPORT=5442
PGDATABASE=frap-dev
PGUSER=frap
PGPASSWORD=frap

DEBUG=true
39 changes: 32 additions & 7 deletions .github/workflows/test.js.yml
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,37 @@ jobs:
build:
runs-on: ubuntu-latest

services:
postgres:
image: postgis/postgis:12-3.0
env:
POSTGRES_USER: frap
POSTGRES_PASSWORD: frap
POSTGRES_DB: frap-dev
ports:
- 5442:5432
options: --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5

steps:
- uses: actions/checkout@v2
- uses: actions/checkout@v2

- name: Use Node.js 14.18.1
uses: actions/setup-node@v1
with:
node-version: '14.18.1'
- run: yarn
- run: yarn test
- name: Use Node.js 14.18.1
uses: actions/setup-node@v2
with:
node-version: '14.18.1'
- run: yarn
- run: yarn run-migrations
env:
PGHOST: localhost
PGPORT: 5442
PGDATABASE: frap-dev
PGUSER: frap
PGPASSWORD: frap
- run: yarn test
- run: yarn test:integration
env:
PGHOST: localhost
PGPORT: 5442
PGDATABASE: frap-dev
PGUSER: frap
PGPASSWORD: frap
14 changes: 14 additions & 0 deletions core/meta/activityLog.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
import { User } from '@core/meta/user'

export enum ActivityLogMessage {
assessmentCreate = 'assessmentCreate',
}

export interface ActivityLog<Target> {
target: Target
message: ActivityLogMessage
countryIso?: string
section: string
user: User
time?: string
}
43 changes: 43 additions & 0 deletions core/meta/user.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
export enum UserStatus {
invitationPending = 'invitationPending',
active = 'active',
inactive = 'inactive',
}

export interface User {
institution?: string
lang: string
id: number
profilePictureFilename?: string
name: string
status: UserStatus
profilePictureFile?: string
position?: string
email: string
}

export enum AuthProvider {
google = 'google',
local = 'local',
}

export interface UserProvider<P = void> {
id: number
userId: number
provider: AuthProvider
props: P
}

export interface UserInvitation {
uuid: string
invitedAt: string
acceptedAt: string
userId: number
}

export interface UserResetPassword {
uuid: string
changedAt: string
createdAt: string
userId: number
}
6 changes: 6 additions & 0 deletions jest.config.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
module.exports = {
roots: ['<rootDir>/dist/'],
testEnvironment: 'node',
verbose: true,
testRegex: 'dist/test/integration/index.js',
}
5 changes: 5 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,11 @@
"watch:server": "ts-node-dev server",
"watch:server-debug": "NODE_ENV=development nodemon -e js --inspect --watch server server/serverLocal.js",
"create-migration": "./server/db/migration/create-migration.sh",
"run-migrations": "./server/db/migration/run-migrations.sh",
"test": "mochapack --webpack-config webpack.config.babel.test.js \"test/unit/*.ts\"",
"//TODO:": "echo handle next command betters, and env variables",
"test:build": "yarn tsc --project tsconfig.test.json && yarn tscpaths -v -p tsconfig.test.paths.json -s ./server -o ./dist",
"test:integration": "yarn test:build && cp .env.test dist/ && jest --setupFiles dotenv/config",
"preversion": "git diff --quiet || { echo \"Working directory is dirty\"; exit 1; }; yarn test",
"postversion": "git push --tags && git push && echo \"Successfully released version $npm_package_version!\"",
"prepare": "husky install",
Expand Down Expand Up @@ -106,6 +110,7 @@
"git-revision-webpack-plugin": "^5.0.0",
"html-webpack-plugin": "^5.3.2",
"husky": "^7.0.0",
"jest": "^27.3.1",
"jsondiffpatch": "^0.4.1",
"less": "^4.1.1",
"less-loader": "^10.0.1",
Expand Down
2 changes: 1 addition & 1 deletion server/api/assessment/export.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { Express, Response, Request } from 'express'
import JSZip from 'jszip'
import { ApiAuthMiddleware } from '@server/api/middleware'
import * as ExportService from '@server/service/assessment/exportService'
import * as ExportService from '@server/service/assessment/_legacy/exportService'
import { Requests } from '@server/utils'
import { ApiEndPoint } from '@common/api/endpoint'

Expand Down
2 changes: 1 addition & 1 deletion server/api/auth/authConfig.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import { validEmail, validPassword } from '@common/userUtils'
import { Objects } from '@core/utils'
import { User } from '@core/auth'
import { passwordHash } from './utils/passwordHash'
import * as userRepository from '../../repository/user/userRepository'
import * as userRepository from '../../repository/user/_legacy_userRepository'
import * as db from '../../db/db_deprecated'

const googleStrategyVerifyCallback = async (
Expand Down
2 changes: 1 addition & 1 deletion server/api/auth/getInvitation.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { Express, Response, Request } from 'express'
import { fetchInvitation, findUserByEmail } from '@server/repository/user/userRepository'
import { fetchInvitation, findUserByEmail } from '@server/repository/user/_legacy_userRepository'
import { sendErr } from '@server/utils/requests'
import { ApiEndPoint } from '@common/api/endpoint'

Expand Down
2 changes: 1 addition & 1 deletion server/api/auth/resetPassword.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { Express, Response, Request } from 'express'
import { validEmail } from '@common/userUtils'
import { findLocalUserByEmail, findUserById } from '@server/repository/user/userRepository'
import { findLocalUserByEmail, findUserById } from '@server/repository/user/_legacy_userRepository'
import * as db from '@server/db/db_deprecated'
import {
createResetPassword,
Expand Down
2 changes: 1 addition & 1 deletion server/api/dataExport/bulkDownload.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { Express, Response, Request } from 'express'
import * as ExportService from '@server/service/assessment/exportService'
import * as ExportService from '@server/service/assessment/_legacy/exportService'
import * as JSZip from 'jszip'
import * as util from 'util'
import * as fs from 'fs'
Expand Down
2 changes: 1 addition & 1 deletion server/api/landing/get.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import * as db from '../../db/db_deprecated'
import { checkCountryAccessFromReqParams } from '../../utils/accessControl'
import { sendErr } from '../../utils/requests'

import { fetchCountryUsers } from '../../repository/user/userRepository'
import { fetchCountryUsers } from '../../repository/user/_legacy_userRepository'
import { getChatSummary } from '../../repository/userChat/userChatRepository'
import { fetchCountryUnreadMessages } from '../../repository/countryMessageBoard/countryMessageBoardRepository'

Expand Down
2 changes: 1 addition & 1 deletion server/api/userChat/create.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import { addMessage, getChatUnreadMessages } from '@server/repository/userChat/u
import { ApiAuthMiddleware } from '@server/api/middleware'
import { sendErr, serverUrl } from '@server/utils/requests'
import { createI18nPromise } from '@common/i18n/i18nFactory'
import { findUserById } from '@server/repository/user/userRepository'
import { findUserById } from '@server/repository/user/_legacy_userRepository'
import { getCountry } from '@server/repository/country/getCountry'
import { sendMail } from '@server/service/email/sendMail'
import { ApiEndPoint } from '@common/api/endpoint'
Expand Down
2 changes: 1 addition & 1 deletion server/assessment/sendAssessmentNotification.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import { assessmentStatus } from '@common/assessment'
import { getCountry } from '@server/repository/country/getCountry'
import { createI18nPromise } from '../../common/i18n/i18nFactory'
import { sendMail } from '../service/email/sendMail'
import { fetchCountryUsers, fetchAdministrators } from '../repository/user/userRepository'
import { fetchCountryUsers, fetchAdministrators } from '../repository/user/_legacy_userRepository'
import { nationalCorrespondent, reviewer } from '../../common/countryRole'

export const createMail = async (
Expand Down
53 changes: 53 additions & 0 deletions server/db/migration/migrations/20211111105502-fra-users-legacy.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
'use strict';

var dbm;
var type;
var seed;
var fs = require('fs');
var path = require('path');
var Promise;

/**
* We receive the dbmigrate dependency from dbmigrate initially.
* This enables us to not have to rely on NODE_PATH.
*/
exports.setup = function(options, seedLink) {
dbm = options.dbmigrate;
type = dbm.dataType;
seed = seedLink;
Promise = options.Promise;
};

exports.up = function(db) {
var filePath = path.join(__dirname, 'sqls', '20211111105502-fra-users-legacy-up.sql');
return new Promise( function( resolve, reject ) {
fs.readFile(filePath, {encoding: 'utf-8'}, function(err,data){
if (err) return reject(err);
console.log('received data: ' + data);

resolve(data);
});
})
.then(function(data) {
return db.runSql(data);
});
};

exports.down = function(db) {
var filePath = path.join(__dirname, 'sqls', '20211111105502-fra-users-legacy-down.sql');
return new Promise( function( resolve, reject ) {
fs.readFile(filePath, {encoding: 'utf-8'}, function(err,data){
if (err) return reject(err);
console.log('received data: ' + data);

resolve(data);
});
})
.then(function(data) {
return db.runSql(data);
});
};

exports._meta = {
"version": 1
};
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
let dbm
let type
let seed
const fs = require('fs')
const path = require('path')

let Promise

/**
* We receive the dbmigrate dependency from dbmigrate initially.
* This enables us to not have to rely on NODE_PATH.
*/
exports.setup = function (options, seedLink) {
dbm = options.dbmigrate
type = dbm.dataType
seed = seedLink
Promise = options.Promise
}

exports.up = function (db) {
const filePath = path.join(__dirname, 'sqls', '20211111110342-move-to-legacy-schema-up.sql')
return new Promise(function (resolve, reject) {
fs.readFile(filePath, { encoding: 'utf-8' }, function (err, data) {
if (err) return reject(err)
console.log(`received data: ${data}`)

resolve(data)
})
}).then(function (data) {
return db.runSql(data)
})
}

exports.down = function (db) {
const filePath = path.join(__dirname, 'sqls', '20211111110342-move-to-legacy-schema-down.sql')
return new Promise(function (resolve, reject) {
fs.readFile(filePath, { encoding: 'utf-8' }, function (err, data) {
if (err) return reject(err)
console.log(`received data: ${data}`)

resolve(data)
})
}).then(function (data) {
return db.runSql(data)
})
}

exports._meta = {
version: 1,
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
'use strict';

var dbm;
var type;
var seed;
var fs = require('fs');
var path = require('path');
var Promise;

/**
* We receive the dbmigrate dependency from dbmigrate initially.
* This enables us to not have to rely on NODE_PATH.
*/
exports.setup = function(options, seedLink) {
dbm = options.dbmigrate;
type = dbm.dataType;
seed = seedLink;
Promise = options.Promise;
};

exports.up = function(db) {
var filePath = path.join(__dirname, 'sqls', '20211111111648-create-users-tables-up.sql');
return new Promise( function( resolve, reject ) {
fs.readFile(filePath, {encoding: 'utf-8'}, function(err,data){
if (err) return reject(err);
console.log('received data: ' + data);

resolve(data);
});
})
.then(function(data) {
return db.runSql(data);
});
};

exports.down = function(db) {
var filePath = path.join(__dirname, 'sqls', '20211111111648-create-users-tables-down.sql');
return new Promise( function( resolve, reject ) {
fs.readFile(filePath, {encoding: 'utf-8'}, function(err,data){
if (err) return reject(err);
console.log('received data: ' + data);

resolve(data);
});
})
.then(function(data) {
return db.runSql(data);
});
};

exports._meta = {
"version": 1
};
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
/* Replace with your SQL commands */
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
alter table fra_user
rename to _legacy_fra_user;
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
/* Replace with your SQL commands */
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
create schema _legacy;

alter table public._legacy_assessment set schema _legacy;
alter table public._legacy_fra_user set schema _legacy;
alter table public._legacy_odp set schema _legacy;
alter table public._legacy_odp_class set schema _legacy;
alter table public._legacy_odp_version set schema _legacy;


alter table _legacy._legacy_assessment rename to assessment;
alter table _legacy._legacy_fra_user rename to fra_user;
alter table _legacy._legacy_odp rename to odp;
alter table _legacy._legacy_odp_class rename to odp_class;
alter table _legacy._legacy_odp_version rename to odp_version;
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
/* Replace with your SQL commands */
Loading

0 comments on commit 61f070a

Please sign in to comment.