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 @@
+
+
+
![]()
+
+
{{ $t(message) }}
+
+
{{ $t('error-pages.back-to-index') }}
+
+
+
+
+
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 @@
+
+
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"