diff --git a/.github/ISSUE_TEMPLATE/devops_ticket.md b/.github/ISSUE_TEMPLATE/devops_ticket.md new file mode 100644 index 000000000..3507e25bb --- /dev/null +++ b/.github/ISSUE_TEMPLATE/devops_ticket.md @@ -0,0 +1,24 @@ +--- +name: :boom: DevOps ticket +about: Help us manage our deployed App. +labels: devops +title: :boom: [DevOps] +--- + +## :fire: DevOps ticket + + +### Motive + + +### Related issues + + +### Implementation + + +### Validation + + +### Additional context + diff --git a/backend/package.json b/backend/package.json index a4b8eb032..22abc010f 100644 --- a/backend/package.json +++ b/backend/package.json @@ -43,7 +43,7 @@ "apollo-client": "~2.6.8", "apollo-link-context": "~1.0.19", "apollo-link-http": "~1.5.16", - "apollo-server": "~2.9.16", + "apollo-server": "~2.10.0", "apollo-server-express": "^2.9.16", "babel-plugin-transform-runtime": "^6.23.0", "bcryptjs": "~2.4.3", @@ -61,8 +61,8 @@ "graphql-middleware": "~4.0.2", "graphql-middleware-sentry": "^3.2.1", "graphql-redis-subscriptions": "^2.1.2", - "graphql-shield": "~7.0.9", - "graphql-tag": "~2.10.2", + "graphql-shield": "~7.0.10", + "graphql-tag": "~2.10.3", "helmet": "~3.21.2", "ioredis": "^4.14.1", "jsonwebtoken": "~8.5.1", @@ -112,7 +112,7 @@ "@babel/plugin-proposal-throw-expressions": "^7.8.3", "@babel/preset-env": "~7.8.4", "@babel/register": "^7.8.3", - "apollo-server-testing": "~2.9.16", + "apollo-server-testing": "~2.10.0", "babel-core": "~7.0.0-0", "babel-eslint": "~10.0.3", "babel-jest": "~25.1.0", diff --git a/backend/yarn.lock b/backend/yarn.lock index eebe5c73b..819b215c5 100644 --- a/backend/yarn.lock +++ b/backend/yarn.lock @@ -1607,10 +1607,10 @@ dependencies: "@types/yargs-parser" "*" -"@types/yup@0.26.29": - version "0.26.29" - resolved "https://registry.yarnpkg.com/@types/yup/-/yup-0.26.29.tgz#5a533ad6f74e442436698e20b1441c68a7a1c931" - integrity sha512-M81oZOgLap0b0I/BySnpLwHjOj1BFxUKV1ytG2Kqj3jmkh8F3H11PEnk658UniftpjTXdueloOL+KZYn+SMQ9w== +"@types/yup@0.26.30": + version "0.26.30" + resolved "https://registry.yarnpkg.com/@types/yup/-/yup-0.26.30.tgz#0d6066505bb67e7b9b161b2082c4cdfcdafd6a6b" + integrity sha512-b/uklO68T/eShWnxjlgwOJlEFOQ11ib3i1wQQiLmHqFJTxDMvz+tb4XzThGQISzOcelMnoSdb1Po4s69YkEQeg== "@types/zen-observable@^0.8.0": version "0.8.0" @@ -1845,10 +1845,10 @@ apollo-client@~2.6.8: tslib "^1.10.0" zen-observable "^0.8.0" -apollo-datasource@^0.6.4: - version "0.6.4" - resolved "https://registry.yarnpkg.com/apollo-datasource/-/apollo-datasource-0.6.4.tgz#c0d1604b1a97e004844d4b61bd819a9a6b0a409f" - integrity sha512-u4eu6Q94q6KuZacZfdo4vCevA81F4QWeTYEXUvoksQMJpiacPHHe0DJrofKVKvxngUp5kCi1RnPXSc6kBY+/oA== +apollo-datasource@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/apollo-datasource/-/apollo-datasource-0.7.0.tgz#2a6d82edb2eba21b4ddf21877009ba39ff821945" + integrity sha512-Yja12BgNQhzuFGG/5Nw2MQe0hkuQy2+9er09HxeEyAf2rUDIPnhPrn1MDoZTB8MU7UGfjwITC+1ofzKkkrZobA== dependencies: apollo-server-caching "^0.5.1" apollo-server-env "^2.4.3" @@ -1860,13 +1860,13 @@ apollo-engine-reporting-protobuf@^0.4.4: dependencies: "@apollo/protobufjs" "^1.0.3" -apollo-engine-reporting@^1.4.14: - version "1.4.14" - resolved "https://registry.yarnpkg.com/apollo-engine-reporting/-/apollo-engine-reporting-1.4.14.tgz#71a6509ebe86385da43df500cd0940525a3e8674" - integrity sha512-cCG9qDOPwbh87ZjQGHgmnP3oPqhqjIZcNmm/lNtWkWXGTlxV/jmUEqpVi+wsDbE5gR7d1OFk6GqSy2ZQh+S+Bw== +apollo-engine-reporting@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/apollo-engine-reporting/-/apollo-engine-reporting-1.5.0.tgz#6e3746de14fc87e14c289c0776a2d350e6f50918" + integrity sha512-Pe2DelijZ2QHqkqv8E97iOb32l+FIMT2nxpQsuH+nWi+96cCFJJJHjm3RLAPEUuvGOgW9dFYQP3J91EyC5O0tQ== dependencies: apollo-engine-reporting-protobuf "^0.4.4" - apollo-graphql "^0.3.7" + apollo-graphql "^0.4.0" apollo-server-caching "^0.5.1" apollo-server-env "^2.4.3" apollo-server-errors "^2.3.4" @@ -1892,10 +1892,10 @@ apollo-errors@^1.9.0: assert "^1.4.1" extendable-error "^0.1.5" -apollo-graphql@^0.3.7: - version "0.3.7" - resolved "https://registry.yarnpkg.com/apollo-graphql/-/apollo-graphql-0.3.7.tgz#533232ed48b0b6dbcf5635f65e66cf8677a5b768" - integrity sha512-ghW16xx9tRcyL38Pw6G5OidMnYn+CNUGZWmvqQgEO2nRy4T0ONPZZBOvGrIMtJQ70oEykNMKGm0zm6PdHdxd8Q== +apollo-graphql@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/apollo-graphql/-/apollo-graphql-0.4.0.tgz#dd0afe31a6241b8e2ded20b906c9ee8dfbe03497" + integrity sha512-abCHcKln1EGbzSItW087EjBI5wnluikyUqEn4VsdeWHCtdENWpHCn/MnM0+jJa1prNasxN7tCukp4nMpJYYVqg== dependencies: apollo-env "^0.6.1" lodash.sortby "^4.7.0" @@ -1943,18 +1943,18 @@ apollo-server-caching@^0.5.1: dependencies: lru-cache "^5.0.0" -apollo-server-core@^2.9.16: - version "2.9.16" - resolved "https://registry.yarnpkg.com/apollo-server-core/-/apollo-server-core-2.9.16.tgz#b4c869a6babfa6906fbbf1e6facf3b7231dbf777" - integrity sha512-4ftdjSfs/3aEare9QNTVSF0yUvXETxiohuDLZ7gmMIQxNnZhUjVXiZL1rYKuIZ12uH7xLvh/DwkXRt6nLG/lZA== +apollo-server-core@^2.10.0, apollo-server-core@^2.9.16: + version "2.10.0" + resolved "https://registry.yarnpkg.com/apollo-server-core/-/apollo-server-core-2.10.0.tgz#b8d51bdffe6529f0e3ca670ee8f1238765cfade4" + integrity sha512-x/UK6XvU307W8D/pzTclU04JIjRarcbg5mFPe0nVmO4OTc26uQgKi1WlZkcewXsAUnn+nDwKVn2c2G3dHEgXzQ== dependencies: "@apollographql/apollo-tools" "^0.4.3" "@apollographql/graphql-playground-html" "1.6.24" "@types/graphql-upload" "^8.0.0" "@types/ws" "^6.0.0" apollo-cache-control "^0.8.11" - apollo-datasource "^0.6.4" - apollo-engine-reporting "^1.4.14" + apollo-datasource "^0.7.0" + apollo-engine-reporting "^1.5.0" apollo-server-caching "^0.5.1" apollo-server-env "^2.4.3" apollo-server-errors "^2.3.4" @@ -1983,10 +1983,10 @@ apollo-server-errors@^2.3.4: resolved "https://registry.yarnpkg.com/apollo-server-errors/-/apollo-server-errors-2.3.4.tgz#b70ef01322f616cbcd876f3e0168a1a86b82db34" integrity sha512-Y0PKQvkrb2Kd18d1NPlHdSqmlr8TgqJ7JQcNIfhNDgdb45CnqZlxL1abuIRhr8tiw8OhVOcFxz2KyglBi8TKdA== -apollo-server-express@^2.9.16: - version "2.9.16" - resolved "https://registry.yarnpkg.com/apollo-server-express/-/apollo-server-express-2.9.16.tgz#4c30b1769426c010b37943c0fb7766e5825973a0" - integrity sha512-ZDc7GP+piUm67alJ0DIE9f36tHcCiNm3PHMLIVJlVE/rcGwzRjV5rardRqeslljQiO2J+1IwXKwJ0/kRrZ4JvQ== +apollo-server-express@^2.10.0, apollo-server-express@^2.9.16: + version "2.10.0" + resolved "https://registry.yarnpkg.com/apollo-server-express/-/apollo-server-express-2.10.0.tgz#7d87ff54e378cdcb135eb3d093f20fca7fc0d1bc" + integrity sha512-adDQts4QmkX2ENU7JibV1EwRl3ESnpnpImXIMvg8Cm7kX2wSbzwm8LecQNujwWJtkAPTCEAcnPBDyKwWjTQ6/g== dependencies: "@apollographql/graphql-playground-html" "1.6.24" "@types/accepts" "^1.3.5" @@ -1994,7 +1994,7 @@ apollo-server-express@^2.9.16: "@types/cors" "^2.8.4" "@types/express" "4.17.2" accepts "^1.3.5" - apollo-server-core "^2.9.16" + apollo-server-core "^2.10.0" apollo-server-types "^0.2.10" body-parser "^1.18.3" cors "^2.8.4" @@ -2012,12 +2012,12 @@ apollo-server-plugin-base@^0.6.10: dependencies: apollo-server-types "^0.2.10" -apollo-server-testing@~2.9.16: - version "2.9.16" - resolved "https://registry.yarnpkg.com/apollo-server-testing/-/apollo-server-testing-2.9.16.tgz#35e9b0b102a11bac8db2fce04281cb43e7993d45" - integrity sha512-CLfYZY2Htwzw6iPlFO32/SNXNstWQsvGd5/FQ8KEwRpNfYM4g0rAE98y/THEQTvTh0xPH+qWxA7CVQcc7/FMbQ== +apollo-server-testing@~2.10.0: + version "2.10.0" + resolved "https://registry.yarnpkg.com/apollo-server-testing/-/apollo-server-testing-2.10.0.tgz#c8d7fc2d4e6eaf84232aaa7c125d9fae691fbcf4" + integrity sha512-wBJ/CT3ZN5nmSySMqgpAFwX/I3yzsQhRGR8MCK/16MjhEZH6svNaJWzoif6gaocj0NyVBJvOIijuMTecG9+6vg== dependencies: - apollo-server-core "^2.9.16" + apollo-server-core "^2.10.0" apollo-server-types@^0.2.10: version "0.2.10" @@ -2028,13 +2028,13 @@ apollo-server-types@^0.2.10: apollo-server-caching "^0.5.1" apollo-server-env "^2.4.3" -apollo-server@~2.9.16: - version "2.9.16" - resolved "https://registry.yarnpkg.com/apollo-server/-/apollo-server-2.9.16.tgz#c0054ed70ecb637cb3f585ff46fb4a060730076f" - integrity sha512-dqB1shkjl9ne7DfSHXDH5sT70llr9zswLL+/g/4zt4/H+k+2pkD1BShQkNIK7PBYcVa8KvRAHXiHTXZ36GCspA== +apollo-server@~2.10.0: + version "2.10.0" + resolved "https://registry.yarnpkg.com/apollo-server/-/apollo-server-2.10.0.tgz#93b924b089f7c4070e88aa29a8b9472c1d5d0f82" + integrity sha512-ITXkklSgrNfohFh4juvHWrtLz/82iw9CkBUW+G5T8NxHaqxm1Lpus1Ck2VsXmCgNplYi6mODRjUl087qdlU2Rw== dependencies: - apollo-server-core "^2.9.16" - apollo-server-express "^2.9.16" + apollo-server-core "^2.10.0" + apollo-server-express "^2.10.0" express "^4.0.0" graphql-subscriptions "^1.0.0" graphql-tools "^4.0.0" @@ -2774,11 +2774,6 @@ clone-response@^1.0.2: dependencies: mimic-response "^1.0.0" -cluster-key-slot@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/cluster-key-slot/-/cluster-key-slot-1.1.0.tgz#30474b2a981fb12172695833052bc0d01336d10d" - integrity sha512-2Nii8p3RwAPiFwsnZvukotvow2rIHM+yQ6ZcBXGHdniadkYGZYiGmkHJIbZPIV9nfv7m/U1IPMVVcAhoWFeklw== - co@^4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" @@ -3259,11 +3254,6 @@ delegates@^1.0.0: resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= -denque@^1.1.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/denque/-/denque-1.4.1.tgz#6744ff7641c148c3f8a69c307e51235c1f4a37cf" - integrity sha512-OfzPuSZKGcgr96rf1oODnfjqBFmr1DVoc/TrItj3Ohe0Ah1C5WX5Baquw/9U9KovnQ88EqmJbD66rKYUQYN1tQ== - depd@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" @@ -4486,21 +4476,12 @@ graphql-middleware@~4.0.2: dependencies: graphql-tools "^4.0.5" -graphql-redis-subscriptions@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/graphql-redis-subscriptions/-/graphql-redis-subscriptions-2.1.2.tgz#9c1b744bace0c6ba99dd0ebafe0148cad1df3301" - integrity sha512-l69KbGxyYfVHxvE+Dzv9/hXg/q+Xnjfx1JsrJD6ikePuSsNaCSNxr+MubSTNF3Gt3C/+JZs4FaWImFeK/+X2og== +graphql-shield@~7.0.10: + version "7.0.10" + resolved "https://registry.yarnpkg.com/graphql-shield/-/graphql-shield-7.0.10.tgz#c25517a07e97bfd74089fde66ea2d2044addf743" + integrity sha512-m1HPQ3DpzuW8b7derWcsjjYtiBk+Hjgb1eL/0YK/Y2A0EV7vDQzJwRzlIwn9My7Xv+F4DJwm25yydnnUNpZt8g== dependencies: - iterall "^1.2.2" - optionalDependencies: - ioredis "^4.6.3" - -graphql-shield@~7.0.9: - version "7.0.9" - resolved "https://registry.yarnpkg.com/graphql-shield/-/graphql-shield-7.0.9.tgz#8248916e9636a7e3c05719a52fd13f2d37ccaeb2" - integrity sha512-2Dfddd2hcObCSqAj64c/Aaxvs7gaoD2QU14crj7H486QjS8jIAtEPUyLVyv8SmJ1ZD7jT6wqx6wrB15Npn5Sgw== - dependencies: - "@types/yup" "0.26.29" + "@types/yup" "0.26.30" object-hash "^2.0.0" yup "^0.28.0" @@ -4511,10 +4492,10 @@ graphql-subscriptions@^1.0.0: dependencies: iterall "^1.2.1" -graphql-tag@^2.9.2, graphql-tag@~2.10.2: - version "2.10.2" - resolved "https://registry.yarnpkg.com/graphql-tag/-/graphql-tag-2.10.2.tgz#e42214d0dde29e8db5d55b0107efdb2d461ed270" - integrity sha512-7rUuJkVGyedBiVJ/hPaxndDnzxANUZ+QhTu0KUzgTGtP3ibY/hSUl9em21aVh5BNMJsmMc4nVuOTBoiAUJ2xBQ== +graphql-tag@^2.9.2, graphql-tag@~2.10.3: + version "2.10.3" + resolved "https://registry.yarnpkg.com/graphql-tag/-/graphql-tag-2.10.3.tgz#ea1baba5eb8fc6339e4c4cf049dabe522b0edf03" + integrity sha512-4FOv3ZKfA4WdOKJeHdz6B3F/vxBLSgmBcGeAFPf4n1F64ltJUvOOerNj0rsJxONQGdhUMynQIvd6LzB+1J5oKA== graphql-tools@^4.0.0, graphql-tools@^4.0.4, graphql-tools@^4.0.5: version "4.0.5" @@ -4939,21 +4920,6 @@ invariant@^2.2.2, invariant@^2.2.4: dependencies: loose-envify "^1.0.0" -ioredis@^4.14.1, ioredis@^4.6.3: - version "4.14.1" - resolved "https://registry.yarnpkg.com/ioredis/-/ioredis-4.14.1.tgz#b73ded95fcf220f106d33125a92ef6213aa31318" - integrity sha512-94W+X//GHM+1GJvDk6JPc+8qlM7Dul+9K+lg3/aHixPN7ZGkW6qlvX0DG6At9hWtH2v3B32myfZqWoANUJYGJA== - dependencies: - cluster-key-slot "^1.1.0" - debug "^4.1.1" - denque "^1.1.0" - lodash.defaults "^4.2.0" - lodash.flatten "^4.4.0" - redis-commands "1.5.0" - redis-errors "^1.2.0" - redis-parser "^3.0.0" - standard-as-callback "^2.0.1" - ip-regex@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-1.0.3.tgz#dc589076f659f419c222039a33316f1c7387effd" @@ -5994,21 +5960,11 @@ lodash.clonedeep@^4.5.0: resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" integrity sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8= -lodash.defaults@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-4.2.0.tgz#d09178716ffea4dde9e5fb7b37f6f0802274580c" - integrity sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw= - lodash.escaperegexp@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz#64762c48618082518ac3df4ccf5d5886dae20347" integrity sha1-ZHYsSGGAglGKw99Mz11YhtriA0c= -lodash.flatten@^4.4.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f" - integrity sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8= - lodash.includes@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/lodash.includes/-/lodash.includes-4.3.0.tgz#60bb98a87cb923c68ca1e51325483314849f553f" @@ -7550,23 +7506,6 @@ realpath-native@^1.1.0: dependencies: util.promisify "^1.0.0" -redis-commands@1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/redis-commands/-/redis-commands-1.5.0.tgz#80d2e20698fe688f227127ff9e5164a7dd17e785" - integrity sha512-6KxamqpZ468MeQC3bkWmCB1fp56XL64D4Kf0zJSwDZbVLLm7KFkoIcHrgRvQ+sk8dnhySs7+yBg94yIkAK7aJg== - -redis-errors@^1.0.0, redis-errors@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/redis-errors/-/redis-errors-1.2.0.tgz#eb62d2adb15e4eaf4610c04afe1529384250abad" - integrity sha1-62LSrbFeTq9GEMBK/hUpOEJQq60= - -redis-parser@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/redis-parser/-/redis-parser-3.0.0.tgz#b66d828cdcafe6b4b8a428a7def4c6bcac31c8b4" - integrity sha1-tm2CjNyv5rS4pCin3vTGvKwxyLQ= - dependencies: - redis-errors "^1.0.0" - referrer-policy@1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/referrer-policy/-/referrer-policy-1.2.0.tgz#b99cfb8b57090dc454895ef897a4cc35ef67a98e" @@ -8264,11 +8203,6 @@ stacktrace-js@^2.0.0: stack-generator "^2.0.1" stacktrace-gps "^3.0.1" -standard-as-callback@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/standard-as-callback/-/standard-as-callback-2.0.1.tgz#ed8bb25648e15831759b6023bdb87e6b60b38126" - integrity sha512-NQOxSeB8gOI5WjSaxjBgog2QFw55FV8TkS6Y07BiB3VJ8xNTvUYm0wl0s8ObgQ5NhdpnNfigMIKjgPESzgr4tg== - static-extend@^0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" diff --git a/cypress/integration/common/steps.js b/cypress/integration/common/steps.js index 5185c09f9..36dbb50d4 100644 --- a/cypress/integration/common/steps.js +++ b/cypress/integration/common/steps.js @@ -311,7 +311,7 @@ Then( cy.visit(route, { failOnStatusCode: false }); - cy.get(".error").should("contain", message); + cy.get(".error-message").should("contain", message); } ); diff --git a/webapp/layouts/error.spec.js b/webapp/layouts/error.spec.js new file mode 100644 index 000000000..95234ec5f --- /dev/null +++ b/webapp/layouts/error.spec.js @@ -0,0 +1,47 @@ +import { config, shallowMount } from '@vue/test-utils' +import Error from './error.vue' + +const localVue = global.localVue + +config.stubs['nuxt-link'] = '' + +describe('error.vue', () => { + let mocks, wrapper + + beforeEach(() => { + mocks = { + $t: jest.fn(key => key), + } + }) + + const Wrapper = (propsData = {}) => { + return shallowMount(Error, { mocks, propsData, localVue }) + } + + describe('shallowMount', () => { + it('renders default error message', () => { + wrapper = Wrapper({ error: {} }) + expect(wrapper.find('.error-message').text()).toBe('error-pages.default') + }) + + it('renders error message to given statusCode', () => { + wrapper = Wrapper({ error: { statusCode: 404 } }) + expect(wrapper.find('.error-message').text()).toBe('error-pages.404-default') + }) + + it('renders error message to given custom key', () => { + wrapper = Wrapper({ error: { statusCode: 404, key: 'my-custom-key' } }) + expect(wrapper.find('.error-message').text()).toBe('my-custom-key') + }) + + it('has a link to index page', () => { + wrapper = Wrapper({ error: {} }) + expect(wrapper.find('span[to="/"]').text()).toBe('error-pages.back-to-index') + }) + + it('has an image related to the status code', () => { + wrapper = Wrapper({ error: { statusCode: 404 } }) + expect(wrapper.find('.error-image').attributes('src')).toBe('/img/svg/errors/error404.svg') + }) + }) +}) diff --git a/webapp/layouts/error.vue b/webapp/layouts/error.vue new file mode 100644 index 000000000..9143a7ff1 --- /dev/null +++ b/webapp/layouts/error.vue @@ -0,0 +1,47 @@ + + + + diff --git a/webapp/locales/de.json b/webapp/locales/de.json index d552d51ba..e3e214d32 100644 --- a/webapp/locales/de.json +++ b/webapp/locales/de.json @@ -821,5 +821,16 @@ "donations-for": "Spenden für", "donate-now": "Jetzt spenden", "amount-of-total": "{amount} von {total} € erreicht" + }, + "error-pages" : { + "profile-not-found": "Dieses Profil konnte nicht gefunden werden", + "back-to-index": "Zurück zur Startseite", + "post-not-found": "Dieser Beitrag konnte nicht gefunden werden", + "cannot-edit-post": "Dieser Beitrag kann nicht editiert werden", + "403-default": "Kein Zugang zu dieser Seite", + "404-default": "Diese Seite konnte nicht gefunden werden", + "500-default": "Internal Server Error", + "503-default": "Dienst steht nicht zur Verfügung", + "default": "Ein Fehler ist aufgetreten" } } diff --git a/webapp/locales/en.json b/webapp/locales/en.json index d15614ecc..5beec4328 100644 --- a/webapp/locales/en.json +++ b/webapp/locales/en.json @@ -821,6 +821,17 @@ "title": "In addition, we regularly hold events where you can also share your impressions and ask questions. You can find a current overview here:", "description": " https://human-connection.org/events/ " } + }, + "error-pages" : { + "profile-not-found": "This profile could not be found", + "back-to-index": "Back to index page", + "post-not-found": "This post could not be found", + "cannot-edit-post": "This post cannot be edited", + "404-default": "This page could not be found", + "403-default": "Not authorized to this page", + "500-default": "Internal Server Error", + "503-default": "Service Unavailable", + "default": "An error occurred" } } diff --git a/webapp/middleware/isAdmin.js b/webapp/middleware/isAdmin.js index 4db10bbb6..12b6c5bac 100644 --- a/webapp/middleware/isAdmin.js +++ b/webapp/middleware/isAdmin.js @@ -1,5 +1,5 @@ export default ({ store, error }) => { if (!store.getters['auth/isAdmin']) { - return error({ statusCode: 403 }) + return error({ statusCode: 403, message: 'error-pages.not-authorized' }) } } diff --git a/webapp/middleware/isModerator.js b/webapp/middleware/isModerator.js index e99793a3e..9b17badea 100644 --- a/webapp/middleware/isModerator.js +++ b/webapp/middleware/isModerator.js @@ -1,5 +1,5 @@ export default ({ store, error }) => { if (!store.getters['auth/isModerator']) { - return error({ statusCode: 403 }) + return error({ statusCode: 403, message: 'error-pages.not-authorized' }) } } diff --git a/webapp/mixins/persistentLinks.js b/webapp/mixins/persistentLinks.js index efc4392e2..ce41251f7 100644 --- a/webapp/mixins/persistentLinks.js +++ b/webapp/mixins/persistentLinks.js @@ -26,7 +26,7 @@ export default function(options = {}) { resource = response.data[Object.keys(response.data)[0]][0] if (resource) return redirect(`/${path}/${resource.id}/${resource.slug}`) - return error({ statusCode: 404, message }) + return error({ statusCode: 404, key: message }) }, } } diff --git a/webapp/package.json b/webapp/package.json index 4ef753134..620a53165 100644 --- a/webapp/package.json +++ b/webapp/package.json @@ -100,7 +100,7 @@ "@babel/plugin-syntax-dynamic-import": "^7.8.3", "@babel/preset-env": "~7.8.4", "@storybook/addon-a11y": "^5.3.12", - "@storybook/addon-actions": "^5.3.10", + "@storybook/addon-actions": "^5.3.12", "@storybook/addon-notes": "^5.3.12", "@storybook/vue": "~5.3.12", "@vue/cli-shared-utils": "~4.1.2", diff --git a/webapp/pages/post/_id.vue b/webapp/pages/post/_id.vue index a02afd3b9..92795606f 100644 --- a/webapp/pages/post/_id.vue +++ b/webapp/pages/post/_id.vue @@ -35,7 +35,7 @@ const options = { } `, path: 'post', - message: 'This post could not be found', + message: 'error-pages.post-not-found', } const persistentLinks = PersistentLinks(options) @@ -55,14 +55,14 @@ export default { }, // TODO implement /* { - name: this.$t('common.letsTalk'), - path: `/post/${id}/${slug}#lets-talk` - }, */ + name: this.$t('common.letsTalk'), + path: `/post/${id}/${slug}#lets-talk` + }, */ // TODO implement /* { - name: this.$t('common.versus'), - path: `/post/${id}/${slug}#versus` - } */ + name: this.$t('common.versus'), + path: `/post/${id}/${slug}#versus` + } */ ], }, { @@ -71,9 +71,9 @@ export default { }, // TODO implement /* { - name: this.$t('common.takeAction'), - path: `/post/${id}/${slug}/take-action` - } */ + name: this.$t('common.takeAction'), + path: `/post/${id}/${slug}/take-action` + } */ ] }, }, diff --git a/webapp/pages/post/edit/_id.vue b/webapp/pages/post/edit/_id.vue index c79d2b70e..d269a04d8 100644 --- a/webapp/pages/post/edit/_id.vue +++ b/webapp/pages/post/edit/_id.vue @@ -38,7 +38,7 @@ export default { variables: { id }, }) if (contribution.author.id !== store.getters['auth/user'].id) { - error({ statusCode: 403, message: "You can't edit that!" }) + error({ statusCode: 403, message: 'error-pages.cannot-edit-post' }) } return { contribution } }, diff --git a/webapp/pages/profile/_id.vue b/webapp/pages/profile/_id.vue index 992e5efce..b9bbef83e 100644 --- a/webapp/pages/profile/_id.vue +++ b/webapp/pages/profile/_id.vue @@ -23,7 +23,7 @@ const options = { } } `, - message: 'This user could not be found', + message: 'error-pages.profile-not-found', path: 'profile', } const persistentLinks = PersistentLinks(options) diff --git a/webapp/static/img/svg/errors/error403.svg b/webapp/static/img/svg/errors/error403.svg new file mode 100644 index 000000000..e52d00a7a --- /dev/null +++ b/webapp/static/img/svg/errors/error403.svg @@ -0,0 +1 @@ + diff --git a/webapp/static/img/svg/errors/error404.svg b/webapp/static/img/svg/errors/error404.svg new file mode 100644 index 000000000..78f019410 --- /dev/null +++ b/webapp/static/img/svg/errors/error404.svg @@ -0,0 +1 @@ + diff --git a/webapp/static/img/svg/errors/error500.svg b/webapp/static/img/svg/errors/error500.svg new file mode 100644 index 000000000..5a95d7bf6 --- /dev/null +++ b/webapp/static/img/svg/errors/error500.svg @@ -0,0 +1 @@ + diff --git a/webapp/static/img/svg/errors/error503.svg b/webapp/static/img/svg/errors/error503.svg new file mode 100644 index 000000000..45b7b0cf7 --- /dev/null +++ b/webapp/static/img/svg/errors/error503.svg @@ -0,0 +1,15 @@ + + + + error503 + Created with Sketch. + + + + + + + + + + diff --git a/webapp/yarn.lock b/webapp/yarn.lock index 8867ccf84..63f1b4bd8 100644 --- a/webapp/yarn.lock +++ b/webapp/yarn.lock @@ -2125,17 +2125,17 @@ ts-dedent "^1.1.0" util-deprecate "^1.0.2" -"@storybook/addon-actions@^5.3.10": - version "5.3.10" - resolved "https://registry.yarnpkg.com/@storybook/addon-actions/-/addon-actions-5.3.10.tgz#08cfaa656a787990260e73e5b556efd903a92dcc" - integrity sha512-k4LT2pMiUm3WljBGWGlMsPVJhmESfLiyos0BV2apLIXEVb0L/O8rEJtZ9GBEab63lZVb4Yxo0yGbGIk6In13bQ== +"@storybook/addon-actions@^5.3.12": + version "5.3.12" + resolved "https://registry.yarnpkg.com/@storybook/addon-actions/-/addon-actions-5.3.12.tgz#024678ddd207f050e42c5f8e20b5064cf9839a38" + integrity sha512-3j6ZJROcH4bm8vpaM2RU/sRdoOLF9DpVWiE6uutlrVEV6eWuexrUAYwSzuF4Pjr1LUWDSDIT9pEES+tHdn9Rww== dependencies: - "@storybook/addons" "5.3.10" - "@storybook/api" "5.3.10" - "@storybook/client-api" "5.3.10" - "@storybook/components" "5.3.10" - "@storybook/core-events" "5.3.10" - "@storybook/theming" "5.3.10" + "@storybook/addons" "5.3.12" + "@storybook/api" "5.3.12" + "@storybook/client-api" "5.3.12" + "@storybook/components" "5.3.12" + "@storybook/core-events" "5.3.12" + "@storybook/theming" "5.3.12" core-js "^3.0.1" fast-deep-equal "^2.0.1" global "^4.3.2" @@ -2177,19 +2177,6 @@ global "^4.3.2" util-deprecate "^1.0.2" -"@storybook/addons@5.3.10": - version "5.3.10" - resolved "https://registry.yarnpkg.com/@storybook/addons/-/addons-5.3.10.tgz#60a969329fdee455a491e95e9f2ed982faa97e65" - integrity sha512-n+cQrXHIiasyqWvthg9y51OCEmjmKWMrX2XQcG1i+9J9RCNkLQ77Tj3LWefT5dJbi77Fa2/TzOShRiQqaaFNiQ== - dependencies: - "@storybook/api" "5.3.10" - "@storybook/channels" "5.3.10" - "@storybook/client-logger" "5.3.10" - "@storybook/core-events" "5.3.10" - core-js "^3.0.1" - global "^4.3.2" - util-deprecate "^1.0.2" - "@storybook/addons@5.3.12": version "5.3.12" resolved "https://registry.yarnpkg.com/@storybook/addons/-/addons-5.3.12.tgz#77fb0e0d3ac9eb70414bff4b03c12bbccfe31716" @@ -2226,32 +2213,6 @@ telejson "^3.0.2" util-deprecate "^1.0.2" -"@storybook/api@5.3.10": - version "5.3.10" - resolved "https://registry.yarnpkg.com/@storybook/api/-/api-5.3.10.tgz#45927f7cbba111842729f85f8f9a38ab2c0d3793" - integrity sha512-vyRpZgMECc0Er1mBsr6o43aZQ3KA2Zin38AQo/5oW7sE+tCsjHSljhxB7+qlrf9FuheU4PWqV4KAKp52WHwFhg== - dependencies: - "@reach/router" "^1.2.1" - "@storybook/channels" "5.3.10" - "@storybook/client-logger" "5.3.10" - "@storybook/core-events" "5.3.10" - "@storybook/csf" "0.0.1" - "@storybook/router" "5.3.10" - "@storybook/theming" "5.3.10" - "@types/reach__router" "^1.2.3" - core-js "^3.0.1" - fast-deep-equal "^2.0.1" - global "^4.3.2" - lodash "^4.17.15" - memoizerific "^1.11.3" - prop-types "^15.6.2" - react "^16.8.3" - semver "^6.0.0" - shallow-equal "^1.1.0" - store2 "^2.7.1" - telejson "^3.2.0" - util-deprecate "^1.0.2" - "@storybook/api@5.3.12": version "5.3.12" resolved "https://registry.yarnpkg.com/@storybook/api/-/api-5.3.12.tgz#7d1ca7a487fb9b6604d26cae756e291015908d35" @@ -2278,17 +2239,6 @@ telejson "^3.2.0" util-deprecate "^1.0.2" -"@storybook/channel-postmessage@5.3.10": - version "5.3.10" - resolved "https://registry.yarnpkg.com/@storybook/channel-postmessage/-/channel-postmessage-5.3.10.tgz#0d5ede72e4057a20b5c2ad5d871134f3cba54b78" - integrity sha512-YHc6FCc9RSpDoYfa1LUGNwHXKx3KjW1m5Q86g86sV8Rnj+guy5atDRSmL2i/OKTONQO4Edp1er+UGFzyUd+a2Q== - dependencies: - "@storybook/channels" "5.3.10" - "@storybook/client-logger" "5.3.10" - core-js "^3.0.1" - global "^4.3.2" - telejson "^3.2.0" - "@storybook/channel-postmessage@5.3.12": version "5.3.12" resolved "https://registry.yarnpkg.com/@storybook/channel-postmessage/-/channel-postmessage-5.3.12.tgz#945c9702f335018f6224af3159bf4d33c66a131e" @@ -2307,13 +2257,6 @@ dependencies: core-js "^3.0.1" -"@storybook/channels@5.3.10": - version "5.3.10" - resolved "https://registry.yarnpkg.com/@storybook/channels/-/channels-5.3.10.tgz#6556b0fbe99bc0234a9a54de3c94e9e1cf55e4e3" - integrity sha512-VbXhwCQ6T7VMhD/YTBqvkWDnnl9CsZLL9MLameM4E+WxLrGpxHIl7sSvJ5av5YPgJPxaNJpPMeVSxdi5u4quxg== - dependencies: - core-js "^3.0.1" - "@storybook/channels@5.3.12": version "5.3.12" resolved "https://registry.yarnpkg.com/@storybook/channels/-/channels-5.3.12.tgz#dd2e111377f0eaafa0e66746cb6628322615ade9" @@ -2321,29 +2264,6 @@ dependencies: core-js "^3.0.1" -"@storybook/client-api@5.3.10": - version "5.3.10" - resolved "https://registry.yarnpkg.com/@storybook/client-api/-/client-api-5.3.10.tgz#74c9c36a62d653f5eb29ceb84c3acbec19aad254" - integrity sha512-bYFgdzsaxdlWlZzNpDqWWLUaX31rc4xHdyy1MJ+dl65AnubPrLacvvqSCVYK+VdRAWHX+T7Bcvt2sRtwka7oEQ== - dependencies: - "@storybook/addons" "5.3.10" - "@storybook/channel-postmessage" "5.3.10" - "@storybook/channels" "5.3.10" - "@storybook/client-logger" "5.3.10" - "@storybook/core-events" "5.3.10" - "@storybook/csf" "0.0.1" - "@types/webpack-env" "^1.15.0" - core-js "^3.0.1" - eventemitter3 "^4.0.0" - global "^4.3.2" - is-plain-object "^3.0.0" - lodash "^4.17.15" - memoizerific "^1.11.3" - qs "^6.6.0" - stable "^0.1.8" - ts-dedent "^1.1.0" - util-deprecate "^1.0.2" - "@storybook/client-api@5.3.12": version "5.3.12" resolved "https://registry.yarnpkg.com/@storybook/client-api/-/client-api-5.3.12.tgz#7c18921d0290b30b020ad7d41fbda170009780bd" @@ -2374,13 +2294,6 @@ dependencies: core-js "^3.0.1" -"@storybook/client-logger@5.3.10": - version "5.3.10" - resolved "https://registry.yarnpkg.com/@storybook/client-logger/-/client-logger-5.3.10.tgz#3f1ab223ccc5389004f76d9cab792083003d1db9" - integrity sha512-WCgXrr44Z8ScDiAVju5WLdm0am0JALo1XvUir1uP7j0f/h38/yA1+Jk1wXzAISdqOQN/CLl+o1H66rntEh/ijA== - dependencies: - core-js "^3.0.1" - "@storybook/client-logger@5.3.12": version "5.3.12" resolved "https://registry.yarnpkg.com/@storybook/client-logger/-/client-logger-5.3.12.tgz#64033dd647b6ce6971977e4f5ce2908de21526eb" @@ -2413,33 +2326,6 @@ react-textarea-autosize "^7.1.0" simplebar-react "^1.0.0-alpha.6" -"@storybook/components@5.3.10": - version "5.3.10" - resolved "https://registry.yarnpkg.com/@storybook/components/-/components-5.3.10.tgz#09cb0e931ff27d90ded3b94b8d4cd1ac52007c52" - integrity sha512-azGOazbkAJguGLZ7MOA8ZMh+Y2MTxhOcT7+jCVyl/AqpYuKjRR8cogZCWkbg5DnQsj79XNBr4eFWJ64m8dlUZw== - dependencies: - "@storybook/client-logger" "5.3.10" - "@storybook/theming" "5.3.10" - "@types/react-syntax-highlighter" "11.0.2" - "@types/react-textarea-autosize" "^4.3.3" - core-js "^3.0.1" - global "^4.3.2" - lodash "^4.17.15" - markdown-to-jsx "^6.9.1" - memoizerific "^1.11.3" - polished "^3.3.1" - popper.js "^1.14.7" - prop-types "^15.7.2" - react "^16.8.3" - react-dom "^16.8.3" - react-focus-lock "^2.1.0" - react-helmet-async "^1.0.2" - react-popper-tooltip "^2.8.3" - react-syntax-highlighter "^11.0.2" - react-textarea-autosize "^7.1.0" - simplebar-react "^1.0.0-alpha.6" - ts-dedent "^1.1.0" - "@storybook/components@5.3.12": version "5.3.12" resolved "https://registry.yarnpkg.com/@storybook/components/-/components-5.3.12.tgz#0d930343624d459f46cd55b140be979709ee5a29" @@ -2474,13 +2360,6 @@ dependencies: core-js "^3.0.1" -"@storybook/core-events@5.3.10": - version "5.3.10" - resolved "https://registry.yarnpkg.com/@storybook/core-events/-/core-events-5.3.10.tgz#3fa271f5f47ec9822c488b91d4ea7c298eb7ed6c" - integrity sha512-HxE8inbyoBtKqUR6cnNHBvHI55nRLYf8RGEB7BuazYtF5v2FBFRghngKJ+4ELz0Rw9Hv2jiU93S6zfTaOg6euw== - dependencies: - core-js "^3.0.1" - "@storybook/core-events@5.3.12": version "5.3.12" resolved "https://registry.yarnpkg.com/@storybook/core-events/-/core-events-5.3.12.tgz#188526c9003884104cce4fcd20448ca34d14d9f7" @@ -2599,21 +2478,6 @@ memoizerific "^1.11.3" qs "^6.6.0" -"@storybook/router@5.3.10": - version "5.3.10" - resolved "https://registry.yarnpkg.com/@storybook/router/-/router-5.3.10.tgz#a30f2694f4fa586ce4e398d02d4db7b70161551d" - integrity sha512-WQwsiOnvhqtAi7LKDygI03vk/CJG23/jqRtqDvjEhf2K3oRQmW3ZpPZkt6/W+UTkRlzp2bYMZFBYa0/HxEYITQ== - dependencies: - "@reach/router" "^1.2.1" - "@storybook/csf" "0.0.1" - "@types/reach__router" "^1.2.3" - core-js "^3.0.1" - global "^4.3.2" - lodash "^4.17.15" - memoizerific "^1.11.3" - qs "^6.6.0" - util-deprecate "^1.0.2" - "@storybook/router@5.3.12": version "5.3.12" resolved "https://registry.yarnpkg.com/@storybook/router/-/router-5.3.12.tgz#f08d75793790aacc5543c55e62d08d3bb00188fd" @@ -2647,24 +2511,6 @@ prop-types "^15.7.2" resolve-from "^5.0.0" -"@storybook/theming@5.3.10": - version "5.3.10" - resolved "https://registry.yarnpkg.com/@storybook/theming/-/theming-5.3.10.tgz#6f53df9684d998ce3dfdb22babfaeb667b7f250d" - integrity sha512-5/RQQS6u7BuJ8ufiqohAZ6EBLi6PwvJ3KcLMU21Dces/i0/e/HukXzUJVS0DVOno4bROkf98fYIv+MetpvIX+g== - dependencies: - "@emotion/core" "^10.0.20" - "@emotion/styled" "^10.0.17" - "@storybook/client-logger" "5.3.10" - core-js "^3.0.1" - deep-object-diff "^1.1.0" - emotion-theming "^10.0.19" - global "^4.3.2" - memoizerific "^1.11.3" - polished "^3.3.1" - prop-types "^15.7.2" - resolve-from "^5.0.0" - ts-dedent "^1.1.0" - "@storybook/theming@5.3.12": version "5.3.12" resolved "https://registry.yarnpkg.com/@storybook/theming/-/theming-5.3.12.tgz#70908dc23c0635765256fc4dbb7cd6d318886dfe"