Skip to content

Commit d5a20aa

Browse files
authored
Merge pull request #24 from demokratie-live/sprint#6/new_webhook
Sprint#6/new webhook
2 parents 21a8e35 + 8dbb304 commit d5a20aa

File tree

7 files changed

+88
-13
lines changed

7 files changed

+88
-13
lines changed

scripts/importAll.js

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,11 @@ import getAllProcedures from '../src/graphql/queries/getAllProcedures';
77

88
require('../src/config/db');
99

10-
const PAGE_SIZE = 20;
11-
1210
(async () => {
1311
console.log('Start Importing');
1412
const { data: { allProcedures } } = await client.query({
1513
query: getAllProcedures,
16-
variables: { pageSize: PAGE_SIZE },
14+
// variables: {},
1715
});
1816
console.log(allProcedures.map(({ procedureId }) => procedureId));
1917
console.log('Start Inserting');

src/graphql/queries/getAllProcedures.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
import gql from 'graphql-tag';
22

33
export default gql`
4-
query allProcedures($pageSize: Int) {
5-
allProcedures(pageSize: $pageSize) {
4+
query allProcedures() {
5+
allProcedures() {
66
title
77
procedureId
88
type
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import gql from 'graphql-tag';
2+
3+
export default gql`
4+
query procedureUpdates($period: [Int!], $type: [String!]) {
5+
procedureUpdates(period: $period, type: $type) {
6+
procedureId
7+
updatedAt
8+
}
9+
}
10+
`;

src/graphql/queries/getProcedures.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
import gql from 'graphql-tag';
22

33
export default gql`
4-
query procedures($pageSize: Int, $IDs: [String!]) {
5-
procedures(pageSize: $pageSize, IDs: $IDs) {
4+
query procedures($IDs: [String!]) {
5+
procedures(IDs: $IDs) {
66
title
77
procedureId
88
type

src/index.js

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import constants from './config/constants';
1212
import typeDefs from './graphql/schemas';
1313
import resolvers from './graphql/resolvers';
1414

15-
import importProcedures from './scripts/import';
15+
import webhook from './scripts/webhook';
1616

1717
// Models
1818
import ProcedureModel from './models/Procedure';
@@ -57,13 +57,16 @@ app.use(constants.GRAPHQL_PATH, (req, res, next) => {
5757
});
5858

5959
app.post('/webhooks/bundestagio/update', async (req, res) => {
60-
const { procedureIds } = req.body;
60+
const { data } = req.body;
6161
try {
62+
const updated = await webhook(data);
6263
res.send({
63-
updated: await importProcedures(procedureIds),
64+
updated,
6465
succeeded: true,
6566
});
67+
console.log(`Updated: ${updated}`);
6668
} catch (error) {
69+
console.log(error);
6770
res.send({
6871
error,
6972
succeeded: false,

src/scripts/import.js

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,11 @@ import client from '../graphql/client';
55
import Procedure from '../models/Procedure';
66
import getProcedures from '../graphql/queries/getProcedures';
77

8-
const PAGE_SIZE = 20;
9-
108
export default async (procedureIds) => {
119
// Start Importing
1210
const { data: { procedures } } = await client.query({
1311
query: getProcedures,
14-
variables: { pageSize: PAGE_SIZE, IDs: procedureIds },
12+
variables: { IDs: procedureIds },
1513
});
1614
// Start Inserting
1715
const promises = await procedures.map(async (bIoProcedure) => {

src/scripts/webhook.js

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
import importProcedures from './import';
2+
import getProcedureUpdates from '../graphql/queries/getProcedureUpdates';
3+
import client from '../graphql/client';
4+
import ProcedureModel from '../models/Procedure';
5+
6+
export default async (data) => {
7+
// Count local Data in groups
8+
const groups = await ProcedureModel.aggregate([{
9+
// Group by Period & Type
10+
$group: {
11+
_id: { period: '$period', type: '$type' },
12+
count: { $sum: 1 },
13+
},
14+
},
15+
{
16+
// Group by Period
17+
$group: {
18+
_id: '$_id.period',
19+
types: { $push: { type: '$_id.type', count: '$count' } },
20+
},
21+
},
22+
{
23+
// Rename _id Field to period
24+
$project: { _id: 0, period: '$_id', types: 1 },
25+
}]);
26+
27+
const update = [];
28+
await Promise.all(data.map(async (d) => {
29+
const period = parseInt(d.period, 10);
30+
const { type, countBefore, changedIds } = d.types.find(t => t.type === 'Gesetzgebung');
31+
const group = groups.find(c => c.period === period);
32+
const localCount = group ? group.types
33+
.find(ct => ct.type === type).count : 0;
34+
// Append Changed IDs
35+
update.concat(changedIds);
36+
// Compare Counts Remote & Local
37+
if (countBefore > localCount) {
38+
// Find remote Procedure Updates
39+
const { data: { procedureUpdates } } = await client.query({
40+
query: getProcedureUpdates,
41+
variables: { period, type },
42+
});
43+
// Find local Procedure Updates
44+
const localProcedureUpdates = await ProcedureModel
45+
.find({ period, type }, { procedureId: 1, lastUpdateDate: 1 });
46+
// Compare
47+
procedureUpdates.forEach((pu) => {
48+
const localData = localProcedureUpdates.find(ld => ld.procedureId === pu.procedureId);
49+
if (!localData || new Date(localData.lastUpdateDate) < new Date(pu.updatedAt)) {
50+
update.push(pu.procedureId);
51+
}
52+
});
53+
}
54+
}));
55+
56+
// Splitt in Chunks & Update
57+
const chunkSize = 100;
58+
let updateCount = 0;
59+
let i = 0;
60+
for (i = 0; i < update.length; i += chunkSize) {
61+
const part = update.slice(i, i + chunkSize);
62+
updateCount += await importProcedures(part); // eslint-disable-line no-await-in-loop
63+
}
64+
65+
return updateCount;
66+
};

0 commit comments

Comments
 (0)