Skip to content

Commit 615d250

Browse files
Auto regenerate data each day
1 parent 01172e3 commit 615d250

File tree

5 files changed

+204
-152
lines changed

5 files changed

+204
-152
lines changed

app/data/session-data-defaults.js

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ const ethnicities = require("./ethnicities");
66
const path = require('path');
77
const fs = require('fs');
88
const dayjs = require('dayjs');
9+
const { needsRegeneration } = require('../lib/utils/regenerate-data');
910

1011
// Check if generated data folder exists and create if needed
1112
const generatedDataPath = path.join(__dirname, 'generated');
@@ -21,24 +22,18 @@ let generationInfo = {
2122
stats: { participants: 0, clinics: 0, events: 0 }
2223
};
2324

24-
// Check if we need to regenerate data
25+
// Load generation info
2526
const generationInfoPath = path.join(generatedDataPath, 'generation-info.json');
26-
let needsRegeneration = true;
27-
2827
if (fs.existsSync(generationInfoPath)) {
2928
try {
3029
generationInfo = JSON.parse(fs.readFileSync(generationInfoPath));
31-
const generatedDate = dayjs(generationInfo.generatedAt).startOf('day');
32-
const today = dayjs().startOf('day');
33-
needsRegeneration = !generatedDate.isSame(today, 'day');
3430
} catch (err) {
3531
console.warn('Error reading generation info:', err);
36-
needsRegeneration = true;
3732
}
3833
}
3934

4035
// Generate or load data
41-
if (needsRegeneration) {
36+
if (needsRegeneration(generationInfo)) {
4237
console.log('Generating new seed data...');
4338
require('../lib/generate-seed-data.js')();
4439

app/lib/utils/regenerate-data.js

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
// app/lib/utils/regenerate-data.js
2+
3+
const generateData = require('../generate-seed-data');
4+
const path = require('path');
5+
const dayjs = require('dayjs');
6+
const fs = require('fs');
7+
8+
async function regenerateData(req) {
9+
// Generate new data
10+
await generateData();
11+
12+
// Clear the require cache for session data defaults
13+
const sessionDataPath = path.resolve(__dirname, '../../data/session-data-defaults.js');
14+
delete require.cache[require.resolve(sessionDataPath)];
15+
16+
// Clear cache for the generated JSON files
17+
const generatedDataPath = path.resolve(__dirname, '../../data/generated');
18+
Object.keys(require.cache).forEach(key => {
19+
if (key.startsWith(generatedDataPath)) {
20+
delete require.cache[key];
21+
}
22+
});
23+
24+
// Read generation info including stats
25+
const generationInfoPath = path.join(generatedDataPath, 'generation-info.json');
26+
let generationInfo = {
27+
generatedAt: new Date().toISOString(),
28+
stats: { participants: 0, clinics: 0, events: 0 }
29+
};
30+
31+
try {
32+
if (fs.existsSync(generationInfoPath)) {
33+
generationInfo = JSON.parse(fs.readFileSync(generationInfoPath));
34+
}
35+
} catch (err) {
36+
console.warn('Error reading generation info:', err);
37+
}
38+
39+
// Reload session data defaults with fresh data and updated generation info
40+
req.session.data = {
41+
...require('../../data/session-data-defaults'),
42+
generationInfo
43+
};
44+
}
45+
46+
function needsRegeneration(generationInfo) {
47+
if (!generationInfo?.generatedAt) return true;
48+
49+
const generatedDate = dayjs(generationInfo.generatedAt).startOf('day');
50+
const today = dayjs().startOf('day');
51+
return !generatedDate.isSame(today, 'day');
52+
}
53+
54+
module.exports = {
55+
regenerateData,
56+
needsRegeneration
57+
};

app/routes.js

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,23 @@
11
// External dependencies
22
const express = require('express');
3+
const { regenerateData, needsRegeneration } = require('./lib/utils/regenerate-data');
34

45
const router = express.Router();
56

7+
// Keep regeneration middleware before other routes
8+
router.use(async (req, res, next) => {
9+
try {
10+
if (needsRegeneration(req.session.data?.generationInfo)) {
11+
console.log('Regenerating data for new day...');
12+
await regenerateData(req);
13+
}
14+
next();
15+
} catch (err) {
16+
console.error('Error checking/regenerating data:', err);
17+
next(err);
18+
}
19+
});
20+
621
require('./routes/settings')(router);
722
require('./routes/clinics')(router);
823

app/routes/settings.js

Lines changed: 3 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -4,34 +4,20 @@ const generateData = require('../lib/generate-seed-data');
44
const dayjs = require('dayjs');
55
const path = require('path');
66
const fs = require('fs');
7+
const { regenerateData } = require('../lib/utils/regenerate-data');
8+
79

810
module.exports = router => {
911

1012
// Handle regenerate data action
1113
router.post('/settings/regenerate', async (req, res) => {
1214
try {
13-
await generateData();
14-
15-
// Clear the require cache for session data defaults and generated data
16-
const sessionDataPath = path.resolve(__dirname, '../data/session-data-defaults.js');
17-
delete require.cache[require.resolve(sessionDataPath)];
18-
19-
// Also clear cache for the generated JSON files
20-
const generatedDataPath = path.resolve(__dirname, '../data/generated');
21-
Object.keys(require.cache).forEach(key => {
22-
if (key.startsWith(generatedDataPath)) {
23-
delete require.cache[key];
24-
}
25-
});
26-
27-
// Now reload session data defaults with fresh data
28-
req.session.data = require('../data/session-data-defaults');
15+
await regenerateData(req);
2916
req.flash('success', 'Data regenerated successfully');
3017
} catch (err) {
3118
console.error('Error regenerating data:', err);
3219
req.flash('error', 'Error regenerating data');
3320
}
34-
3521
res.redirect('/settings');
3622
});
3723

0 commit comments

Comments
 (0)