diff --git a/src/backend/api/index.js b/src/backend/api/index.js index 5ffa25a..7e3761c 100644 --- a/src/backend/api/index.js +++ b/src/backend/api/index.js @@ -4,11 +4,11 @@ import postings from './postings'; import sponsors from './sponsors'; // Import entire folder to bind to sponsor URL router section. import upload from './file-upload/upload'; import geeseInfo from './geese-info'; -import openingsDescription from './openings-description'; import newsletter from './newsletter_recipient'; import blogs from './blogs'; import geeseFeatures from './geese-features'; import products from './products'; +import pageDescriptions from './page-descriptions' const router = express.Router(); @@ -17,10 +17,11 @@ router.use('/postings', postings); router.use('/sponsors', sponsors); router.use('/upload', upload); router.use('/geese-info', geeseInfo); -router.use('/openings-description', openingsDescription); router.use('/newsletter', newsletter); router.use('/blogs', blogs); router.use('/geese-features', geeseFeatures); router.use('/products', products) +router.use('/page-descriptions', pageDescriptions) + export default router; diff --git a/src/backend/api/openings-description/index.js b/src/backend/api/openings-description/index.js deleted file mode 100644 index e169409..0000000 --- a/src/backend/api/openings-description/index.js +++ /dev/null @@ -1,40 +0,0 @@ -import express from 'express'; - -import db from '../../db'; - -const router = express.Router(); - -router.get('/', (req, res) => { - db.openingsDescription - .getDescriptions() - .then((data) => { - const result = { - active: data[0], - nonActive: data[1], - }; - res.status(200).json(result); - }) - .catch((err) => { - res.status(500).json({ message: err }); - }); -}); - -router.patch('/', (req, res) => { - const { active, nonActive } = req.body; - Promise.all([ - db.openingsDescription.updateDescription(true, active), - db.openingsDescription.updateDescription(false, nonActive), - ]) - .then((data) => { - const result = { - active: data[0][0], - nonActive: data[1][0], - }; - res.status(200).json(result); - }) - .catch((err) => { - res.status(500).json({ message: err }); - }); -}); - -export default router; diff --git a/src/backend/api/page-descriptions/add.js b/src/backend/api/page-descriptions/add.js new file mode 100644 index 0000000..cfe4c06 --- /dev/null +++ b/src/backend/api/page-descriptions/add.js @@ -0,0 +1,15 @@ +import db from '../../db'; + +export default (req, res) => { + const pageDescription = req.body; + db.pageDescriptions.addPageDescription(pageDescription) + .then((response) => { + if (response) { + res.send(response); + } + }) + .catch((err) => { + console.log(`Could not add page description: ${err}`); + res.sendStatus(500); + }); +} diff --git a/src/backend/api/page-descriptions/get.js b/src/backend/api/page-descriptions/get.js new file mode 100644 index 0000000..4ed602d --- /dev/null +++ b/src/backend/api/page-descriptions/get.js @@ -0,0 +1,20 @@ +import db from '../../db'; +import * as R from 'ramda'; + +export default (req, res) => { + const { key } = req.params; + + db.pageDescriptions + .getPageDescriptionByKey(key) + .then((pageDescription) => { + if (R.isEmpty(pageDescription)) { + res.sendStatus(404); + } else { + res.send(pageDescription); + } + }) + .catch((err) => { + console.log(`Could not get page description with given key: ${err}`); + res.sendStatus(500); + }); +}; diff --git a/src/backend/api/page-descriptions/index.js b/src/backend/api/page-descriptions/index.js new file mode 100644 index 0000000..bb652c4 --- /dev/null +++ b/src/backend/api/page-descriptions/index.js @@ -0,0 +1,27 @@ +import express from 'express'; +import { param, body, check} from 'express-validator'; +import validationCheck from '../../utils/validation-check'; +import passArg from '../../utils/pass-arg'; +import { validateRequest } from '../../google-auth'; + +import get from './get'; +import add from './add'; +import update from './update'; + +const router = express.Router(); + +router.post('/', [ + body('key').exists(), + body('title').exists(), +], validationCheck, validateRequest, add); + +router.get('/:key', [ + param('key').isString() + ], validationCheck, get); + +router.patch('/:key', [ + param('key').isString(), + body('title').exists(), +], validationCheck, validateRequest, update); + +export default router; diff --git a/src/backend/api/page-descriptions/update.js b/src/backend/api/page-descriptions/update.js new file mode 100644 index 0000000..8260b14 --- /dev/null +++ b/src/backend/api/page-descriptions/update.js @@ -0,0 +1,16 @@ +import db from '../../db'; + +export default (req, res) => { + const pageDescription = req.body; + const key = req.params.key + + db.pageDescriptions.updatePageDescriptionByKey(key, pageDescription) + .then((response) => { + console.log(response); + res.sendStatus(200); + }) + .catch((err) => { + console.log(`Could not update page description: ${err}`); + res.sendStatus(500); + }); +}; diff --git a/src/backend/api/sponsors/description/get.js b/src/backend/api/sponsors/description/get.js deleted file mode 100644 index 10fd6b2..0000000 --- a/src/backend/api/sponsors/description/get.js +++ /dev/null @@ -1,12 +0,0 @@ -import db from '../../../db'; - -export default (req, res) => { - db.sponsors.getSponsorDesc() - .then((desc) => { - res.send(desc); - }) - .catch((err) => { - console.log(err); - res.sendStatus(500); - }); -} diff --git a/src/backend/api/sponsors/description/update.js b/src/backend/api/sponsors/description/update.js deleted file mode 100644 index 9ef4626..0000000 --- a/src/backend/api/sponsors/description/update.js +++ /dev/null @@ -1,22 +0,0 @@ -import db from '../../../db'; -import * as R from 'ramda'; - -export default (req, res) => { - const data = req.body; - - // Checks if there's an empty body in the request: Workaround for express-validator.js not being able to check for this. - if (R.isEmpty(data)) { - res.sendStatus(400); - return; - } - - db.sponsors.updateSponsorDesc(data) - .then((response) => { - console.log(response); - res.sendStatus(200); - }) - .catch((err) => { - console.log(`Could not update sponsor description: ${err}`); - res.sendStatus(500); - }); -} diff --git a/src/backend/api/sponsors/index.js b/src/backend/api/sponsors/index.js index 6627f2f..e4a0750 100644 --- a/src/backend/api/sponsors/index.js +++ b/src/backend/api/sponsors/index.js @@ -11,25 +11,12 @@ import getSponsors from './get-sponsors'; import add from './add'; import update from './update'; import del from './del'; -import getDesc from './description/get'; -import updateDesc from './description/update'; const router = express.Router(); // Sponsor tiers. router.get('/tiers', getTiers); -// Sponsor page description -router.get('/description', getDesc); - -router.patch('/description', [ - // Required - body('title').isString(), - body('description').isString(), - body('images').isArray() - -], validationCheck, updateDesc); - // Sponsors router.get('/', getSponsors); diff --git a/src/backend/api/team-descriptors/description/get.js b/src/backend/api/team-descriptors/description/get.js deleted file mode 100644 index 5fe4d6a..0000000 --- a/src/backend/api/team-descriptors/description/get.js +++ /dev/null @@ -1,13 +0,0 @@ -import db from '../../../db'; - -export default (req, res) => { - db.teamDescriptors - .getTeamDesc() - .then((response) => { - res.send(response).status(200); - }) - .catch((err) => { - console.log(err); - res.sendStatus(500); - }); -}; diff --git a/src/backend/api/team-descriptors/description/update.js b/src/backend/api/team-descriptors/description/update.js deleted file mode 100644 index 618aa73..0000000 --- a/src/backend/api/team-descriptors/description/update.js +++ /dev/null @@ -1,23 +0,0 @@ -import db from '../../../db'; -import * as R from 'ramda'; - -export default (req, res) => { - const data = req.body; - - // Checks if there's an empty body in the request: Workaround for express-validator.js not being able to check for this. - if (R.isEmpty(data)) { - res.sendStatus(400); - return; - } - - db.teamDescriptors - .updateTeamDesc(data) - .then((response) => { - console.log(response); - res.sendStatus(200); - }) - .catch((err) => { - console.log(`Could not update team description: ${err}`); - res.sendStatus(500); - }); -}; diff --git a/src/backend/api/team-descriptors/index.js b/src/backend/api/team-descriptors/index.js index b1bb8d1..e8a8c1c 100644 --- a/src/backend/api/team-descriptors/index.js +++ b/src/backend/api/team-descriptors/index.js @@ -3,8 +3,6 @@ import { param, body } from 'express-validator'; import validationCheck from '../../utils/validation-check'; import { validateRequest } from '../../google-auth'; -import getDesc from './description/get'; -import updateDesc from './description/update'; import getAll from './get-all'; import add from './add'; import update from './update'; @@ -12,22 +10,6 @@ import del from './del'; const router = express.Router(); -/* TEAMS PAGE DESCRIPTION */ - -router.get('/description', getDesc); - -router.patch( - '/description', - [ - body('title').isString(), - body('description').isString(), - body('images').isArray(), - ], - validationCheck, - validateRequest, - updateDesc, -); - /* TEAMS */ router.get('/', getAll); diff --git a/src/backend/db/index.js b/src/backend/db/index.js index 7c562fa..ace3dc7 100644 --- a/src/backend/db/index.js +++ b/src/backend/db/index.js @@ -5,12 +5,12 @@ import teamDescriptors from './team-descriptors'; import postings from './postings'; import sponsors from './sponsors'; import geeseInfo from './geese-info'; -import openingsDescription from './openings-description'; import featurePermissions from './feature-permissions'; import newsletterRecipients from './newsletter-recipient'; import blogs from './blogs'; import geeseFeatures from './geese-features'; import products from './products' +import pageDescriptions from './page-descriptions'; export default { users: { @@ -28,9 +28,6 @@ export default { geeseInfo: { ...geeseInfo(db), }, - openingsDescription: { - ...openingsDescription(db), - }, newsletterRecipients: { ...newsletterRecipients(db), }, @@ -45,5 +42,8 @@ export default { }, products: { ...products(db), + }, + pageDescriptions: { + ...pageDescriptions(db) } }; diff --git a/src/backend/db/openings-description.js b/src/backend/db/openings-description.js deleted file mode 100644 index 579b072..0000000 --- a/src/backend/db/openings-description.js +++ /dev/null @@ -1,18 +0,0 @@ -const getDescriptions = (db) => () => - db.select(['heading', 'body']).from('openings_description'); - -const updateDescription = (db) => (active, changes) => - db('openings_description') - .where({ active }) - .update(changes) - .then(() => - db - .select('heading', 'body') - .from('openings_description') - .where({ active }) - ); - -export default (db) => ({ - getDescriptions: getDescriptions(db), - updateDescription: updateDescription(db), -}); diff --git a/src/backend/db/page-descriptions.js b/src/backend/db/page-descriptions.js new file mode 100644 index 0000000..443b37b --- /dev/null +++ b/src/backend/db/page-descriptions.js @@ -0,0 +1,51 @@ +import { + toPageDescription, + fromPageDescription, +} from '../models/page-descriptions'; +import * as R from 'ramda'; + +const getPageDescriptionByKey = (db) => (key) => + db('page_descriptions') + .where({ key }) + .then((res) => { + return R.isEmpty(res) ? res : toPageDescription(res[0]); + }) + .catch((err) => { + console.error(`Error in getPageDescriptionByKey: ${err}`); + throw err; + }); + +const addPageDescription = (db) => (pageDescription) => + db('page_descriptions') + .insert(fromPageDescription(pageDescription)) + .returning('id') + .then((response) => { + return response; + }) + .catch((err) => { + console.error(`Error in addPageDescription: ${err}`); + throw err; + }); + +const updatePageDescriptionByKey = (db) => (key, pageDescription) => + db('page_descriptions') + .where({ + key, + }) + .update({ + ...fromPageDescription(pageDescription), + }) + .then((response) => { + return response; + }) + .catch((err) => { + console.error(`Error in updatePageDescriptionByKey: ${err}`); + throw err; + }); + + +export default (db) => ({ + getPageDescriptionByKey: getPageDescriptionByKey(db), + addPageDescription: addPageDescription(db), + updatePageDescriptionByKey: updatePageDescriptionByKey(db), + }); \ No newline at end of file diff --git a/src/backend/db/sponsors.js b/src/backend/db/sponsors.js index 42f0988..b168346 100644 --- a/src/backend/db/sponsors.js +++ b/src/backend/db/sponsors.js @@ -114,51 +114,6 @@ const deleteSponsorById = (db) => (id) => db('sponsors') throw err; }); -/**SPONSOR DESCRIPTION API ENDPOINTS */ -const getSponsorDesc = (db) => () => db('sponsor_desc') - .where({ id: 1 }) - .first() // There should only be one entry in this table and it's id should be 1 - .then((res) => { - let images; // images array is stored as string in database, convert back to array: - try { - const resImages = res.images - if (typeof resImages === 'string') { - images = JSON.parse(res.images); - } else if (typeof resImages === 'object') { // If array already - images = resImages; - } - } catch (_) { - // Empty array in database is stringified to something that isn't JSON for some reason. - images = []; - } - - let body = { - ...res, - images: images - }; - delete body.id; // Since we should only have 1 entry. - return toSponsorDesc(body); - }) - .catch(err => { - console.error(`Error in getSponsorDesc: ${err}`); - throw err; - }); - -const updateSponsorDesc = (db) => (data) => db('sponsor_desc') - .update({ - ...data, - images: JSON.stringify(data.images) - }) - .where({ - id: 1, // There is only one item - }) - .then((response) => { - console.log(response); - return response; - }).catch(err => { - console.error(`Error in updateSponsorDesc: ${err}`); - throw err; - }); export default (db) => ({ getSponsorTiers: getSponsorTiers(db), @@ -167,8 +122,5 @@ export default (db) => ({ getSponsorsWithTierName: getSponsorsWithTierName(db), addSponsor: addSponsor(db), updateSponsorById: updateSponsorById(db), - deleteSponsorById: deleteSponsorById(db), - - getSponsorDesc: getSponsorDesc(db), - updateSponsorDesc: updateSponsorDesc(db) + deleteSponsorById: deleteSponsorById(db) }); diff --git a/src/backend/db/team-descriptors.js b/src/backend/db/team-descriptors.js index 6d305b3..b1a2886 100644 --- a/src/backend/db/team-descriptors.js +++ b/src/backend/db/team-descriptors.js @@ -36,63 +36,10 @@ const deleteTeamDescriptorById = (db) => (teamDescriptorId) => teamDescriptorId ); -/* TEAMS DESCRIPTION API ENDPOINTS */ - -const getTeamDesc = (db) => () => - db("team_desc") - .where({ id: 1 }) - .first() // There should only be one entry in this table and it's id should be 1 - .then((res) => { - let images; // images array is stored as string in database, convert back to array: - try { - const resImages = res.images; - if (typeof resImages === "string") { - images = JSON.parse(res.images); - } else if (typeof resImages === "object") { - // If array already - images = resImages; - } - } catch (_) { - // Empty array in database is stringified to something that isn't JSON for some reason. - images = []; - } - - let body = { - ...res, - images: images, - }; - delete body.id; // Since we should only have 1 entry. - console.log(res) - return toTeamDesc(body); - }) - .catch((err) => { - console.error(`Error in getTeamDesc: ${err}`); - throw err; - }); - -const updateTeamDesc = (db) => (data) => - db("team_desc") - .update({ - ...data, - images: JSON.stringify(data.images), - }) - .where({ - id: 1, // There is only one item - }) - .then((response) => { - console.log(response); - return response; - }) - .catch((err) => { - console.error(`Error in updateTeamDesc: ${err}`); - throw err; - }); export default (db) => ({ getTeamDescriptors: getTeamDescriptors(db), addTeamDescriptor: addTeamDescriptor(db), updateTeamDescriptorById: updateTeamDescriptorById(db), deleteTeamDescriptorById: deleteTeamDescriptorById(db), - getTeamDesc: getTeamDesc(db), - updateTeamDesc: updateTeamDesc(db), }); diff --git a/src/backend/migrations/20210324214004_openings-descriptions-table.js b/src/backend/migrations/20210324214004_openings-descriptions-table.js deleted file mode 100644 index 7c0e7c6..0000000 --- a/src/backend/migrations/20210324214004_openings-descriptions-table.js +++ /dev/null @@ -1,8 +0,0 @@ -exports.up = (knex) => - knex.schema.createTable('openings_description', (table) => { - table.string('heading'); - table.text('body'); - table.boolean('active'); - }); - -exports.down = (knex) => knex.schema.dropTableIfExists('openings_description'); diff --git a/src/backend/migrations/20210508110244_sponsor_desc.js b/src/backend/migrations/20210508110244_sponsor_desc.js deleted file mode 100644 index 3a27012..0000000 --- a/src/backend/migrations/20210508110244_sponsor_desc.js +++ /dev/null @@ -1,15 +0,0 @@ -const { onUpdateTrigger } = require('../knexfile'); - -exports.up = (knex) => knex.schema.createTable("sponsor_desc", table => { - table.increments('id'); // For SQLite date auto-update trigger. - table.string("title").notNullable(); - table.string("description", 5000); // Raw HTML for rich text support. - table.json("images"); - - table.timestamps(true, true); // Add created_at and updated_at columns. -}) -.then(() => knex.raw(onUpdateTrigger('sponsor_desc'))) - -exports.down = function(knex) { - return knex.schema.dropTableIfExists("sponsor_desc") -}; diff --git a/src/backend/migrations/20210710143647_team_desc.js b/src/backend/migrations/20210710143647_team_desc.js deleted file mode 100644 index 5245d08..0000000 --- a/src/backend/migrations/20210710143647_team_desc.js +++ /dev/null @@ -1,16 +0,0 @@ -const { onUpdateTrigger } = require('../knexfile'); - -exports.up = (knex) => - knex.schema - .createTable('team_desc', (table) => { - table.increments('id'); // For SQLite date auto-update trigger. - table.string('title').notNullable(); - table.string('description', 5000); // Raw HTML for rich text support. - table.json('images'); - - table.timestamps(true, true); // Add created_at and updated_at columns. - }) - -exports.down = function (knex) { - return knex.schema.dropTableIfExists('team_desc'); -}; diff --git a/src/backend/migrations/20240325204145_page_descriptions.js b/src/backend/migrations/20240325204145_page_descriptions.js new file mode 100644 index 0000000..c91ac61 --- /dev/null +++ b/src/backend/migrations/20240325204145_page_descriptions.js @@ -0,0 +1,18 @@ +exports.up = function(knex) { + return knex.schema.hasTable('page_descriptions').then(function(exists) { + if (!exists) { + return knex.schema.createTable('page_descriptions', (table) => { + table.increments('id'); + table.string('key').notNullable(); + table.string('title').notNullable(); + table.string('description', 5000); + table.json('images'); + table.datetime('updated_at', { useTz: false }); + }); + } + }); +}; + +exports.down = function(knex) { + return knex.schema.dropTableIfExists('page_descriptions'); +}; diff --git a/src/backend/models/page-descriptions.js b/src/backend/models/page-descriptions.js new file mode 100644 index 0000000..e0f699d --- /dev/null +++ b/src/backend/models/page-descriptions.js @@ -0,0 +1,17 @@ +import renameProps from '../utils/rename-props'; +import {parseTimeForResponse} from '../utils/db-dates'; + +// from frontend +export const fromPageDescription = (pageDescription) => renameProps(pageDescription, { + updatedAt: 'updated_at' + }); + +// to frontend +export const toPageDescription = (toPageDescription) => ({ + ...renameProps(toPageDescription, { + updated_at: 'updatedAt' + }), + updatedAt: parseTimeForResponse(toPageDescription.updated_at) +}); + + diff --git a/src/backend/models/team-descriptors.js b/src/backend/models/team-descriptors.js index 7dac490..ed3010a 100644 --- a/src/backend/models/team-descriptors.js +++ b/src/backend/models/team-descriptors.js @@ -7,9 +7,3 @@ export const toTeamDescriptor = (teamDescriptor) => }); export const toTeamDescriptors = R.map(toTeamDescriptor); - -export const toTeamDesc = (desc) => - renameProps(desc, { - created_at: 'createdAt', - updated_at: 'updatedAt', - }); diff --git a/src/backend/seeds/06_sponsor_desc.js b/src/backend/seeds/06_sponsor_desc.js deleted file mode 100644 index 4cc4b13..0000000 --- a/src/backend/seeds/06_sponsor_desc.js +++ /dev/null @@ -1,12 +0,0 @@ -const { ENV_IS_STAGING_OR_PROD } = require("../knexfile"); - -exports.seed = function(knex) { - // Deletes ALL existing entries - if (ENV_IS_STAGING_OR_PROD) return Promise.resolve(); - return knex('sponsor_desc').del() - .then(() => { - return knex('sponsor_desc').insert([ - { id: 1, title: "", description: "", images: JSON.stringify([])} - ]); - }); -}; diff --git a/src/backend/seeds/08_team-desc.js b/src/backend/seeds/08_team-desc.js deleted file mode 100644 index 08760fc..0000000 --- a/src/backend/seeds/08_team-desc.js +++ /dev/null @@ -1,13 +0,0 @@ -const { ENV_IS_STAGING_OR_PROD } = require('../knexfile'); - -exports.seed = function (knex) { - // Deletes ALL existing entries - if (ENV_IS_STAGING_OR_PROD) return Promise.resolve(); - return knex('team_desc') - .del() - .then(() => { - return knex('team_desc').insert([ - { id: 1, title: ' ', description: ' ', images: JSON.stringify([]) }, - ]); - }); -}; diff --git a/src/backend/seeds/13_page_descriptions.js b/src/backend/seeds/13_page_descriptions.js new file mode 100644 index 0000000..64ce351 --- /dev/null +++ b/src/backend/seeds/13_page_descriptions.js @@ -0,0 +1,38 @@ +const { parseTimeFromRequest } = require('../utils/db-dates'); +const { ENV_IS_STAGING_OR_PROD } = require('../knexfile'); + +if (!ENV_IS_STAGING_OR_PROD) { + exports.seed = function (knex) { + return knex('page_descriptions') + .del() + .then(() => { + return knex('page_descriptions').insert([ + { + key: 'sponsors', + title: 'Page title 1', + description: 'Page desc 1', + images: JSON.stringify([]), + updated_at: parseTimeFromRequest(Date.now()), + }, + { + key: 'openings', + title: 'Page title 2', + description: 'Page desc 2', + images: JSON.stringify([]), + updated_at: parseTimeFromRequest(Date.now()), + }, + { + key: 'team', + title: 'Page title 3', + description: 'Page desc 3', + images: JSON.stringify([]), + updated_at: parseTimeFromRequest(Date.now()), + }, + ]); + }); + }; +} else { + exports.seed = function (knex) { + return Promise.resolve(); + }; +} diff --git a/src/backend/tests/integration/page-descriptions.test.js b/src/backend/tests/integration/page-descriptions.test.js new file mode 100644 index 0000000..f9726cb --- /dev/null +++ b/src/backend/tests/integration/page-descriptions.test.js @@ -0,0 +1,158 @@ +process.env.NODE_ENV = 'test'; +import chai from 'chai'; +import chaiHttp from 'chai-http'; +import app from '../../index'; +import { db } from '../../db'; + +chai.use(chaiHttp); +const expect = chai.expect; + +describe('Page Description Routes', () => { +// Rollback migrations. + before('migrate', async function () { + this.timeout(60 * 1000); // Resetting the DB can take a few seconds + await db.migrate.rollback(); + return db.migrate.latest(); + }); + + beforeEach('reseed', async function () { + this.timeout(60 * 1000); // Resetting the DB can take a few seconds + return db.seed.run(); + }); + + // Rollback migration again. + after(async function() { + this.timeout(60 * 1000); // Resetting the DB can take a few seconds + return db.migrate.rollback(); + }); + + describe('GET /api/page-descriptions/sponsors', () => { + it('should return page description info when called', done => { + chai + .request(app) + .get('/api/page-descriptions/sponsors') + .end((err, res) => { + if (res.error.text) { + console.error(res.error.text); + done(res.error.text); + } + expect(res).to.have.status(200); + expect(res.body).to.have.keys(['id', 'key', 'title', 'description', 'images', 'updatedAt']) + }); + done(); + }) + }); + + describe('POST /api/page-descriptions/', () => { + it('should add post to the database if data is in proper format', (done) => { + chai + .request(app) + .post('/api/page-descriptions') + .send({ + key: 'sponsors', + title: 'Page title 1', + description: 'Page desc 1', + }) + .end((err, res) => { + if (err) { + console.error(err); + } + expect(res).to.have.status(200); + + chai.request(app) + .get(`/api/page-descriptions/sponsors`) + .end((err, res) => { + if (res.error.text) { + console.error(res.error.text); + } + expect(res).to.have.status(200); + expect(res.body).to.have.property('id') + expect(res.body).to.have.property('key', 'sponsors') + expect(res.body).to.have.property('title', 'Page title 1') + expect(res.body).to.have.property('description', 'Page desc 1') + expect(res.body).to.have.property('updatedAt') + done(); + }) + + }); + }); + + it('should return 400 with no input supplied', (done) => { + chai + .request(app) + .post('/api/page-descriptions') + .end((err, res) => { + expect(res).to.have.status(400); + done(); + }); + }); + }); + + it('should return 400 with some required inputs not provided', done => { + chai.request(app) + .post('/api/page-descriptions/') + .send({ + key: 'test' + }) + .end((err, res) => { + expect(res).to.have.status(400); + done(); + }); + }); + + describe('PATCH /api/page-descriptions/key', () => { + it('should update the entry with "id" to match the new body', async () => { + return chai.request(app) + .patch(`/api/page-descriptions/sponsors`) + .send({ + key: 'sponsors', + title: 'Updated title', + description: 'Updated description', + }) + .then((res) => { + if (res.error.text) { + console.error(res.error.text); + } + expect(res).to.have.status(200); + return chai.request(app) + .get(`/api/page-descriptions/sponsors`) + .then((res2) => { + if (res2.error.text) { + console.error(res.error.text); + } + expect(res2).to.have.status(200); + expect(res2.body).to.have.property('id'); + expect(res2.body).to.have.property('key', 'sponsors'); + expect(res2.body).to.have.property('title', 'Updated title'); + expect(res2.body).to.have.property('description', 'Updated description'); + expect(res2.body).to.have.property('updatedAt'); + }); + }); + }); + + it('should return 404 if an key is not provided', done => { + chai.request(app) + .patch('/api/page-descriptions/') + .send({ + key: 'sponsors', + title: 'Updated title', + description: 'Updated description', + }) + .end((err, res) => { + expect(res).to.have.status(404); + done(); + }); + }); + + it('should return 400 when body is missing', done => { + chai.request(app) + .patch('/api/page-descriptions/sponsors') + .end((err, res) => { + expect(res).to.have.status(400); + done(); + }); + }); + }); + +}); + diff --git a/src/backend/tests/integration/sponsors.test.js b/src/backend/tests/integration/sponsors.test.js index 70d854e..32a1b1a 100644 --- a/src/backend/tests/integration/sponsors.test.js +++ b/src/backend/tests/integration/sponsors.test.js @@ -284,85 +284,4 @@ describe('Sponsor Routes', () => { }); }); }); - - /**SPONSOR DESCRIPTION API ENDPOINT */ - describe('GET /api/sponsors/description', () => { - it('should return page description entries when called', done => { - chai - .request(app) - .get('/api/sponsors/description') - .end((err, res) => { - expect(res).to.have.status(200); - if (res.error.text) { - console.error(res.error.text); - } - const sponsorDescription = res.body; - expect(sponsorDescription).to.have.keys([ - 'title', - 'description', - 'images', - 'createdAt', - 'updatedAt' - ]); - done(); - }); - }); - }); - - describe('PATCH /api/sponsors/description', () => { - it('should update page description entries when called', done => { - chai - .request(app) - .patch('/api/sponsors/description') - .send({ - title: 'This is a title updated', - description: 'This is a description updated', - images: ['image1.png', 'image2.png', 'image3.png'] - }) - .end((err, res) => { - expect(res).to.have.status(200); - if (res.error.text) { - console.error(res.error.text); - } - - chai.request(app) - .get('/api/sponsors/description') - .end((err2, res2) => { - expect(res2).to.have.status(200); - if (res2.error.text) { - console.error(res2.error.text); - } - - expect(res2.body).to.deep.include({ - title: 'This is a title updated', - description: 'This is a description updated', - images: ['image1.png', 'image2.png', 'image3.png'] - }); - done(); - }); - }); - }); - - it('should return 400 when body is missing', done => { - chai.request(app) - .patch('/api/sponsors/description') - .end((err, res) => { - expect(res).to.have.status(400); - done(); - }); - }); - - it('should return 400 when body is incomplete', done => { - chai.request(app) - .patch('/api/sponsors/description') - .send({ - title: 'This is a title updated', - images: ['image1.png', 'image2.png', 'image3.png'] - }) - .end((err, res) => { - expect(res).to.have.status(400); - done(); - }); - }); - }); }); diff --git a/src/backend/tests/integration/team-descriptors.test.js b/src/backend/tests/integration/team-descriptors.test.js index a96a379..b31e387 100644 --- a/src/backend/tests/integration/team-descriptors.test.js +++ b/src/backend/tests/integration/team-descriptors.test.js @@ -203,91 +203,4 @@ describe('Team Descriptor Routes', () => { }); }); }); - - /* TEAMS DESCRIPTION API ENDPOINT */ - - describe('GET /api/team-descriptors/description', () => { - it('should return page description entries when called', (done) => { - chai - .request(app) - .get('/api/team-descriptors/description') - .end((err, res) => { - expect(res).to.have.status(200); - if (res.error.text) { - console.error(res.error.text); - } - const teamDescription = res.body; - expect(teamDescription).to.have.keys([ - 'title', - 'description', - 'images', - 'updatedAt', - 'createdAt' - ]); - done(); - }); - }); - }); - - describe('PATCH /api/team-descriptors/description', () => { - it('should update page description entries when called', (done) => { - chai - .request(app) - .patch('/api/team-descriptors/description') - .send({ - title: 'This is a title updated', - description: 'This is a description updated', - images: ['image1.png', 'image2.png', 'image3.png'], - }) - .end((err, res) => { - if (res.error.text) { - console.error(res.error.text); - } - expect(res).to.have.status(200); - - chai - .request(app) - .get('/api/team-descriptors/description') - .end((err2, res2) => { - expect(res2).to.have.status(200); - if (res2.error.text) { - console.error(res2.error.text); - } - - expect(res2.body).to.have.property('updatedAt'); - expect(res2.body).to.have.property('createdAt'); - expect(res2.body).to.deep.include({ - title: 'This is a title updated', - description: 'This is a description updated', - images: ['image1.png', 'image2.png', 'image3.png'], - }); - done(); - }); - }); - }); - - it('should return 400 when body is missing', (done) => { - chai - .request(app) - .patch('/api/team-descriptors/description') - .end((err, res) => { - expect(res).to.have.status(400); - done(); - }); - }); - - it('should return 400 when body is incomplete', (done) => { - chai - .request(app) - .patch('/api/team-descriptors/description') - .send({ - title: 'This is a title updated', - images: ['image1.png', 'image2.png', 'image3.png'], - }) - .end((err, res) => { - expect(res).to.have.status(400); - done(); - }); - }); - }); }); diff --git a/src/frontend/api/index.js b/src/frontend/api/index.js index 85e794e..5d4eb11 100644 --- a/src/frontend/api/index.js +++ b/src/frontend/api/index.js @@ -3,7 +3,6 @@ import postings from './postings'; import server from './server'; import teams from './teams'; import formUpload from './formUpload'; -import openingsDescription from './openings-description'; import sponsors from './sponsors'; import geeseInfo from './geese-info'; import blogs from './blogs'; @@ -14,7 +13,6 @@ export default { sponsors: sponsors(server), teams: teams(server), formUpload: formUpload(server), - openingsDescription: openingsDescription(server), geeseInfo: geeseInfo(server), - blogs: blogs(server) + blogs: blogs(server), }; diff --git a/src/frontend/api/openings-description.js b/src/frontend/api/openings-description.js deleted file mode 100644 index b3fb32c..0000000 --- a/src/frontend/api/openings-description.js +++ /dev/null @@ -1,10 +0,0 @@ -const getDescriptions = (server) => () => - server.get('/api/openings-description'); - -const updateDescriptions = (server) => (data) => - server.patch(`/api/openings-description`, data); - -export default (server) => ({ - updateDescriptions: updateDescriptions(server), - getDescriptions: getDescriptions(server), -}); diff --git a/src/frontend/api/sponsors.js b/src/frontend/api/sponsors.js index b2533e9..333deed 100644 --- a/src/frontend/api/sponsors.js +++ b/src/frontend/api/sponsors.js @@ -1,8 +1,5 @@ const getSponsorTiers = (server) => () => server.get(`/api/sponsors/tiers`); -const getSponsorDesc = (server) => () => server.get(`/api/sponsors/description`); -const updateSponsorDesc = (server) => (data) => server.patch(`/api/sponsors/description`, data); - //const getSponsors = (server) => () => server.get(`/api/sponsors/`); const getSponsors = (server) => (joinTierName = false) => server.get(`/api/sponsors${joinTierName ? '?joinTierName=true' : ''}`); @@ -13,8 +10,6 @@ const deleteSponsor = (server) => (id) => server.delete(`/api/sponsors/${id}`); export default (server) => ({ getSponsorTiers: getSponsorTiers(server), - getSponsorDesc: getSponsorDesc(server), - updateSponsorDesc: updateSponsorDesc(server), getSponsors: getSponsors(server), addSponsor: addSponsor(server), updateSponsor: updateSponsor(server), diff --git a/src/frontend/api/teams.js b/src/frontend/api/teams.js index 14694dd..8d15fd9 100644 --- a/src/frontend/api/teams.js +++ b/src/frontend/api/teams.js @@ -9,17 +9,9 @@ const updateTeam = (server) => (data, id) => const deleteTeam = (server) => (id) => server.delete(`/api/team-descriptors/${id}`); -const getTeamDesc = (server) => () => - server.get("/api/team-descriptors/description"); - -const updateTeamDesc = (server) => (data) => - server.patch("/api/team-descriptors/description", data); - export default (server) => ({ getTeams: getTeams(server), addTeam: addTeam(server), updateTeam: updateTeam(server), deleteTeam: deleteTeam(server), - getTeamDesc: getTeamDesc(server), - updateTeamDesc: updateTeamDesc(server), }); diff --git a/src/frontend/hooks/sponsors.js b/src/frontend/hooks/sponsors.js index b9a0150..282e1ba 100644 --- a/src/frontend/hooks/sponsors.js +++ b/src/frontend/hooks/sponsors.js @@ -15,7 +15,7 @@ const useSponsors = () => { async () => { try { const sponsorTiers = await api.sponsors.getSponsorTiers(); - const sponsorDesc = await api.sponsors.getSponsorDesc(); + const sponsorDesc = await api.pageDescriptions.getDescription('sponsors'); const joinTierName = true; const response = await api.sponsors.getSponsors(joinTierName); diff --git a/src/frontend/hooks/teams.js b/src/frontend/hooks/teams.js index ec7bf4d..2d6aa3e 100644 --- a/src/frontend/hooks/teams.js +++ b/src/frontend/hooks/teams.js @@ -13,7 +13,7 @@ const useTeams = () => { const getTeams = useCallback(async () => { try { const teams = await api.teams.getTeams(); - const teamDesc = await api.teams.getTeamDesc(); + const teamDesc = await api.pageDescriptions.getDescription('team'); return { teams: teams.data, diff --git a/src/frontend/pages/postings/forms/EditOpeningsForm.js b/src/frontend/pages/postings/forms/EditOpeningsForm.js index d54ba25..db8af91 100644 --- a/src/frontend/pages/postings/forms/EditOpeningsForm.js +++ b/src/frontend/pages/postings/forms/EditOpeningsForm.js @@ -56,13 +56,32 @@ const EditOpeningsForm = () => { }); useEffect(() => { - api.openingsDescription.getDescriptions().then((data) => { + api.pageDescriptions.getDescription('openings-active').then((data) => { + console.log('active', data.data); if (!R.isEmpty(data.data)) { - setformData(data.data); + setformData((prev) => ({ + ...prev, + active: { + heading: data.data.title, + body: data.data.description, + }, + })); + } + }); + + api.pageDescriptions.getDescription('openings-non-active').then((data) => { + console.log('non-active', data.data); + if (!R.isEmpty(data.data)) { + setformData((prev) => ({ + ...prev, + nonActive: { + heading: data.data.title, + body: data.data.description, + }, + })); } }); }, []); - const onChange = (type, name) => (text) => { const newState = { ...formData, @@ -76,8 +95,8 @@ const EditOpeningsForm = () => { }; const saveForm = () => { - api.openingsDescription - .updateDescriptions(formData) + api.pageDescriptions + .editDescription('openings', formData) .then(() => history.push('/postings')); }; diff --git a/src/frontend/pages/sponsors/hooks/sponsor-desc.js b/src/frontend/pages/sponsors/hooks/sponsor-desc.js index 518a16b..01d4d2a 100644 --- a/src/frontend/pages/sponsors/hooks/sponsor-desc.js +++ b/src/frontend/pages/sponsors/hooks/sponsor-desc.js @@ -209,7 +209,7 @@ const useSponsorDescForm = (input = {}) => { images: imgStrings, }; - const res = await api.sponsors.updateSponsorDesc(data); + const res = await api.pageDescriptions.editDescription('sponsors', data); if (res.status !== 200) { throw new Error(res.data); diff --git a/src/frontend/pages/team-descriptions/hooks/team-desc.js b/src/frontend/pages/team-descriptions/hooks/team-desc.js index 97f6039..d40be37 100644 --- a/src/frontend/pages/team-descriptions/hooks/team-desc.js +++ b/src/frontend/pages/team-descriptions/hooks/team-desc.js @@ -193,7 +193,7 @@ const useTeamDescForm = (input = {}) => { images: imgStrings, }; - await api.teams.updateTeamDesc(data); + await api.pageDescriptions.editDescription('team', data); // onSuccess: closeForm();