Add Posthog tracking + fix extension download + doc
This commit is contained in:
@@ -44,3 +44,15 @@ Fall back to Grep/Glob/Read **only** when the graph doesn't cover what you need.
|
|||||||
2. Use `detect_changes` for code review.
|
2. Use `detect_changes` for code review.
|
||||||
3. Use `get_affected_flows` to understand impact.
|
3. Use `get_affected_flows` to understand impact.
|
||||||
4. Use `query_graph` pattern="tests_for" to check coverage.
|
4. Use `query_graph` pattern="tests_for" to check coverage.
|
||||||
|
|
||||||
|
## Local environment / running tests
|
||||||
|
|
||||||
|
- `.env` holds **production** credentials (o2switch host, real DB name/password). Never load it for local runs or tests.
|
||||||
|
- `.env.local` holds the local dev DB credentials (`DB_HOST=127.0.0.1`, `DB_USER=convert_user`, `DB_NAME=file_converter`, `DB_PASSWORD=change_me`). This is what local testing should use.
|
||||||
|
- `src/config.js` uses `dotenv/config`, which only loads `.env` and does not override variables already present in `process.env`. There's no vitest/dotenv wiring that picks up `.env.local` automatically.
|
||||||
|
- To run tests locally without touching prod config, pass the `.env.local` values as inline env vars so they take precedence before `dotenv/config` runs, e.g.:
|
||||||
|
```
|
||||||
|
DB_HOST=127.0.0.1 DB_USER=convert_user DB_PASSWORD=change_me DB_NAME=file_converter STORAGE_DIR=./storage PORT=3000 npx vitest run
|
||||||
|
```
|
||||||
|
- A local MariaDB is expected to already be running on `127.0.0.1:3306` with the `file_converter` DB and `convert_user` credentials seeded.
|
||||||
|
- Known pre-existing failures unrelated to any fix: `test/cleanup.test.js` ("deletes an expired pending job...") and `test/jobs/jobRepository.test.js` ("finds expired jobs and allows deleting them") — both fail on `main` independent of other changes (looks like a clock/timezone mismatch around `expiresAt` comparisons, not yet root-caused). Don't assume a change caused these; verify against `main` first if they show up again.
|
||||||
|
|||||||
@@ -9,5 +9,14 @@
|
|||||||
<body>
|
<body>
|
||||||
<div id="root"></div>
|
<div id="root"></div>
|
||||||
<script type="module" src="/src/main.jsx"></script>
|
<script type="module" src="/src/main.jsx"></script>
|
||||||
|
<script>
|
||||||
|
!function(t,e){var o,n,p,r;e.__SV||(window.posthog && window.posthog.__loaded)||(window.posthog=e,e._i=[],e.init=function(i,s,a){function g(t,e){var o=e.split(".");2==o.length&&(t=t[o[0]],e=o[1]),t[e]=function(){t.push([e].concat(Array.prototype.slice.call(arguments,0)))}}(p=t.createElement("script")).type="text/javascript",p.crossOrigin="anonymous",p.async=!0,p.src=s.api_host.replace(".i.posthog.com","-assets.i.posthog.com")+"/static/array.js",(r=t.getElementsByTagName("script")[0]).parentNode.insertBefore(p,r);var u=e;for(void 0!==a?u=e[a]=[]:a="posthog",u.people=u.people||[],u.toString=function(t){var e="posthog";return"posthog"!==a&&(e+="."+a),t||(e+=" (stub)"),e},u.people.toString=function(){return u.toString(1)+".people (stub)"},o="Ji Yi init fn mn Hr pn bn cn capture calculateEventProperties Sn register register_once register_for_session unregister unregister_for_session Tn getFeatureFlag getFeatureFlagPayload getFeatureFlagResult getAllFeatureFlags isFeatureEnabled reloadFeatureFlags updateFlags updateEarlyAccessFeatureEnrollment getEarlyAccessFeatures on onFeatureFlags onSurveysLoaded onSessionId getSurveys getActiveMatchingSurveys renderSurvey displaySurvey cancelPendingSurvey canRenderSurvey canRenderSurveyAsync Mn identify setPersonProperties unsetPersonProperties group resetGroups setPersonPropertiesForFlags resetPersonPropertiesForFlags setGroupPropertiesForFlags resetGroupPropertiesForFlags reset shutdown setIdentity clearIdentity get_distinct_id getGroups get_session_id get_session_replay_url alias set_config startSessionRecording stopSessionRecording sessionRecordingStarted captureException addExceptionStep captureLog startExceptionAutocapture stopExceptionAutocapture loadToolbar get_property getSessionProperty Cn xn createPersonProfile setInternalOrTestUser In hn Pn opt_in_capturing opt_out_capturing has_opted_in_capturing has_opted_out_capturing get_explicit_consent_status is_capturing clear_opt_in_out_capturing debug Ur Rt getPageViewId captureTraceFeedback captureTraceMetric an".split(" "),n=0;n<o.length;n++)g(u,o[n]);e._i.push([i,s,a])},e.__SV=1)}(document,window.posthog||[]);
|
||||||
|
posthog.init('phc_vSCpFEHuGgHiqRNEHZ5agwNxQdSgY4gNTtht8kiAjuMG', {
|
||||||
|
cookieless_mode: "always",
|
||||||
|
api_host: 'https://eu.i.posthog.com',
|
||||||
|
defaults: '2026-05-30',
|
||||||
|
person_profiles: 'identified_only', // or 'always' to create profiles for anonymous users as well
|
||||||
|
})
|
||||||
|
</script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
+2
-1
@@ -147,8 +147,9 @@ export function createApp(config, pool) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const filePath = outputPath(config, job.id, job.targetFormat);
|
const filePath = outputPath(config, job.id, job.targetFormat);
|
||||||
|
const downloadFilename = `${path.parse(job.originalFilename).name}.${job.targetFormat}`;
|
||||||
res.set('Content-Type', job.outputMimeType);
|
res.set('Content-Type', job.outputMimeType);
|
||||||
res.set('Content-Disposition', contentDispositionHeader(job.originalFilename));
|
res.set('Content-Disposition', contentDispositionHeader(downloadFilename));
|
||||||
fs.createReadStream(filePath).pipe(res);
|
fs.createReadStream(filePath).pipe(res);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -57,7 +57,7 @@ describe('end-to-end: image family', () => {
|
|||||||
const downloadResponse = await request(app).get(`/api/jobs/${id}/download`);
|
const downloadResponse = await request(app).get(`/api/jobs/${id}/download`);
|
||||||
expect(downloadResponse.status).toBe(200);
|
expect(downloadResponse.status).toBe(200);
|
||||||
expect(downloadResponse.headers['content-type']).toBe('image/webp');
|
expect(downloadResponse.headers['content-type']).toBe('image/webp');
|
||||||
expect(downloadResponse.headers['content-disposition']).toContain('photo.png');
|
expect(downloadResponse.headers['content-disposition']).toContain('photo.webp');
|
||||||
}, 20000);
|
}, 20000);
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -82,7 +82,7 @@ describe('end-to-end: document family', () => {
|
|||||||
const downloadResponse = await request(app).get(`/api/jobs/${id}/download`);
|
const downloadResponse = await request(app).get(`/api/jobs/${id}/download`);
|
||||||
expect(downloadResponse.status).toBe(200);
|
expect(downloadResponse.status).toBe(200);
|
||||||
expect(downloadResponse.headers['content-type']).toBe('application/pdf');
|
expect(downloadResponse.headers['content-type']).toBe('application/pdf');
|
||||||
expect(downloadResponse.headers['content-disposition']).toContain('report.docx');
|
expect(downloadResponse.headers['content-disposition']).toContain('report.pdf');
|
||||||
|
|
||||||
await fs.unlink(docxPath);
|
await fs.unlink(docxPath);
|
||||||
}, 20000);
|
}, 20000);
|
||||||
|
|||||||
@@ -73,7 +73,7 @@ describe('GET /api/jobs/:id/download', () => {
|
|||||||
|
|
||||||
expect(response.status).toBe(200);
|
expect(response.status).toBe(200);
|
||||||
expect(response.headers['content-type']).toBe('image/webp');
|
expect(response.headers['content-type']).toBe('image/webp');
|
||||||
expect(response.headers['content-disposition']).toContain('holiday photo.png');
|
expect(response.headers['content-disposition']).toContain('holiday photo.webp');
|
||||||
expect(response.body ?? response.text).toBeDefined();
|
expect(response.body ?? response.text).toBeDefined();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user