diff --git a/test/api/v3/integration/content/GET-content.test.js b/test/api/v3/integration/content/GET-content.test.js index 0dbd2779e4..439667be9f 100644 --- a/test/api/v3/integration/content/GET-content.test.js +++ b/test/api/v3/integration/content/GET-content.test.js @@ -1,6 +1,7 @@ import { requester, translate as t, + generateUser, } from '../../../../helpers/api-integration/v3'; import i18n from '../../../../../website/common/script/i18n'; @@ -56,4 +57,28 @@ describe('GET /content', () => { const res = await requester().get('/content?filter=backgroundsFlat,invalid'); expect(res).to.not.have.property('backgroundsFlat'); }); + + describe('authenticated user', () => { + let user; + it('returns content in user\'s preferred language when no language parameter is provided', async () => { + user = await generateUser({ 'preferences.language': 'de' }); + const res = await user.get('/content'); + expect(res).to.have.nested.property('backgrounds.backgrounds062014.beach'); + expect(res.backgrounds.backgrounds062014.beach.text).to.equal(i18n.t('backgroundBeachText', 'de')); + }); + + it('respects language parameter over user\'s preferred language', async () => { + user = await generateUser({ 'preferences.language': 'de' }); + const res = await user.get('/content?language=fr'); + expect(res).to.have.nested.property('backgrounds.backgrounds062014.beach'); + expect(res.backgrounds.backgrounds062014.beach.text).to.equal(i18n.t('backgroundBeachText', 'fr')); + }); + + it('falls back to English if user\'s preferred language is invalid', async () => { + user = await generateUser({ 'preferences.language': 'invalid_lang' }); + const res = await user.get('/content'); + expect(res).to.have.nested.property('backgrounds.backgrounds062014.beach'); + expect(res.backgrounds.backgrounds062014.beach.text).to.equal(t('backgroundBeachText')); + }); + }); }); diff --git a/website/server/controllers/api-v3/content.js b/website/server/controllers/api-v3/content.js index ed8a79d782..e48b79fb1c 100644 --- a/website/server/controllers/api-v3/content.js +++ b/website/server/controllers/api-v3/content.js @@ -1,6 +1,7 @@ import nconf from 'nconf'; import { langCodes } from '../../libs/i18n'; import { serveContent } from '../../libs/content'; +import { authWithHeaders } from '../../middlewares/auth'; const IS_PROD = nconf.get('IS_PROD'); @@ -66,12 +67,21 @@ api.getContent = { method: 'GET', url: '/content', noLanguage: true, + middlewares: [authWithHeaders({ optional: true })], async handler (req, res) { let language = 'en'; const proposedLang = req.query.language; if (proposedLang && langCodes.includes(proposedLang)) { language = proposedLang; + } else if (res.locals.user + && res.locals.user.preferences + && res.locals.user.preferences.language + ) { + const userLang = res.locals.user.preferences.language; + if (langCodes.includes(userLang)) { + language = userLang; + } } let filter = req.query.filter || '';