Skip to content

Commit

Permalink
feat: persist user feedback until marked as resolved (#1583)
Browse files Browse the repository at this point in the history
This will enable people to report issues with examples.
  • Loading branch information
aalemayhu authored Aug 24, 2024
1 parent 2e3e303 commit c1bb3c7
Show file tree
Hide file tree
Showing 4 changed files with 42 additions and 7 deletions.
15 changes: 15 additions & 0 deletions migrations/20240820194742_add-feedback-table.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
module.exports.up = (knex) => {
return knex.schema.createTable('feedback', (table) => {
table.increments('id').primary();
table.string('name').notNullable();
table.string('email').notNullable();
table.text('message').notNullable();
table.json('attachments');
table.boolean('is_acknowledged').defaultTo(false);
table.timestamp('created_at').defaultTo(knex.fn.now());
});
};

module.exports.down = (knex) => {
return knex.schema.dropTable('feedback');
};
14 changes: 7 additions & 7 deletions src/controllers/IndexController/IndexController.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,10 @@
import express from 'express';

import { getIndexFileContents } from './getIndexFileContents';
import { getDatabase } from '../../data_layer';
import AuthenticationService from '../../services/AuthenticationService';
import TokenRepository from '../../data_layer/TokenRepository';
import UsersRepository from '../../data_layer/UsersRepository';
import { configureUserLocal } from '../../routes/middleware/configureUserLocal';
import { useDefaultEmailService } from '../../services/EmailService/EmailService';
import { getIndexFileContents } from './getIndexFileContents';

class IndexController {
public getIndex(request: express.Request, response: express.Response) {
Expand All @@ -28,13 +26,15 @@ class IndexController {
}

const attachments = req.files as Express.Multer.File[];
const defaultEmailService = useDefaultEmailService();
await defaultEmailService.sendContactEmail(
const database = getDatabase();

await database('feedback').insert({
name,
email,
message,
attachments
);
attachments: JSON.stringify(attachments.map((a) => a.path)),
});

return res.status(200).send();
}
}
Expand Down
19 changes: 19 additions & 0 deletions src/lib/storage/jobs/helpers/deleteOldUploads.ts
Original file line number Diff line number Diff line change
Expand Up @@ -44,8 +44,27 @@ const deleteDanglingUploads = async (db: Knex, storage: StorageHandler) => {
}
};

const deleteResolvedFeedbackAttachments = async (
db: Knex,
storage: StorageHandler
) => {
const resolvedFeedback = await db('feedback')
.select('attachments')
.where('is_acknowledged', true);

for (const feedback of resolvedFeedback) {
const attachments = JSON.parse(feedback.attachments);
for (const attachment of attachments) {
await storage.delete(attachment);
}
}

await db('feedback').where('is_acknowledged', true).delete();
};

export default async function deleteOldUploads(db: Knex) {
const storage = new StorageHandler();
await deleteNonSubScriberUploads(db, storage);
await deleteDanglingUploads(db, storage);
await deleteResolvedFeedbackAttachments(db, storage);
}
1 change: 1 addition & 0 deletions src/routes/DefaultRouter.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import IndexController from '../controllers/IndexController/IndexController';

const upload = multer({
limits: { fileSize: 25 * 1024 * 1024 },
dest: process.env.FEEDBACK_DIR || '~/',
});

const DefaultRouter = () => {
Expand Down

0 comments on commit c1bb3c7

Please sign in to comment.