Skip to content

Commit 68a57bd

Browse files
committed
Merge branch 'develop' into feature/DEVSU-2310-rework-pathway-analysis-legend
2 parents 59015da + f8065da commit 68a57bd

10 files changed

Lines changed: 152 additions & 21 deletions

File tree

app/middleware/acl.js

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -117,13 +117,16 @@ module.exports = async (req, res, next) => {
117117
try {
118118
// Update last time the user logged in, limit to once a day
119119
const currentDate = new Date().toDateString();
120-
let userMetadata = await db.models.userMetadata.findOrCreate({where: {userId: req.user.id}});
120+
let userMetadata = await db.models.userMetadata.findOrCreate({
121+
where: {userId: req.user.id},
122+
defaults: {updatedBy: req.user.id},
123+
});
121124
userMetadata = userMetadata[0];
122125
const userLastLogin = userMetadata.lastLoginAt
123126
? new Date(userMetadata.lastLoginAt).toDateString()
124127
: '';
125128
if (userLastLogin !== currentDate) {
126-
await userMetadata.update({lastLoginAt: new Date()});
129+
await userMetadata.update({lastLoginAt: new Date()}, {userId: req.user.id});
127130
}
128131

129132
try {

app/models/reports/report.js

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -76,20 +76,6 @@ module.exports = (sequelize, Sq) => {
7676
},
7777
allowNull: false,
7878
},
79-
seqQc: {
80-
name: 'seqQc',
81-
field: 'seq_qc',
82-
type: Sq.JSONB,
83-
jsonSchema: {
84-
schema: {
85-
type: 'array',
86-
items: {
87-
type: 'object',
88-
},
89-
example: [{Reads: '2534M', bioQC: 'passed'}],
90-
},
91-
},
92-
},
9379
config: {
9480
type: Sq.TEXT,
9581
},

app/models/reports/smallMutations.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,9 @@ module.exports = (sequelize, Sq) => {
134134
field: 'tumour_ref_copies',
135135
type: Sq.INTEGER,
136136
},
137+
exon: {
138+
type: Sq.TEXT,
139+
},
137140
library: {
138141
type: Sq.TEXT,
139142
},

app/routes/report/appendices.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ router.route('/')
1313
try {
1414
const result = await db.models.report.findOne({
1515
where: {ident: req.report.ident},
16-
attributes: ['seqQc', 'config'],
16+
attributes: ['config'],
1717
include: ['seqQC'],
1818
});
1919
return res.json(result);

app/routes/user/settings.js

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,14 @@ router.route('/')
2121
})
2222
.put(async (req, res) => {
2323
try {
24-
await db.models.userMetadata.update({settings: req.body}, {
24+
await db.models.userMetadata.update({
25+
settings: req.body,
26+
updatedBy: req.user.id,
27+
}, {
2528
where: {
2629
user_id: req.user.id,
2730
},
28-
fields: ['settings'],
31+
fields: ['settings', 'updatedBy'],
2932
hooks: false,
3033
limit: 1,
3134
});

app/routes/user/user.js

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -260,9 +260,15 @@ router.route('/')
260260
// Create transaction
261261
transaction = await db.transaction();
262262
// Create user
263-
const createdUser = await db.models.user.create(req.body, {transaction});
263+
const createdUser = await db.models.user.create({
264+
...req.body,
265+
updatedBy: req.user.id,
266+
}, {transaction});
264267
// Create user metadata
265-
await db.models.userMetadata.create({userId: createdUser.id}, {transaction});
268+
await db.models.userMetadata.create({
269+
userId: createdUser.id,
270+
updatedBy: req.user.id,
271+
}, {transaction});
266272
// Commit changes
267273
await transaction.commit();
268274
// Return new user
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
const TABLE = 'reports_small_mutations';
2+
3+
module.exports = {
4+
async up(queryInterface, Sequelize) {
5+
await queryInterface.addColumn(TABLE, 'exon', {
6+
type: Sequelize.TEXT,
7+
});
8+
},
9+
10+
async down(queryInterface) {
11+
await queryInterface.removeColumn(TABLE, 'exon');
12+
},
13+
};
Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
const {v4: uuidv4} = require('uuid');
2+
3+
module.exports = {
4+
up: async (queryInterface) => {
5+
await queryInterface.sequelize.transaction(async (transaction) => {
6+
const reports = await queryInterface.sequelize.query(
7+
`
8+
SELECT id, seq_qc
9+
FROM reports
10+
WHERE seq_qc IS NOT NULL;
11+
`,
12+
{
13+
type: queryInterface.sequelize.QueryTypes.SELECT,
14+
transaction,
15+
},
16+
);
17+
18+
const now = new Date();
19+
const rows = [];
20+
21+
for (const report of reports) {
22+
for (const seqQCItem of report.seq_qc) {
23+
rows.push({
24+
ident: uuidv4(),
25+
created_at: now,
26+
updated_at: now,
27+
report_id: report.id,
28+
reads: seqQCItem.Reads,
29+
bio_qc: seqQCItem.bioQC,
30+
lab_qc: seqQCItem.labQC,
31+
sample: seqQCItem.Sample,
32+
library: seqQCItem.Library,
33+
coverage: seqQCItem.Coverage,
34+
input_ng: seqQCItem.Input_ng,
35+
input_ug: seqQCItem.Input_ug,
36+
protocol: seqQCItem.Protocol,
37+
sample_name: seqQCItem['Sample Name'],
38+
duplicate_reads_perc: seqQCItem.Duplicate_Reads_Perc,
39+
});
40+
}
41+
}
42+
43+
if (rows.length !== 0) {
44+
await queryInterface.bulkInsert('reports_seqqc', rows, {transaction});
45+
}
46+
47+
await queryInterface.removeColumn('reports', 'seq_qc', {transaction});
48+
});
49+
},
50+
51+
down: async (queryInterface, Sq) => {
52+
await queryInterface.sequelize.transaction(async (transaction) => {
53+
await queryInterface.addColumn('reports', 'seq_qc', {
54+
type: Sq.JSONB,
55+
defaultValue: null,
56+
}, {transaction});
57+
58+
await queryInterface.sequelize.query(`
59+
WITH restored_seq_qc AS (
60+
SELECT
61+
report_id,
62+
jsonb_agg(jsonb_build_object(
63+
'Reads', reads,
64+
'bioQC', bio_qc,
65+
'labQC', lab_qc,
66+
'Sample', sample,
67+
'Library', library,
68+
'Coverage', coverage,
69+
'Input_ng', input_ng,
70+
'Input_ug', input_ug,
71+
'Protocol', protocol,
72+
'Sample Name', sample_name,
73+
'Duplicate_Reads_Perc', duplicate_reads_perc
74+
)) AS seq_qc
75+
FROM reports_seqqc
76+
GROUP BY report_id
77+
)
78+
UPDATE reports r
79+
SET seq_qc = restored_seq_qc.seq_qc
80+
FROM restored_seq_qc
81+
WHERE r.id = restored_seq_qc.report_id;
82+
`, {transaction});
83+
84+
await queryInterface.sequelize.query(`
85+
DELETE FROM reports_seqqc rs
86+
USING reports r
87+
WHERE rs.report_id = r.id
88+
AND r.seq_qc IS NOT NULL;
89+
`, {transaction});
90+
});
91+
},
92+
};

test/routes/user/settings.test.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ describe('/user/settings', () => {
6868
where: {userId: testUser.id},
6969
});
7070
expect(results.length).toBe(1);
71+
expect(results[0].updatedBy).toBe(testUser.id);
7172
});
7273
});
7374
});

test/routes/user/user.test.js

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,13 +46,17 @@ beforeAll(async () => {
4646
// Tests for user related endpoints
4747
describe('/user', () => {
4848
let testUser;
49+
let managerUser;
4950
let adminGroup;
5051

5152
beforeAll(async () => {
5253
// get test user
5354
testUser = await db.models.user.findOne({
5455
where: {username},
5556
});
57+
managerUser = await db.models.user.findOne({
58+
where: {username: managerUsername},
59+
});
5660
adminGroup = await db.models.userGroup.findOne({
5761
where: {name: 'admin'},
5862
});
@@ -162,6 +166,16 @@ describe('/user', () => {
162166
})
163167
.expect(HTTP_STATUS.CREATED);
164168

169+
const createdUser = await db.models.user.findOne({
170+
where: {ident: res.body.ident},
171+
});
172+
const createdMetadata = await db.models.userMetadata.findOne({
173+
where: {userId: createdUser.id},
174+
});
175+
176+
expect(createdUser.updatedBy).toBe(testUser.id);
177+
expect(createdMetadata.updatedBy).toBe(testUser.id);
178+
165179
// Remove test user from db
166180
await db.models.user.destroy({where: {ident: res.body.ident}, force: true});
167181
});
@@ -180,6 +194,16 @@ describe('/user', () => {
180194
})
181195
.expect(HTTP_STATUS.CREATED);
182196

197+
const createdUser = await db.models.user.findOne({
198+
where: {ident: res.body.ident},
199+
});
200+
const createdMetadata = await db.models.userMetadata.findOne({
201+
where: {userId: createdUser.id},
202+
});
203+
204+
expect(createdUser.updatedBy).toBe(managerUser.id);
205+
expect(createdMetadata.updatedBy).toBe(managerUser.id);
206+
183207
// Remove test user from db
184208
await db.models.user.destroy({where: {ident: res.body.ident}, force: true});
185209
});

0 commit comments

Comments
 (0)