diff --git a/backend/package.json b/backend/package.json index f6b66b07e..786fe6641 100644 --- a/backend/package.json +++ b/backend/package.json @@ -69,6 +69,7 @@ "helmet": "~3.22.0", "ioredis": "^4.16.1", "jsonwebtoken": "~8.5.1", + "languagedetect": "^2.0.0", "linkifyjs": "~2.1.8", "lodash": "~4.17.14", "merge-graphql-schemas": "^1.7.7", diff --git a/backend/src/middleware/index.js b/backend/src/middleware/index.js index 83b0104ec..0ad8cb1ae 100644 --- a/backend/src/middleware/index.js +++ b/backend/src/middleware/index.js @@ -14,6 +14,7 @@ import notifications from './notifications/notificationsMiddleware' import hashtags from './hashtags/hashtagsMiddleware' import email from './email/emailMiddleware' import sentry from './sentryMiddleware' +import languages from './languages/languages' export default (schema) => { const middlewares = { @@ -30,6 +31,7 @@ export default (schema) => { softDelete, includedFields, orderBy, + languages, } let order = [ @@ -39,6 +41,7 @@ export default (schema) => { // 'activityPub', disabled temporarily 'validation', 'sluggify', + 'languages', 'excerpt', 'email', 'notifications', diff --git a/backend/src/middleware/languages/languages.js b/backend/src/middleware/languages/languages.js new file mode 100644 index 000000000..64471969e --- /dev/null +++ b/backend/src/middleware/languages/languages.js @@ -0,0 +1,24 @@ +import LanguageDetect from 'languagedetect' + +const setPostLanguage = (text) => { + console.log(text) + const lngDetector = new LanguageDetect() + lngDetector.setLanguageType('iso2') + const result = lngDetector.detect(text, 2) + console.log(result) + return result[0][0] +} + +export default { + Mutation: { + CreatePost: async (resolve, root, args, context, info) => { + console.log('CreatePost, language', args) + args.language = await setPostLanguage(args.content) + return resolve(root, args, context, info) + }, + UpdatePost: async (resolve, root, args, context, info) => { + args.language = await setPostLanguage(args.content) + return resolve(root, args, context, info) + }, + }, +} diff --git a/backend/src/middleware/languages/languages.spec.js b/backend/src/middleware/languages/languages.spec.js new file mode 100644 index 000000000..8eba5eccd --- /dev/null +++ b/backend/src/middleware/languages/languages.spec.js @@ -0,0 +1,74 @@ +import Factory, { cleanDatabase } from '../../db/factories' +import { gql } from '../../helpers/jest' +import { getNeode, getDriver } from '../../db/neo4j' +import createServer from '../../server' +import { createTestClient } from 'apollo-server-testing' + + +let mutate +let authenticatedUser +let variables + +const driver = getDriver() +const neode = getNeode() + +beforeAll(async () => { + const { server } = createServer({ + context: () => { + return { + driver, + neode, + user: authenticatedUser, + } + }, + }) + mutate = createTestClient(server).mutate + await cleanDatabase() + variables = {} + const user = await Factory.build('user') + authenticatedUser = await user.toJson() + await Factory.build('category', { + id: 'cat9', + name: 'Democracy & Politics', + icon: 'university', + }) +}) + + +afterAll(async () => { + //await cleanDatabase() +}) + + +const createPostMutation = gql` + mutation($title: String!, $content: String!, $categoryIds: [ID]) { + CreatePost(title: $title, content: $content, categoryIds: $categoryIds) { + language + } + } +` + +describe('languagesMiddleware', () => { + variables = { + title: 'Test post languages', + categoryIds: ['cat9'], + } + + it('detects German', async () => { + variables = { + ...variables, + content: 'Jeder sollte vor seiner eigenen Tür kehren.', + } + await expect(mutate({ + mutation: createPostMutation, + variables, + })).resolves.toMatchObject({ + data: { + CreatePost: { + language: 'de', + }, + }, + }) + }) + +}) diff --git a/backend/yarn.lock b/backend/yarn.lock index 0bbc62515..7d6558da0 100644 --- a/backend/yarn.lock +++ b/backend/yarn.lock @@ -6302,6 +6302,11 @@ knuth-shuffle-seeded@^1.0.6: dependencies: seed-random "~2.2.0" +languagedetect@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/languagedetect/-/languagedetect-2.0.0.tgz#4b8fa2b7593b2a3a02fb1100891041c53238936c" + integrity sha512-AZb/liiQ+6ZoTj4f1J0aE6OkzhCo8fyH+tuSaPfSo8YHCWLFJrdSixhtO2TYdIkjcDQNaR4RmGaV2A5FJklDMQ== + latest-version@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-3.1.0.tgz#a205383fea322b33b5ae3b18abee0dc2f356ee15"