mirror of
https://github.com/Ocelot-Social-Community/Ocelot-Social.git
synced 2026-02-06 09:56:03 +00:00
Compare commits
434 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 0e4e72429d | |||
| a78c25a258 | |||
| 753a300c3f | |||
|
|
b28cdada6d | ||
|
|
8a04b09fd7 | ||
|
|
b26a06f0ef | ||
|
|
e5231acd4f | ||
|
|
8e8bab6f9d | ||
|
|
71228260e5 | ||
| d96cb32f11 | |||
| bea7c275e8 | |||
| 07ff0a6b5e | |||
| 6fc3c03860 | |||
| 524c4caf5e | |||
| 8136ec1aba | |||
| 0ee476cfff | |||
|
|
b39d1c737b | ||
|
|
dcff378727 | ||
|
|
6c34da94f4 | ||
|
|
f5f6ceb2c5 | ||
|
|
e109ac29b7 | ||
|
|
05aeb1c20d | ||
|
|
003ec2bda0 | ||
|
|
208a6dca01 | ||
| af497deb77 | |||
|
|
ba481547f1 | ||
|
|
9f4c105335 | ||
|
|
8012d56dc8 | ||
|
|
9d994a7554 | ||
|
|
322d2aeb97 | ||
|
|
afee1033af | ||
|
|
d358fdf6b4 | ||
| 150b318aab | |||
| f0f9b7faec | |||
| b22974031c | |||
|
|
0ca45dd06e | ||
| 6a42d12fda | |||
| b7604e9af5 | |||
| 3d00ae4e25 | |||
|
|
fa71b0e189 | ||
|
|
855a049f90 | ||
|
|
679e4876bc | ||
|
|
e84a81bd2f | ||
|
|
34e547553e | ||
|
|
5aa298b3a2 | ||
|
|
626372a741 | ||
|
|
a0ac5157a1 | ||
|
|
083d81be89 | ||
|
|
721fd75288 | ||
|
|
7e6d79f1dc | ||
|
|
bc7e750e83 | ||
|
|
fbe98aa2b4 | ||
|
|
7ae516cf85 | ||
|
|
02bf7f0ab8 | ||
|
|
cc8ab95eaf | ||
|
|
017bfbc820 | ||
|
|
25eeb8d485 | ||
|
|
eca7f5096e | ||
|
|
9f581f4773 | ||
|
|
b767e02263 | ||
|
|
b01d5e5a27 | ||
|
|
06a79225f3 | ||
|
|
eaa9b34d58 | ||
|
|
c4fcd558e3 | ||
|
|
0fef81464f | ||
|
|
9c3d3e2fcd | ||
|
|
cbb57622f7 | ||
|
|
861275aeda | ||
|
|
c0c396653f | ||
|
|
5642e0db2c | ||
|
|
49f7118468 | ||
|
|
9a0c97e6ce | ||
|
|
1dd7fc3d75 | ||
|
|
0e2d90c634 | ||
|
|
56338422a2 | ||
|
|
817ac7226e | ||
|
|
eb81c0b7e4 | ||
|
|
34aa894068 | ||
|
|
d751e7090f | ||
|
|
a9949e1147 | ||
|
|
c78f8deee9 | ||
|
|
2cabe0f4d2 | ||
|
|
0ac7bf908c | ||
|
|
0368676b26 | ||
|
|
cd7931b77b | ||
|
|
801131e351 | ||
|
|
30d30a2f2d | ||
|
|
9dfd5e31ef | ||
|
|
c86d816e56 | ||
|
|
de89810eae | ||
|
|
9df61a752a | ||
|
|
2410fa8527 | ||
|
|
b5b7b5d78c | ||
|
|
00d8fd960d | ||
|
|
caf95664b8 | ||
|
|
66f35ca51d | ||
|
|
c6878f19f9 | ||
|
|
421bfe6755 | ||
| 592a8af42c | |||
|
|
a48510f349 | ||
|
|
a03e5d888b | ||
|
|
7f7c56cec2 | ||
|
|
77d8a5092b | ||
| 60bda5a949 | |||
|
|
ff2b6465db | ||
|
|
72b4af395f | ||
| 2130aa0d68 | |||
|
|
1c7f2f27b5 | ||
|
|
e2ef636cf8 | ||
| 3f69b70820 | |||
|
|
e6244c848c | ||
| 0280ac7201 | |||
| 09327ddc01 | |||
| 49e6f0b7e8 | |||
| c9b5c02862 | |||
| 52459b23f1 | |||
|
|
737f548f38 | ||
|
|
1a29167f08 | ||
|
|
06bd4f1ea4 | ||
|
|
bbb2a189db | ||
|
|
a5f720dba1 | ||
|
|
3b93d255a6 | ||
|
|
5b84b93a16 | ||
|
|
1622c31010 | ||
|
|
09536ed0e8 | ||
|
|
005e2569a1 | ||
|
|
ed328e70d8 | ||
|
|
d96f145e2b | ||
|
|
f3d36bb779 | ||
|
|
5e1d9e280a | ||
|
|
5bb8508df9 | ||
|
|
1b0ef1f81b | ||
|
|
0042914231 | ||
|
|
3f216d84d7 | ||
|
|
88ec6fdef0 | ||
|
|
d22479cfa2 | ||
|
|
ad5108996f | ||
|
|
558e964c83 | ||
|
|
2a7d2f10ed | ||
| b5895afe3e | |||
| 1964ff3eb1 | |||
| 9fc2379090 | |||
| 1e19bd1be7 | |||
|
|
98af683277 | ||
|
|
b40015d408 | ||
|
|
1512167197 | ||
|
|
263f35d2e0 | ||
|
|
05ab27e868 | ||
|
|
f49022e94d | ||
|
|
719457b896 | ||
|
|
6d4fd54c30 | ||
|
|
54aeca0375 | ||
| ffffd9e15f | |||
| b06b29b858 | |||
| ace5e9a89e | |||
| c6fe18f1f7 | |||
| f9af98da97 | |||
| d9ed8a42b5 | |||
| 52da131ee4 | |||
| 6d9529a021 | |||
| 32eca68520 | |||
| e4717e0d89 | |||
| 33ca59343a | |||
|
|
1044231e4e | ||
|
|
2bf39f5ad0 | ||
|
|
68030dc5ec | ||
|
|
ced52e30db | ||
|
|
35c3dd3bbc | ||
|
|
768d80f2a1 | ||
|
|
f7dc901c2a | ||
|
|
fadc37a49c | ||
| 21c253b690 | |||
| 08c8cfe42c | |||
| 59dd435138 | |||
|
|
158e1ee4e0 | ||
|
|
2350e594d4 | ||
| 30560bff69 | |||
|
|
4fc71fc495 | ||
|
|
3ca00c83c0 | ||
|
|
9f91ff1124 | ||
|
|
a15351aa42 | ||
|
|
9a4f7326c1 | ||
|
|
2ed92c0a78 | ||
| de65a380ab | |||
| 45d2283138 | |||
| 2c285d6bfb | |||
| 4ef93e0aad | |||
| d414b56344 | |||
| c4cd51ee65 | |||
|
|
ef5cdbc2cb | ||
|
|
7906a474ca | ||
|
|
b7842dc793 | ||
|
|
f5a5b63fff | ||
|
|
b506052277 | ||
|
|
502ae10a15 | ||
| 00e718b12f | |||
|
|
d9a7c1adc5 | ||
| ebb8ef4f0e | |||
| 047070c5b3 | |||
|
|
985a8c3720 | ||
|
|
d437c6d7f4 | ||
| 66b5e61c15 | |||
| 380d3401c0 | |||
| 1e64590099 | |||
| 74f6c5b329 | |||
|
|
dbae0862f9 | ||
|
|
bbd233835e | ||
|
|
2a8f3f672f | ||
|
|
a6c0044216 | ||
|
|
cfefb4c35c | ||
|
|
f480e7c054 | ||
|
|
5e9581de84 | ||
|
|
fc313e2a16 | ||
|
|
ce52bc951a | ||
|
|
b277382ae3 | ||
| 9bc327e675 | |||
|
|
c1a05bc73b | ||
|
|
f61850980e | ||
|
|
f7345a2772 | ||
|
|
9aeb619184 | ||
|
|
51df143a15 | ||
| b92dcd3534 | |||
| 3e58a1016a | |||
|
|
ea080db3f5 | ||
| 30406411f8 | |||
| 80ddfdf532 | |||
|
|
69bfd90175 | ||
| c0ad753698 | |||
|
|
5d42daedd6 | ||
|
|
db4a808beb | ||
|
|
86ebeb9a50 | ||
|
|
712afc05a8 | ||
|
|
b33e1e9236 | ||
|
|
bd1d23dc22 | ||
|
|
b69ff178ec | ||
|
|
3968c9d742 | ||
|
|
7bbcdf4fca | ||
|
|
0fa09080de | ||
|
|
fed951b3d2 | ||
|
|
5006680a9e | ||
| 31c6446a38 | |||
|
|
7d1dea2e77 | ||
|
|
00da9e8ecb | ||
|
|
abb9d944f2 | ||
| 04dec08d04 | |||
| 1612d03b52 | |||
| e0017bc4dd | |||
|
|
f7f3938855 | ||
|
|
528b9292be | ||
|
|
8fdabd57a3 | ||
|
|
3237c2fcb5 | ||
|
|
5e192aef3e | ||
|
|
77a45810e0 | ||
| daabb4024c | |||
|
|
754efa5197 | ||
|
|
32bfacd0d6 | ||
|
|
7a2d9e637d | ||
|
|
02b348912b | ||
|
|
c674fae5e1 | ||
|
|
3357a331fb | ||
|
|
599b8d03e1 | ||
|
|
97f64898d9 | ||
|
|
08e35bdc8b | ||
|
|
3f8441c700 | ||
|
|
56aa515bca | ||
|
|
a174600613 | ||
|
|
b5b0dcd9c1 | ||
|
|
a725ae7e08 | ||
|
|
0cb4c1f3b7 | ||
|
|
e990b9c8ac | ||
|
|
6895a73b15 | ||
|
|
8ce8825840 | ||
|
|
e9213effc1 | ||
|
|
b9eb2ad91f | ||
|
|
572bc5281a | ||
|
|
3b2b3f0014 | ||
|
|
588e9bee8d | ||
|
|
66d591404e | ||
|
|
4fd1ccf5d0 | ||
|
|
0a426cbd5e | ||
|
|
46beb2931f | ||
|
|
c4a119f9db | ||
|
|
714b53725f | ||
|
|
f5765b61c6 | ||
|
|
4e68a88a24 | ||
|
|
853f7cd26e | ||
|
|
e82c023569 | ||
|
|
1ebbb1ca62 | ||
|
|
747b0d9f94 | ||
|
|
432ae4a906 | ||
|
|
e0719c405e | ||
|
|
bdb3c204aa | ||
|
|
8be9662987 | ||
|
|
7ef8340500 | ||
|
|
5d6391f505 | ||
|
|
d46fc1570c | ||
|
|
c752e25221 | ||
|
|
808b3c5a95 | ||
|
|
b05583a8b0 | ||
|
|
90f747a2a9 | ||
|
|
3d85451aff | ||
|
|
8dafc50286 | ||
|
|
0b6360bc0b | ||
|
|
2ad4602de3 | ||
|
|
80eb430460 | ||
|
|
aa772ca19f | ||
|
|
94c0ed83d9 | ||
|
|
ac960d8ecd | ||
|
|
0889e137d9 | ||
|
|
66c049544e | ||
|
|
dc4ce74b21 | ||
|
|
e0d3717ca0 | ||
|
|
73195606fb | ||
|
|
e6fe9ba4b7 | ||
|
|
3c65a2426c | ||
|
|
c9d969afc6 | ||
|
|
573890102f | ||
|
|
64389852c4 | ||
|
|
2536542aa9 | ||
|
|
bcad113682 | ||
|
|
208bfc1550 | ||
|
|
be4d526505 | ||
|
|
9e49afaac3 | ||
|
|
79cbcf2901 | ||
|
|
f83a13c7f2 | ||
|
|
f87d8dacfd | ||
|
|
461a762205 | ||
|
|
9d5cb51ed5 | ||
|
|
e6352cc6fb | ||
|
|
57fe905a96 | ||
|
|
79a8fc5f5f | ||
|
|
3d41d811d2 | ||
|
|
df7b736f5d | ||
|
|
3f4a8a543e | ||
|
|
3fa3d6f5c4 | ||
|
|
4edb8cd541 | ||
|
|
f51890a54f | ||
|
|
b730b91e2c | ||
|
|
2ccaeb6166 | ||
|
|
3a93d9abb3 | ||
| 6f1d94610e | |||
| d70d331e6f | |||
| 396e08127a | |||
| 059072982f | |||
| 8da1d99e33 | |||
| bbbf051026 | |||
| 5e9e55f00e | |||
|
|
3f7a00b8b9 | ||
|
|
e76fed663c | ||
|
|
c8002a2b9a | ||
|
|
b3bde1aa2a | ||
|
|
9b8ac8f1b3 | ||
|
|
baf3134f9d | ||
|
|
19a6badd55 | ||
|
|
bc3e3875e8 | ||
|
|
fe536b626f | ||
|
|
4e43be4ff6 | ||
|
|
da22c5869a | ||
|
|
e77754cb78 | ||
|
|
319f6a90f7 | ||
|
|
562fddb1b4 | ||
|
|
e7c25e15ed | ||
|
|
ce20d5b58e | ||
|
|
de26ce29e6 | ||
|
|
fd83399e70 | ||
|
|
a100c09ac5 | ||
|
|
f6fbe058f6 | ||
|
|
02f34f0fcf | ||
|
|
ce69fe5cb7 | ||
|
|
b941bb24d8 | ||
|
|
58cb1ee096 | ||
|
|
c64d6fbb83 | ||
|
|
702cd07171 | ||
|
|
ba27f81977 | ||
|
|
900dad94ae | ||
|
|
a98e22dba1 | ||
|
|
e9eaafd067 | ||
|
|
21dd977bec | ||
|
|
23cbd42d3f | ||
|
|
201de94230 | ||
|
|
273c0ca1a6 | ||
|
|
4f87a3feec | ||
|
|
dca1ea6c42 | ||
|
|
01ca0a6d8b | ||
|
|
4a574ee430 | ||
|
|
83da96f8c8 | ||
|
|
b7371582dc | ||
|
|
fbc3ee5658 | ||
|
|
4edea10b18 | ||
|
|
0bbaba189f | ||
|
|
a0189658a8 | ||
|
|
f4f16962d9 | ||
|
|
095b1539ad | ||
|
|
6a7256f0c1 | ||
|
|
1a82e6edda | ||
|
|
ffe1ceabf1 | ||
|
|
81bcdc87e3 | ||
|
|
85114b78d6 | ||
|
|
105ab19424 | ||
|
|
7a628d515d | ||
|
|
71258216f2 | ||
|
|
9c35a70e07 | ||
|
|
2a8fef8cb6 | ||
|
|
3a879a954f | ||
|
|
aea2bb079e | ||
|
|
bdeb23a428 | ||
|
|
58b3034fc8 | ||
|
|
d68357c74d | ||
|
|
c05e80420f | ||
|
|
2021531ab4 | ||
|
|
fd15352390 | ||
|
|
86c8c30bd4 | ||
|
|
0d7fe46cc4 | ||
|
|
970613a416 | ||
|
|
2e7acaa68b | ||
|
|
cc456da586 | ||
|
|
47291993d2 | ||
|
|
58f40fbed8 | ||
|
|
3975ccfd71 | ||
|
|
05dce9254c | ||
|
|
85c994e94c | ||
|
|
ea16195296 | ||
|
|
01d0d4819f | ||
|
|
3089f99312 | ||
|
|
c141674c65 | ||
|
|
1a84af06ff | ||
|
|
da25934f4c | ||
|
|
e767ee5870 | ||
|
|
746c48a35f | ||
|
|
8d759834e1 | ||
|
|
f97029dc07 | ||
|
|
2212cf70f5 | ||
|
|
659c8b5106 | ||
|
|
3cdd06b252 |
77
.github/dependabot.yml
vendored
77
.github/dependabot.yml
vendored
@ -126,80 +126,3 @@ updates:
|
|||||||
day: "saturday"
|
day: "saturday"
|
||||||
timezone: "Europe/Berlin"
|
timezone: "Europe/Berlin"
|
||||||
time: "03:00"
|
time: "03:00"
|
||||||
|
|
||||||
# frontend
|
|
||||||
# - package-ecosystem: npm
|
|
||||||
# open-pull-requests-limit: 99
|
|
||||||
# directory: "/frontend"
|
|
||||||
# rebase-strategy: "disabled"
|
|
||||||
# schedule:
|
|
||||||
# interval: weekly
|
|
||||||
# day: "saturday"
|
|
||||||
# timezone: "Europe/Berlin"
|
|
||||||
# time: "03:00"
|
|
||||||
# groups:
|
|
||||||
# eslint:
|
|
||||||
# applies-to: version-updates
|
|
||||||
# patterns:
|
|
||||||
# - "eslint*"
|
|
||||||
# - "@eslint*"
|
|
||||||
# pinia:
|
|
||||||
# applies-to: version-updates
|
|
||||||
# patterns:
|
|
||||||
# - "pinia*"
|
|
||||||
# react:
|
|
||||||
# applies-to: version-updates
|
|
||||||
# patterns:
|
|
||||||
# - "react*"
|
|
||||||
# remark:
|
|
||||||
# applies-to: version-updates
|
|
||||||
# patterns:
|
|
||||||
# - "remark*"
|
|
||||||
# storybook:
|
|
||||||
# applies-to: version-updates
|
|
||||||
# patterns:
|
|
||||||
# - "storybook"
|
|
||||||
# - "@storybook*"
|
|
||||||
# stylelint:
|
|
||||||
# applies-to: version-updates
|
|
||||||
# patterns:
|
|
||||||
# - "stylelint*"
|
|
||||||
# typescript:
|
|
||||||
# applies-to: version-updates
|
|
||||||
# patterns:
|
|
||||||
# - "ts*"
|
|
||||||
# - "@types*"
|
|
||||||
# - "typescript"
|
|
||||||
# vite:
|
|
||||||
# applies-to: version-updates
|
|
||||||
# patterns:
|
|
||||||
# - "vite"
|
|
||||||
# - "vite-plugin*"
|
|
||||||
# - "@vitejs/plugin-vue"
|
|
||||||
# vitest:
|
|
||||||
# applies-to: version-updates
|
|
||||||
# patterns:
|
|
||||||
# - "vitest"
|
|
||||||
# - "@vitest*"
|
|
||||||
# vue:
|
|
||||||
# applies-to: version-updates
|
|
||||||
# patterns:
|
|
||||||
# - "*vue?(/)*"
|
|
||||||
# exclude-patterns:
|
|
||||||
# - "vuetify"
|
|
||||||
# - "*vuepress*"
|
|
||||||
# - "vue-tsc"
|
|
||||||
# vuepress:
|
|
||||||
# applies-to: version-updates
|
|
||||||
# patterns:
|
|
||||||
# - "vuepress"
|
|
||||||
# - "@vuepress*"
|
|
||||||
# - package-ecosystem: docker
|
|
||||||
# open-pull-requests-limit: 99
|
|
||||||
# directory: "/frontend"
|
|
||||||
# rebase-strategy: "disabled"
|
|
||||||
# schedule:
|
|
||||||
# interval: weekly
|
|
||||||
# day: "saturday"
|
|
||||||
# timezone: "Europe/Berlin"
|
|
||||||
# time: "03:00"
|
|
||||||
|
|||||||
23
.github/file-filters.yml
vendored
23
.github/file-filters.yml
vendored
@ -12,6 +12,7 @@ docker: &docker
|
|||||||
webapp: &webapp
|
webapp: &webapp
|
||||||
- '.github/workflows/test-webapp.yml'
|
- '.github/workflows/test-webapp.yml'
|
||||||
- 'webapp/**/*'
|
- 'webapp/**/*'
|
||||||
|
- 'styleguide/**/*'
|
||||||
- 'package.json'
|
- 'package.json'
|
||||||
|
|
||||||
docs-check: &docs-check
|
docs-check: &docs-check
|
||||||
@ -30,24 +31,4 @@ vuepress: &vuepress
|
|||||||
|
|
||||||
documentation: &documentation
|
documentation: &documentation
|
||||||
- *vuepress
|
- *vuepress
|
||||||
- *markdown
|
- *markdown
|
||||||
|
|
||||||
# frontend
|
|
||||||
frontend-test-lint-code: &frontend-test-lint-code
|
|
||||||
- 'frontend/**/*'
|
|
||||||
|
|
||||||
frontend-test-unit-code: &frontend-test-unit-code
|
|
||||||
- 'frontend/**/*'
|
|
||||||
|
|
||||||
frontend-test-build-code: &frontend-test-build-code
|
|
||||||
- 'frontend/**/*'
|
|
||||||
|
|
||||||
frontend-test-build-docker: &frontend-test-build-docker
|
|
||||||
- 'frontend/**/*'
|
|
||||||
|
|
||||||
frontend-test-build-docs: &frontend-test-build-docs
|
|
||||||
- 'frontend/**/*.md'
|
|
||||||
- 'frontend/.vuepress/*'
|
|
||||||
|
|
||||||
frontend-test-build-storybook: &frontend-test-build-storybook
|
|
||||||
- 'frontend/**/*'
|
|
||||||
10
.github/workflows/check-documentation.yml
vendored
10
.github/workflows/check-documentation.yml
vendored
@ -11,7 +11,7 @@ jobs:
|
|||||||
documentation: ${{ steps.changes.outputs.documentation }}
|
documentation: ${{ steps.changes.outputs.documentation }}
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout code
|
- name: Checkout code
|
||||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.1.7
|
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v4.1.7
|
||||||
|
|
||||||
- name: Check for markdown file changes
|
- name: Check for markdown file changes
|
||||||
uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2
|
uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2
|
||||||
@ -28,13 +28,13 @@ jobs:
|
|||||||
if: needs.files-changed.outputs.markdown == 'true'
|
if: needs.files-changed.outputs.markdown == 'true'
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout code
|
- name: Checkout code
|
||||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.1.7
|
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v4.1.7
|
||||||
|
|
||||||
- name: Remove uncheckable documentation files
|
- name: Remove uncheckable documentation files
|
||||||
run: rm -rf ./CHANGELOG.md # workaround until https://github.com/gaurav-nelson/github-action-markdown-link-check/pull/183 has been done
|
run: rm -rf ./CHANGELOG.md # workaround until https://github.com/gaurav-nelson/github-action-markdown-link-check/pull/183 has been done
|
||||||
|
|
||||||
- name: Check Markdown Links
|
- name: Check Markdown Links
|
||||||
uses: gaurav-nelson/github-action-markdown-link-check@1b916f2cf6c36510a6059943104e3c42ce6c16bc # 1.0.15
|
uses: gaurav-nelson/github-action-markdown-link-check@3c3b66f1f7d0900e37b71eca45b63ea9eedfce31 # 1.0.15
|
||||||
with:
|
with:
|
||||||
use-quiet-mode: 'yes'
|
use-quiet-mode: 'yes'
|
||||||
use-verbose-mode: 'no'
|
use-verbose-mode: 'no'
|
||||||
@ -51,10 +51,10 @@ jobs:
|
|||||||
if: needs.files-changed.outputs.documentation == 'true'
|
if: needs.files-changed.outputs.documentation == 'true'
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout code
|
- name: Checkout code
|
||||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.1.7
|
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v4.1.7
|
||||||
|
|
||||||
- name: Setup Node 20
|
- name: Setup Node 20
|
||||||
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.0.3
|
uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v4.0.3
|
||||||
with:
|
with:
|
||||||
node-version: '20'
|
node-version: '20'
|
||||||
|
|
||||||
|
|||||||
@ -22,7 +22,7 @@ jobs:
|
|||||||
continue-on-error: true
|
continue-on-error: true
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout code
|
- name: Checkout code
|
||||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.1.7
|
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v4.1.7
|
||||||
|
|
||||||
- name: Cleanup
|
- name: Cleanup
|
||||||
run: |
|
run: |
|
||||||
|
|||||||
6
.github/workflows/deploy-documentation.yml
vendored
6
.github/workflows/deploy-documentation.yml
vendored
@ -13,7 +13,7 @@ jobs:
|
|||||||
documentation: ${{ steps.changes.outputs.documentation }}
|
documentation: ${{ steps.changes.outputs.documentation }}
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout code
|
- name: Checkout code
|
||||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.1.7
|
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v4.1.7
|
||||||
|
|
||||||
- name: Check for file changes
|
- name: Check for file changes
|
||||||
uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2
|
uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2
|
||||||
@ -27,10 +27,10 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.1.7
|
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v4.1.7
|
||||||
|
|
||||||
- name: Setup Node 20
|
- name: Setup Node 20
|
||||||
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.0.3
|
uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v4.0.3
|
||||||
with:
|
with:
|
||||||
node-version: 20
|
node-version: 20
|
||||||
|
|
||||||
|
|||||||
18
.github/workflows/docker-push.yml
vendored
18
.github/workflows/docker-push.yml
vendored
@ -24,27 +24,27 @@ jobs:
|
|||||||
file: backend/Dockerfile
|
file: backend/Dockerfile
|
||||||
target: production
|
target: production
|
||||||
- name: webapp-base
|
- name: webapp-base
|
||||||
context: webapp
|
context: .
|
||||||
file: webapp/Dockerfile
|
file: webapp/Dockerfile
|
||||||
target: base
|
target: base
|
||||||
- name: webapp-build
|
- name: webapp-build
|
||||||
context: webapp
|
context: .
|
||||||
file: webapp/Dockerfile
|
file: webapp/Dockerfile
|
||||||
target: build
|
target: build
|
||||||
- name: webapp
|
- name: webapp
|
||||||
context: webapp
|
context: .
|
||||||
file: webapp/Dockerfile
|
file: webapp/Dockerfile
|
||||||
target: production
|
target: production
|
||||||
- name: maintenance-base
|
- name: maintenance-base
|
||||||
context: webapp
|
context: .
|
||||||
file: webapp/Dockerfile.maintenance
|
file: webapp/Dockerfile.maintenance
|
||||||
target: base
|
target: base
|
||||||
- name: maintenance-build
|
- name: maintenance-build
|
||||||
context: webapp
|
context: .
|
||||||
file: webapp/Dockerfile.maintenance
|
file: webapp/Dockerfile.maintenance
|
||||||
target: build
|
target: build
|
||||||
- name: maintenance
|
- name: maintenance
|
||||||
context: webapp
|
context: .
|
||||||
file: webapp/Dockerfile.maintenance
|
file: webapp/Dockerfile.maintenance
|
||||||
target: production
|
target: production
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
@ -59,16 +59,16 @@ jobs:
|
|||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout repository
|
- name: Checkout repository
|
||||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.1.7
|
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v4.1.7
|
||||||
- name: Log in to the Container registry
|
- name: Log in to the Container registry
|
||||||
uses: docker/login-action@74a5d142397b4f367a81961eba4e8cd7edddf772
|
uses: docker/login-action@c94ce9fb468520275223c153574b00df6fe4bcc9
|
||||||
with:
|
with:
|
||||||
registry: ${{ env.REGISTRY }}
|
registry: ${{ env.REGISTRY }}
|
||||||
username: ${{ github.actor }}
|
username: ${{ github.actor }}
|
||||||
password: ${{ secrets.GITHUB_TOKEN }}
|
password: ${{ secrets.GITHUB_TOKEN }}
|
||||||
- name: Extract metadata (tags, labels) for Docker
|
- name: Extract metadata (tags, labels) for Docker
|
||||||
id: meta
|
id: meta
|
||||||
uses: docker/metadata-action@902fa8ec7d6ecbf8d84d538b9b233a880e428804
|
uses: docker/metadata-action@c299e40c65443455700f0fdfc63efafe5b349051
|
||||||
with:
|
with:
|
||||||
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
|
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
|
||||||
tags: |
|
tags: |
|
||||||
|
|||||||
37
.github/workflows/frontend.test.build.code.yml
vendored
37
.github/workflows/frontend.test.build.code.yml
vendored
@ -1,37 +0,0 @@
|
|||||||
name: "frontend:test:build test code"
|
|
||||||
|
|
||||||
on: push
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
# only (but most important) job from this workflow required for pull requests
|
|
||||||
# check results serve as run conditions for all other jobs here
|
|
||||||
files-changed:
|
|
||||||
name: Detect File Changes - frontend-test-build-code
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
outputs:
|
|
||||||
changes: ${{ steps.changes.outputs.frontend-test-build-code }}
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.1.7
|
|
||||||
|
|
||||||
- name: Check for frontend file changes
|
|
||||||
uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2
|
|
||||||
id: changes
|
|
||||||
with:
|
|
||||||
token: ${{ github.token }}
|
|
||||||
filters: .github/file-filters.yml
|
|
||||||
list-files: shell
|
|
||||||
|
|
||||||
build:
|
|
||||||
if: needs.files-changed.outputs.changes == 'true'
|
|
||||||
name: Build - Frontend
|
|
||||||
needs: files-changed
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
env:
|
|
||||||
WORKING_DIRECTORY: ./frontend
|
|
||||||
steps:
|
|
||||||
- name: Checkout code
|
|
||||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.1.7
|
|
||||||
|
|
||||||
- name: Frontend | Build
|
|
||||||
run: npm install && npm run build
|
|
||||||
working-directory: ${{env.WORKING_DIRECTORY}}
|
|
||||||
52
.github/workflows/frontend.test.build.docker.yml
vendored
52
.github/workflows/frontend.test.build.docker.yml
vendored
@ -1,52 +0,0 @@
|
|||||||
name: "frontend:test:build test docker"
|
|
||||||
|
|
||||||
on: push
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
# only (but most important) job from this workflow required for pull requests
|
|
||||||
# check results serve as run conditions for all other jobs here
|
|
||||||
files-changed:
|
|
||||||
name: Detect File Changes - frontend-test-build-docker
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
outputs:
|
|
||||||
changes: ${{ steps.changes.outputs.frontend-test-build-docker }}
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.1.7
|
|
||||||
|
|
||||||
- name: Check for frontend file changes
|
|
||||||
uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2
|
|
||||||
id: changes
|
|
||||||
with:
|
|
||||||
token: ${{ github.token }}
|
|
||||||
filters: .github/file-filters.yml
|
|
||||||
list-files: shell
|
|
||||||
|
|
||||||
build-production:
|
|
||||||
if: needs.files-changed.outputs.changes == 'true'
|
|
||||||
name: Build Docker Production - Frontend
|
|
||||||
needs: files-changed
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
env:
|
|
||||||
WORKING_DIRECTORY: ./frontend
|
|
||||||
steps:
|
|
||||||
- name: Checkout code
|
|
||||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.1.7
|
|
||||||
|
|
||||||
- name: Frontend | Build Docker Production
|
|
||||||
run: docker compose -f docker-compose.yml build
|
|
||||||
working-directory: ${{env.WORKING_DIRECTORY}}
|
|
||||||
|
|
||||||
build-development:
|
|
||||||
if: needs.files-changed.outputs.changes == 'true'
|
|
||||||
name: Build Docker Development - Frontend
|
|
||||||
needs: files-changed
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
env:
|
|
||||||
WORKING_DIRECTORY: ./frontend
|
|
||||||
steps:
|
|
||||||
- name: Checkout code
|
|
||||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.1.7
|
|
||||||
|
|
||||||
- name: Frontend | Build Docker Development
|
|
||||||
run: docker compose build
|
|
||||||
working-directory: ${{env.WORKING_DIRECTORY}}
|
|
||||||
37
.github/workflows/frontend.test.build.docs.yml
vendored
37
.github/workflows/frontend.test.build.docs.yml
vendored
@ -1,37 +0,0 @@
|
|||||||
name: "frontend:test:build test docs"
|
|
||||||
|
|
||||||
on: push
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
# only (but most important) job from this workflow required for pull requests
|
|
||||||
# check results serve as run conditions for all other jobs here
|
|
||||||
files-changed:
|
|
||||||
name: Detect File Changes - frontend-test-build-docs
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
outputs:
|
|
||||||
changes: ${{ steps.changes.outputs.frontend-test-build-docs }}
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.1.7
|
|
||||||
|
|
||||||
- name: Check for frontend file changes
|
|
||||||
uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2
|
|
||||||
id: changes
|
|
||||||
with:
|
|
||||||
token: ${{ github.token }}
|
|
||||||
filters: .github/file-filters.yml
|
|
||||||
list-files: shell
|
|
||||||
|
|
||||||
build:
|
|
||||||
if: needs.files-changed.outputs.changes == 'true'
|
|
||||||
name: Build Docs - Frontend
|
|
||||||
needs: files-changed
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
env:
|
|
||||||
WORKING_DIRECTORY: ./frontend
|
|
||||||
steps:
|
|
||||||
- name: Checkout code
|
|
||||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.1.7
|
|
||||||
|
|
||||||
- name: Frontend | Build Docs
|
|
||||||
run: npm install && npm run docs:build
|
|
||||||
working-directory: ${{env.WORKING_DIRECTORY}}
|
|
||||||
@ -1,37 +0,0 @@
|
|||||||
name: "frontend:test:build test storybook"
|
|
||||||
|
|
||||||
on: push
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
# only (but most important) job from this workflow required for pull requests
|
|
||||||
# check results serve as run conditions for all other jobs here
|
|
||||||
files-changed:
|
|
||||||
name: Detect File Changes - frontend-test-build-storybook
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
outputs:
|
|
||||||
changes: ${{ steps.changes.outputs.frontend-test-build-storybook }}
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.1.7
|
|
||||||
|
|
||||||
- name: Check for frontend file changes
|
|
||||||
uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2
|
|
||||||
id: changes
|
|
||||||
with:
|
|
||||||
token: ${{ github.token }}
|
|
||||||
filters: .github/file-filters.yml
|
|
||||||
list-files: shell
|
|
||||||
|
|
||||||
storybook:
|
|
||||||
if: needs.files-changed.outputs.changes == 'true'
|
|
||||||
name: Build Storybook - Frontend
|
|
||||||
needs: files-changed
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
env:
|
|
||||||
WORKING_DIRECTORY: ./frontend
|
|
||||||
steps:
|
|
||||||
- name: Checkout code
|
|
||||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.1.7
|
|
||||||
|
|
||||||
- name: Frontend | Build Storybook
|
|
||||||
run: npm install && npm run storybook:build
|
|
||||||
working-directory: ${{env.WORKING_DIRECTORY}}
|
|
||||||
37
.github/workflows/frontend.test.lint.code.yml
vendored
37
.github/workflows/frontend.test.lint.code.yml
vendored
@ -1,37 +0,0 @@
|
|||||||
name: "frontend:test:lint code with defined linters"
|
|
||||||
|
|
||||||
on: push
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
# only (but most important) job from this workflow required for pull requests
|
|
||||||
# check results serve as run conditions for all other jobs here
|
|
||||||
files-changed:
|
|
||||||
name: Detect File Changes - frontend-test-lint-code
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
outputs:
|
|
||||||
changes: ${{ steps.changes.outputs.frontend-test-lint-code }}
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.1.7
|
|
||||||
|
|
||||||
- name: Check for frontend file changes
|
|
||||||
uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2
|
|
||||||
id: changes
|
|
||||||
with:
|
|
||||||
token: ${{ github.token }}
|
|
||||||
filters: .github/file-filters.yml
|
|
||||||
list-files: shell
|
|
||||||
|
|
||||||
lint:
|
|
||||||
if: needs.files-changed.outputs.changes == 'true'
|
|
||||||
name: Lint - Frontend
|
|
||||||
needs: files-changed
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
env:
|
|
||||||
WORKING_DIRECTORY: ./frontend
|
|
||||||
steps:
|
|
||||||
- name: Checkout code
|
|
||||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.1.7
|
|
||||||
|
|
||||||
- name: Frontend | Lint
|
|
||||||
run: npm install && npm run test:lint
|
|
||||||
working-directory: ${{env.WORKING_DIRECTORY}}
|
|
||||||
37
.github/workflows/frontend.test.unit.code.yml
vendored
37
.github/workflows/frontend.test.unit.code.yml
vendored
@ -1,37 +0,0 @@
|
|||||||
name: "frontend:test:unit test code with defined suites"
|
|
||||||
|
|
||||||
on: push
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
# only (but most important) job from this workflow required for pull requests
|
|
||||||
# check results serve as run conditions for all other jobs here
|
|
||||||
files-changed:
|
|
||||||
name: Detect File Changes - frontend-test-unit-code
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
outputs:
|
|
||||||
changes: ${{ steps.changes.outputs.frontend-test-unit-code }}
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.1.7
|
|
||||||
|
|
||||||
- name: Check for frontend file changes
|
|
||||||
uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2
|
|
||||||
id: changes
|
|
||||||
with:
|
|
||||||
token: ${{ github.token }}
|
|
||||||
filters: .github/file-filters.yml
|
|
||||||
list-files: shell
|
|
||||||
|
|
||||||
unit:
|
|
||||||
if: needs.files-changed.outputs.changes == 'true'
|
|
||||||
name: Unit - Frontend
|
|
||||||
needs: files-changed
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
env:
|
|
||||||
WORKING_DIRECTORY: ./frontend
|
|
||||||
steps:
|
|
||||||
- name: Checkout code
|
|
||||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.1.7
|
|
||||||
|
|
||||||
- name: Frontend | Unit
|
|
||||||
run: npm install && npm run test:unit
|
|
||||||
working-directory: ${{env.WORKING_DIRECTORY}}
|
|
||||||
18
.github/workflows/publish.yml
vendored
18
.github/workflows/publish.yml
vendored
@ -14,9 +14,13 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout code
|
- name: Checkout code
|
||||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.1.7
|
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v4.1.7
|
||||||
with:
|
with:
|
||||||
fetch-depth: 0 # Fetch full History for changelog
|
fetch-depth: 0 # Fetch full History for changelog
|
||||||
|
- name: Setup Node.js
|
||||||
|
uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v4.0.3
|
||||||
|
with:
|
||||||
|
node-version-file: '.nvmrc'
|
||||||
- name: Setup env
|
- name: Setup env
|
||||||
run: |
|
run: |
|
||||||
echo "VERSION=$(node -p -e "require('./package.json').version")" >> $GITHUB_ENV
|
echo "VERSION=$(node -p -e "require('./package.json').version")" >> $GITHUB_ENV
|
||||||
@ -54,9 +58,13 @@ jobs:
|
|||||||
needs: [github_tag]
|
needs: [github_tag]
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout code
|
- name: Checkout code
|
||||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.1.7
|
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v4.1.7
|
||||||
with:
|
with:
|
||||||
fetch-depth: 0 # Fetch full History for changelog
|
fetch-depth: 0 # Fetch full History for changelog
|
||||||
|
- name: Setup Node.js
|
||||||
|
uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v4.0.3
|
||||||
|
with:
|
||||||
|
node-version-file: '.nvmrc'
|
||||||
- name: Setup env
|
- name: Setup env
|
||||||
run: |
|
run: |
|
||||||
echo "VERSION=$(node -p -e "require('./package.json').version")" >> $GITHUB_ENV
|
echo "VERSION=$(node -p -e "require('./package.json').version")" >> $GITHUB_ENV
|
||||||
@ -64,7 +72,7 @@ jobs:
|
|||||||
echo "BUILD_COMMIT=${GITHUB_SHA}" >> $GITHUB_ENV
|
echo "BUILD_COMMIT=${GITHUB_SHA}" >> $GITHUB_ENV
|
||||||
- run: echo "BUILD_VERSION=${VERSION}-${GITHUB_RUN_NUMBER}" >> $GITHUB_ENV
|
- run: echo "BUILD_VERSION=${VERSION}-${GITHUB_RUN_NUMBER}" >> $GITHUB_ENV
|
||||||
#- name: Repository Dispatch
|
#- name: Repository Dispatch
|
||||||
# uses: peter-evans/repository-dispatch@25237563b45ca02acc9f277837f7e17abc0a48a9 # v3.0.0
|
# uses: peter-evans/repository-dispatch@cf70392543065ca62813db6712a06df1c4f4ae9f # v3.0.0
|
||||||
# with:
|
# with:
|
||||||
# token: ${{ github.token }}
|
# token: ${{ github.token }}
|
||||||
# event-type: trigger-ocelot-build-success
|
# event-type: trigger-ocelot-build-success
|
||||||
@ -72,7 +80,7 @@ jobs:
|
|||||||
# client-payload: '{"ref": "${{ github.ref }}", "sha": "${{ github.sha }}", "VERSION": "${VERSION}", "BUILD_DATE": "${BUILD_DATE}", "BUILD_COMMIT": "${BUILD_COMMIT}", "BUILD_VERSION": "${BUILD_VERSION}"}'
|
# client-payload: '{"ref": "${{ github.ref }}", "sha": "${{ github.sha }}", "VERSION": "${VERSION}", "BUILD_DATE": "${BUILD_DATE}", "BUILD_COMMIT": "${BUILD_COMMIT}", "BUILD_VERSION": "${BUILD_VERSION}"}'
|
||||||
|
|
||||||
- name: Repository Dispatch stage.ocelot.social
|
- name: Repository Dispatch stage.ocelot.social
|
||||||
uses: peter-evans/repository-dispatch@25237563b45ca02acc9f277837f7e17abc0a48a9 # v3.0.0
|
uses: peter-evans/repository-dispatch@cf70392543065ca62813db6712a06df1c4f4ae9f # v3.0.0
|
||||||
with:
|
with:
|
||||||
token: ${{ secrets.OCELOT_PUBLISH_EVENT_PAT }} # this token is required to access the other repository
|
token: ${{ secrets.OCELOT_PUBLISH_EVENT_PAT }} # this token is required to access the other repository
|
||||||
event-type: trigger-ocelot-build-success
|
event-type: trigger-ocelot-build-success
|
||||||
@ -80,7 +88,7 @@ jobs:
|
|||||||
client-payload: '{"ref": "${{ github.ref }}", "sha": "${{ github.sha }}", "GITHUB_RUN_NUMBER": "${{ env.GITHUB_RUN_NUMBER }}", "VERSION": "${VERSION}", "BUILD_DATE": "${BUILD_DATE}", "BUILD_COMMIT": "${BUILD_COMMIT}", "BUILD_VERSION": "${BUILD_VERSION}"}'
|
client-payload: '{"ref": "${{ github.ref }}", "sha": "${{ github.sha }}", "GITHUB_RUN_NUMBER": "${{ env.GITHUB_RUN_NUMBER }}", "VERSION": "${VERSION}", "BUILD_DATE": "${BUILD_DATE}", "BUILD_COMMIT": "${BUILD_COMMIT}", "BUILD_VERSION": "${BUILD_VERSION}"}'
|
||||||
|
|
||||||
- name: Repository Dispatch stage.yunite.me
|
- name: Repository Dispatch stage.yunite.me
|
||||||
uses: peter-evans/repository-dispatch@25237563b45ca02acc9f277837f7e17abc0a48a9 # v3.0.0
|
uses: peter-evans/repository-dispatch@cf70392543065ca62813db6712a06df1c4f4ae9f # v3.0.0
|
||||||
with:
|
with:
|
||||||
token: ${{ secrets.OCELOT_PUBLISH_EVENT_PAT }} # this token is required to access the other repository
|
token: ${{ secrets.OCELOT_PUBLISH_EVENT_PAT }} # this token is required to access the other repository
|
||||||
event-type: trigger-ocelot-build-success
|
event-type: trigger-ocelot-build-success
|
||||||
|
|||||||
24
.github/workflows/test-backend.yml
vendored
24
.github/workflows/test-backend.yml
vendored
@ -11,7 +11,7 @@ jobs:
|
|||||||
backend: ${{ steps.changes.outputs.backend }}
|
backend: ${{ steps.changes.outputs.backend }}
|
||||||
docker: ${{ steps.changes.outputs.docker }}
|
docker: ${{ steps.changes.outputs.docker }}
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.1.7
|
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v4.1.7
|
||||||
|
|
||||||
- name: Check for backend file changes
|
- name: Check for backend file changes
|
||||||
uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2
|
uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2
|
||||||
@ -28,7 +28,7 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout code
|
- name: Checkout code
|
||||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.1.7
|
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v4.1.7
|
||||||
|
|
||||||
- name: Neo4J | Build 'community' image
|
- name: Neo4J | Build 'community' image
|
||||||
run: |
|
run: |
|
||||||
@ -37,7 +37,7 @@ jobs:
|
|||||||
|
|
||||||
- name: Cache docker images
|
- name: Cache docker images
|
||||||
id: cache-neo4j
|
id: cache-neo4j
|
||||||
uses: actions/cache@5a3ec84eff668545956fd18022155c47e93e2684 # v4.0.2
|
uses: actions/cache@cdf6c1fa76f9f475f3d7449005a359c84ca0f306 # v4.0.2
|
||||||
with:
|
with:
|
||||||
path: /tmp/neo4j.tar
|
path: /tmp/neo4j.tar
|
||||||
key: ${{ github.run_id }}-backend-neo4j-cache
|
key: ${{ github.run_id }}-backend-neo4j-cache
|
||||||
@ -49,7 +49,7 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout code
|
- name: Checkout code
|
||||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.1.7
|
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v4.1.7
|
||||||
|
|
||||||
- name: backend | Build 'test' image
|
- name: backend | Build 'test' image
|
||||||
run: |
|
run: |
|
||||||
@ -58,7 +58,7 @@ jobs:
|
|||||||
|
|
||||||
- name: Cache docker images
|
- name: Cache docker images
|
||||||
id: cache-backend
|
id: cache-backend
|
||||||
uses: actions/cache@5a3ec84eff668545956fd18022155c47e93e2684 # v4.0.2
|
uses: actions/cache@cdf6c1fa76f9f475f3d7449005a359c84ca0f306 # v4.0.2
|
||||||
with:
|
with:
|
||||||
path: /tmp/backend.tar
|
path: /tmp/backend.tar
|
||||||
key: ${{ github.run_id }}-backend-cache
|
key: ${{ github.run_id }}-backend-cache
|
||||||
@ -70,7 +70,12 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout code
|
- name: Checkout code
|
||||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.1.7
|
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v4.1.7
|
||||||
|
|
||||||
|
- name: Setup Node.js
|
||||||
|
uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v4.0.3
|
||||||
|
with:
|
||||||
|
node-version-file: 'backend/.nvmrc'
|
||||||
|
|
||||||
- name: backend | Lint
|
- name: backend | Lint
|
||||||
run: cd backend && yarn && yarn run lint
|
run: cd backend && yarn && yarn run lint
|
||||||
@ -84,17 +89,17 @@ jobs:
|
|||||||
checks: write
|
checks: write
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout code
|
- name: Checkout code
|
||||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.1.7
|
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v4.1.7
|
||||||
|
|
||||||
- name: Restore Neo4J cache
|
- name: Restore Neo4J cache
|
||||||
uses: actions/cache@5a3ec84eff668545956fd18022155c47e93e2684 # v4.0.2
|
uses: actions/cache@cdf6c1fa76f9f475f3d7449005a359c84ca0f306 # v4.0.2
|
||||||
with:
|
with:
|
||||||
path: /tmp/neo4j.tar
|
path: /tmp/neo4j.tar
|
||||||
key: ${{ github.run_id }}-backend-neo4j-cache
|
key: ${{ github.run_id }}-backend-neo4j-cache
|
||||||
fail-on-cache-miss: true
|
fail-on-cache-miss: true
|
||||||
|
|
||||||
- name: Restore Backend cache
|
- name: Restore Backend cache
|
||||||
uses: actions/cache@5a3ec84eff668545956fd18022155c47e93e2684 # v4.0.2
|
uses: actions/cache@cdf6c1fa76f9f475f3d7449005a359c84ca0f306 # v4.0.2
|
||||||
with:
|
with:
|
||||||
path: /tmp/backend.tar
|
path: /tmp/backend.tar
|
||||||
key: ${{ github.run_id }}-backend-cache
|
key: ${{ github.run_id }}-backend-cache
|
||||||
@ -108,7 +113,6 @@ jobs:
|
|||||||
- name: backend | copy env files
|
- name: backend | copy env files
|
||||||
run: |
|
run: |
|
||||||
cp webapp/.env.template webapp/.env
|
cp webapp/.env.template webapp/.env
|
||||||
cp frontend/.env.dist frontend/.env
|
|
||||||
cp backend/.env.template backend/.env
|
cp backend/.env.template backend/.env
|
||||||
|
|
||||||
- name: backend | docker compose
|
- name: backend | docker compose
|
||||||
|
|||||||
41
.github/workflows/test-e2e.yml
vendored
41
.github/workflows/test-e2e.yml
vendored
@ -8,7 +8,7 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout code
|
- name: Checkout code
|
||||||
uses: actions/checkout@09d2acae674a48949e3602304ab46fd20ae0c42f # v4.2.2
|
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v4.2.2
|
||||||
|
|
||||||
- name: Copy backend env file
|
- name: Copy backend env file
|
||||||
run: |
|
run: |
|
||||||
@ -31,7 +31,7 @@ jobs:
|
|||||||
docker compose -f docker-compose.yml -f docker-compose.test.yml down
|
docker compose -f docker-compose.yml -f docker-compose.test.yml down
|
||||||
|
|
||||||
- name: Cache docker images
|
- name: Cache docker images
|
||||||
uses: actions/cache@5a3ec84eff668545956fd18022155c47e93e2684 # v4.0.2
|
uses: actions/cache@cdf6c1fa76f9f475f3d7449005a359c84ca0f306 # v4.0.2
|
||||||
with:
|
with:
|
||||||
path: |
|
path: |
|
||||||
/tmp/backend.tar
|
/tmp/backend.tar
|
||||||
@ -46,7 +46,7 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout code
|
- name: Checkout code
|
||||||
uses: actions/checkout@09d2acae674a48949e3602304ab46fd20ae0c42f # v4.2.2
|
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v4.2.2
|
||||||
|
|
||||||
- name: Copy backend env file
|
- name: Copy backend env file
|
||||||
run: |
|
run: |
|
||||||
@ -59,7 +59,7 @@ jobs:
|
|||||||
docker save "ghcr.io/ocelot-social-community/ocelot-social/webapp:test" > /tmp/webapp.tar
|
docker save "ghcr.io/ocelot-social-community/ocelot-social/webapp:test" > /tmp/webapp.tar
|
||||||
|
|
||||||
- name: Cache docker image
|
- name: Cache docker image
|
||||||
uses: actions/cache@5a3ec84eff668545956fd18022155c47e93e2684 # v4.0.2
|
uses: actions/cache@cdf6c1fa76f9f475f3d7449005a359c84ca0f306 # v4.0.2
|
||||||
with:
|
with:
|
||||||
path: /tmp/webapp.tar
|
path: /tmp/webapp.tar
|
||||||
key: ${{ github.run_id }}-e2e-webapp-cache
|
key: ${{ github.run_id }}-e2e-webapp-cache
|
||||||
@ -68,13 +68,16 @@ jobs:
|
|||||||
name: Fullstack | prepare cypress
|
name: Fullstack | prepare cypress
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
|
- name: Delete huge unnecessary tools folder
|
||||||
|
run: rm -rf /opt/hostedtoolcache
|
||||||
|
|
||||||
- name: Checkout code
|
- name: Checkout code
|
||||||
uses: actions/checkout@09d2acae674a48949e3602304ab46fd20ae0c42f # v4.2.2
|
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v4.2.2
|
||||||
|
|
||||||
- name: Setup Node.js
|
- name: Setup Node.js
|
||||||
uses: actions/setup-node@08f58d1471bff7f3a07d167b4ad7df25d5fcfcb6 # v4.4.0
|
uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v4.4.0
|
||||||
with:
|
with:
|
||||||
node-version-file: 'backend/.tool-versions'
|
node-version-file: 'backend/.nvmrc'
|
||||||
cache: 'yarn'
|
cache: 'yarn'
|
||||||
|
|
||||||
- name: Copy env files
|
- name: Copy env files
|
||||||
@ -84,7 +87,8 @@ jobs:
|
|||||||
|
|
||||||
- name: Install cypress requirements
|
- name: Install cypress requirements
|
||||||
run: |
|
run: |
|
||||||
wget --no-verbose -O /opt/cucumber-json-formatter "https://github.com/cucumber/json-formatter/releases/download/v19.0.0/cucumber-json-formatter-linux-386"
|
sudo wget --no-verbose -O /opt/cucumber-json-formatter "https://github.com/cucumber/json-formatter/releases/download/v19.0.0/cucumber-json-formatter-linux-386"
|
||||||
|
sudo chmod +x /opt/cucumber-json-formatter
|
||||||
cd backend
|
cd backend
|
||||||
yarn install
|
yarn install
|
||||||
yarn build
|
yarn build
|
||||||
@ -93,7 +97,7 @@ jobs:
|
|||||||
|
|
||||||
- name: Cache docker image
|
- name: Cache docker image
|
||||||
|
|
||||||
uses: actions/cache@5a3ec84eff668545956fd18022155c47e93e2684 # v4.0.2
|
uses: actions/cache@cdf6c1fa76f9f475f3d7449005a359c84ca0f306 # v4.0.2
|
||||||
with:
|
with:
|
||||||
path: |
|
path: |
|
||||||
/opt/cucumber-json-formatter
|
/opt/cucumber-json-formatter
|
||||||
@ -113,17 +117,20 @@ jobs:
|
|||||||
# run copies of the current job in parallel
|
# run copies of the current job in parallel
|
||||||
job: [1, 2, 3, 4, 5, 6, 7, 8]
|
job: [1, 2, 3, 4, 5, 6, 7, 8]
|
||||||
steps:
|
steps:
|
||||||
|
- name: Delete huge unnecessary tools folder
|
||||||
|
run: rm -rf /opt/hostedtoolcache
|
||||||
|
|
||||||
- name: Checkout code
|
- name: Checkout code
|
||||||
uses: actions/checkout@09d2acae674a48949e3602304ab46fd20ae0c42f # v4.2.2
|
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v4.2.2
|
||||||
|
|
||||||
- name: Setup Node.js
|
- name: Setup Node.js
|
||||||
uses: actions/setup-node@08f58d1471bff7f3a07d167b4ad7df25d5fcfcb6 # v4.4.0
|
uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v4.4.0
|
||||||
with:
|
with:
|
||||||
node-version-file: 'backend/.tool-versions'
|
node-version-file: 'backend/.nvmrc'
|
||||||
cache: 'yarn'
|
cache: 'yarn'
|
||||||
|
|
||||||
- name: Restore cypress cache
|
- name: Restore cypress cache
|
||||||
uses: actions/cache@5a3ec84eff668545956fd18022155c47e93e2684 # v4.0.2
|
uses: actions/cache@cdf6c1fa76f9f475f3d7449005a359c84ca0f306 # v4.0.2
|
||||||
with:
|
with:
|
||||||
path: |
|
path: |
|
||||||
/opt/cucumber-json-formatter
|
/opt/cucumber-json-formatter
|
||||||
@ -133,7 +140,7 @@ jobs:
|
|||||||
restore-keys: ${{ github.run_id }}-e2e-cypress
|
restore-keys: ${{ github.run_id }}-e2e-cypress
|
||||||
|
|
||||||
- name: Restore backend environment cache
|
- name: Restore backend environment cache
|
||||||
uses: actions/cache@5a3ec84eff668545956fd18022155c47e93e2684 # v4.0.2
|
uses: actions/cache@cdf6c1fa76f9f475f3d7449005a359c84ca0f306 # v4.0.2
|
||||||
with:
|
with:
|
||||||
path: |
|
path: |
|
||||||
/tmp/backend.tar
|
/tmp/backend.tar
|
||||||
@ -144,7 +151,7 @@ jobs:
|
|||||||
key: ${{ github.run_id }}-e2e-backend-environment-cache
|
key: ${{ github.run_id }}-e2e-backend-environment-cache
|
||||||
|
|
||||||
- name: Restore webapp cache
|
- name: Restore webapp cache
|
||||||
uses: actions/cache@5a3ec84eff668545956fd18022155c47e93e2684 # v4.0.2
|
uses: actions/cache@cdf6c1fa76f9f475f3d7449005a359c84ca0f306 # v4.0.2
|
||||||
with:
|
with:
|
||||||
path: /tmp/webapp.tar
|
path: /tmp/webapp.tar
|
||||||
key: ${{ github.run_id }}-e2e-webapp-cache
|
key: ${{ github.run_id }}-e2e-webapp-cache
|
||||||
@ -175,7 +182,7 @@ jobs:
|
|||||||
- name: Full stack tests | if tests failed, upload report
|
- name: Full stack tests | if tests failed, upload report
|
||||||
id: e2e-report
|
id: e2e-report
|
||||||
if: ${{ failure() && steps.e2e-tests.conclusion == 'failure' }}
|
if: ${{ failure() && steps.e2e-tests.conclusion == 'failure' }}
|
||||||
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
|
uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0
|
||||||
with:
|
with:
|
||||||
name: ocelot-e2e-test-report-pr${{ needs.docker_preparation.outputs.pr-number }}
|
name: ocelot-e2e-test-report-pr${{ needs.docker_preparation.outputs.pr-number }}
|
||||||
path: /home/runner/work/Ocelot-Social/Ocelot-Social/cypress/reports/cucumber_html_report
|
path: /home/runner/work/Ocelot-Social/Ocelot-Social/cypress/reports/cucumber_html_report
|
||||||
@ -187,7 +194,7 @@ jobs:
|
|||||||
continue-on-error: true
|
continue-on-error: true
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout code
|
- name: Checkout code
|
||||||
uses: actions/checkout@09d2acae674a48949e3602304ab46fd20ae0c42f # v4.2.2
|
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v4.2.2
|
||||||
|
|
||||||
- name: Full stack tests | cleanup cache
|
- name: Full stack tests | cleanup cache
|
||||||
run: |
|
run: |
|
||||||
|
|||||||
27
.github/workflows/test-webapp.yml
vendored
27
.github/workflows/test-webapp.yml
vendored
@ -11,7 +11,7 @@ jobs:
|
|||||||
docker: ${{ steps.changes.outputs.docker }}
|
docker: ${{ steps.changes.outputs.docker }}
|
||||||
webapp: ${{ steps.changes.outputs.webapp }}
|
webapp: ${{ steps.changes.outputs.webapp }}
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.1.7
|
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v4.1.7
|
||||||
|
|
||||||
- name: Check for frontend file changes
|
- name: Check for frontend file changes
|
||||||
uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2
|
uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2
|
||||||
@ -28,7 +28,12 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout code
|
- name: Checkout code
|
||||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.1.7
|
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v4.1.7
|
||||||
|
|
||||||
|
- name: Setup Node.js
|
||||||
|
uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v4.0.3
|
||||||
|
with:
|
||||||
|
node-version-file: 'webapp/.nvmrc'
|
||||||
|
|
||||||
- name: Check translation files
|
- name: Check translation files
|
||||||
run: |
|
run: |
|
||||||
@ -42,15 +47,15 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout code
|
- name: Checkout code
|
||||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.1.7
|
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v4.1.7
|
||||||
|
|
||||||
- name: Webapp | Build 'test' image
|
- name: Webapp | Build 'test' image
|
||||||
run: |
|
run: |
|
||||||
docker build --target test -t "ocelotsocialnetwork/webapp:test" webapp/
|
docker build --target test -f webapp/Dockerfile -t "ocelotsocialnetwork/webapp:test" .
|
||||||
docker save "ocelotsocialnetwork/webapp:test" > /tmp/webapp.tar
|
docker save "ocelotsocialnetwork/webapp:test" > /tmp/webapp.tar
|
||||||
|
|
||||||
- name: Cache docker image
|
- name: Cache docker image
|
||||||
uses: actions/cache@5a3ec84eff668545956fd18022155c47e93e2684 # v4.0.2
|
uses: actions/cache@cdf6c1fa76f9f475f3d7449005a359c84ca0f306 # v4.0.2
|
||||||
with:
|
with:
|
||||||
path: /tmp/webapp.tar
|
path: /tmp/webapp.tar
|
||||||
key: ${{ github.run_id }}-webapp-cache
|
key: ${{ github.run_id }}-webapp-cache
|
||||||
@ -62,7 +67,12 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout code
|
- name: Checkout code
|
||||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.1.7
|
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v4.1.7
|
||||||
|
|
||||||
|
- name: Setup Node.js
|
||||||
|
uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v4.0.3
|
||||||
|
with:
|
||||||
|
node-version-file: 'webapp/.nvmrc'
|
||||||
|
|
||||||
- name: webapp | Lint
|
- name: webapp | Lint
|
||||||
run: cd webapp && yarn && yarn run lint
|
run: cd webapp && yarn && yarn run lint
|
||||||
@ -76,10 +86,10 @@ jobs:
|
|||||||
checks: write
|
checks: write
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout code
|
- name: Checkout code
|
||||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.1.7
|
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v4.1.7
|
||||||
|
|
||||||
- name: Restore webapp cache
|
- name: Restore webapp cache
|
||||||
uses: actions/cache@5a3ec84eff668545956fd18022155c47e93e2684 # v4.0.2
|
uses: actions/cache@cdf6c1fa76f9f475f3d7449005a359c84ca0f306 # v4.0.2
|
||||||
with:
|
with:
|
||||||
path: /tmp/webapp.tar
|
path: /tmp/webapp.tar
|
||||||
key: ${{ github.run_id }}-webapp-cache
|
key: ${{ github.run_id }}-webapp-cache
|
||||||
@ -90,7 +100,6 @@ jobs:
|
|||||||
- name: Copy env files
|
- name: Copy env files
|
||||||
run: |
|
run: |
|
||||||
cp webapp/.env.template webapp/.env
|
cp webapp/.env.template webapp/.env
|
||||||
cp frontend/.env.dist frontend/.env
|
|
||||||
cp backend/.env.template backend/.env
|
cp backend/.env.template backend/.env
|
||||||
|
|
||||||
- name: backend | docker compose
|
- name: backend | docker compose
|
||||||
|
|||||||
4
.github/workflows/test.lint_pr.yml
vendored
4
.github/workflows/test.lint_pr.yml
vendored
@ -17,7 +17,7 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
if: ${{ github.actor != 'dependabot[bot]' }}
|
if: ${{ github.actor != 'dependabot[bot]' }}
|
||||||
steps:
|
steps:
|
||||||
- uses: amannn/action-semantic-pull-request@335288255954904a41ddda8947c8f2c844b8bfeb # v5.5.3
|
- uses: amannn/action-semantic-pull-request@069817c298f23fab00a8f29a2e556a5eac0f6390 # v5.5.3
|
||||||
env:
|
env:
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
with:
|
with:
|
||||||
@ -30,9 +30,9 @@ jobs:
|
|||||||
scopes: |
|
scopes: |
|
||||||
backend
|
backend
|
||||||
webapp
|
webapp
|
||||||
frontend
|
|
||||||
maintenance
|
maintenance
|
||||||
database
|
database
|
||||||
|
e2e
|
||||||
docu
|
docu
|
||||||
docker
|
docker
|
||||||
release
|
release
|
||||||
|
|||||||
3
.gitmodules
vendored
3
.gitmodules
vendored
@ -1,6 +1,3 @@
|
|||||||
[submodule "styleguide"]
|
|
||||||
path = styleguide
|
|
||||||
url = https://github.com/Human-Connection/Nitro-Styleguide.git
|
|
||||||
[submodule "deployment/configurations/stage.ocelot.social"]
|
[submodule "deployment/configurations/stage.ocelot.social"]
|
||||||
path = deployment/configurations/stage.ocelot.social
|
path = deployment/configurations/stage.ocelot.social
|
||||||
url = git@github.com:Ocelot-Social-Community/stage.ocelot.social.git
|
url = git@github.com:Ocelot-Social-Community/stage.ocelot.social.git
|
||||||
|
|||||||
@ -1 +0,0 @@
|
|||||||
nodejs 20.12.1
|
|
||||||
2635
CHANGELOG.md
2635
CHANGELOG.md
File diff suppressed because it is too large
Load Diff
@ -1,4 +1,4 @@
|
|||||||
DEBUG=true
|
DEBUG=neo4j-graphql-js
|
||||||
|
|
||||||
NEO4J_URI=bolt://localhost:7687
|
NEO4J_URI=bolt://localhost:7687
|
||||||
NEO4J_USERNAME=neo4j
|
NEO4J_USERNAME=neo4j
|
||||||
@ -19,7 +19,7 @@ SMTP_PASSWORD=
|
|||||||
SMTP_SECURE="false" # true for 465, false for other ports
|
SMTP_SECURE="false" # true for 465, false for other ports
|
||||||
SMTP_DKIM_DOMAINNAME=
|
SMTP_DKIM_DOMAINNAME=
|
||||||
SMTP_DKIM_KEYSELECTOR=
|
SMTP_DKIM_KEYSELECTOR=
|
||||||
SMTP_DKIM_PRIVATKEY=
|
SMTP_DKIM_PRIVATEKEY=
|
||||||
# E-Mail settings for our 'docker compose up mailserver'
|
# E-Mail settings for our 'docker compose up mailserver'
|
||||||
# SMTP_HOST=localhost
|
# SMTP_HOST=localhost
|
||||||
# SMTP_PORT=1025
|
# SMTP_PORT=1025
|
||||||
@ -33,8 +33,6 @@ JWT_SECRET="b/&&7b78BF&fv/Vd"
|
|||||||
JWT_EXPIRES="2y"
|
JWT_EXPIRES="2y"
|
||||||
MAPBOX_TOKEN="pk.eyJ1IjoiYnVzZmFrdG9yIiwiYSI6ImNraDNiM3JxcDBhaWQydG1uczhpZWtpOW4ifQ.7TNRTO-o9aK1Y6MyW_Nd4g"
|
MAPBOX_TOKEN="pk.eyJ1IjoiYnVzZmFrdG9yIiwiYSI6ImNraDNiM3JxcDBhaWQydG1uczhpZWtpOW4ifQ.7TNRTO-o9aK1Y6MyW_Nd4g"
|
||||||
|
|
||||||
PRIVATE_KEY_PASSPHRASE="a7dsf78sadg87ad87sfagsadg78"
|
|
||||||
|
|
||||||
SENTRY_DSN_BACKEND=
|
SENTRY_DSN_BACKEND=
|
||||||
COMMIT=
|
COMMIT=
|
||||||
PUBLIC_REGISTRATION=false
|
PUBLIC_REGISTRATION=false
|
||||||
@ -45,7 +43,9 @@ AWS_SECRET_ACCESS_KEY=12341234
|
|||||||
AWS_ENDPOINT=http://localhost:9000
|
AWS_ENDPOINT=http://localhost:9000
|
||||||
AWS_REGION=local
|
AWS_REGION=local
|
||||||
AWS_BUCKET=ocelot
|
AWS_BUCKET=ocelot
|
||||||
S3_PUBLIC_GATEWAY=http://localhost:8000
|
IMAGOR_PUBLIC_URL=http://localhost:8000
|
||||||
|
IMAGOR_SECRET=mysecret
|
||||||
|
|
||||||
CATEGORIES_ACTIVE=false
|
CATEGORIES_ACTIVE=false
|
||||||
MAX_PINNED_POSTS=1
|
MAX_PINNED_POSTS=1
|
||||||
|
MAX_GROUP_PINNED_POSTS=1
|
||||||
|
|||||||
@ -19,14 +19,12 @@ SMTP_PASSWORD=
|
|||||||
SMTP_SECURE="false" # true for 465, false for other ports
|
SMTP_SECURE="false" # true for 465, false for other ports
|
||||||
SMTP_DKIM_DOMAINNAME=
|
SMTP_DKIM_DOMAINNAME=
|
||||||
SMTP_DKIM_KEYSELECTOR=
|
SMTP_DKIM_KEYSELECTOR=
|
||||||
SMTP_DKIM_PRIVATKEY=
|
SMTP_DKIM_PRIVATEKEY=
|
||||||
|
|
||||||
JWT_SECRET="b/&&7b78BF&fv/Vd"
|
JWT_SECRET="b/&&7b78BF&fv/Vd"
|
||||||
JWT_EXPIRES="2y"
|
JWT_EXPIRES="2y"
|
||||||
MAPBOX_TOKEN="pk.eyJ1IjoiYnVzZmFrdG9yIiwiYSI6ImNraDNiM3JxcDBhaWQydG1uczhpZWtpOW4ifQ.7TNRTO-o9aK1Y6MyW_Nd4g"
|
MAPBOX_TOKEN="pk.eyJ1IjoiYnVzZmFrdG9yIiwiYSI6ImNraDNiM3JxcDBhaWQydG1uczhpZWtpOW4ifQ.7TNRTO-o9aK1Y6MyW_Nd4g"
|
||||||
|
|
||||||
PRIVATE_KEY_PASSPHRASE="a7dsf78sadg87ad87sfagsadg78"
|
|
||||||
|
|
||||||
SENTRY_DSN_BACKEND=
|
SENTRY_DSN_BACKEND=
|
||||||
COMMIT=
|
COMMIT=
|
||||||
PUBLIC_REGISTRATION=false
|
PUBLIC_REGISTRATION=false
|
||||||
@ -37,7 +35,9 @@ AWS_SECRET_ACCESS_KEY=12341234
|
|||||||
AWS_ENDPOINT=http://localhost:9000
|
AWS_ENDPOINT=http://localhost:9000
|
||||||
AWS_REGION=local
|
AWS_REGION=local
|
||||||
AWS_BUCKET=ocelot
|
AWS_BUCKET=ocelot
|
||||||
S3_PUBLIC_GATEWAY=http://localhost:8000
|
IMAGOR_PUBLIC_URL=http://localhost:8000
|
||||||
|
IMAGOR_SECRET=mysecret
|
||||||
|
|
||||||
CATEGORIES_ACTIVE=false
|
CATEGORIES_ACTIVE=false
|
||||||
MAX_PINNED_POSTS=1
|
MAX_PINNED_POSTS=1
|
||||||
|
MAX_GROUP_PINNED_POSTS=1
|
||||||
|
|||||||
@ -14,7 +14,6 @@ module.exports = {
|
|||||||
'plugin:import/recommended',
|
'plugin:import/recommended',
|
||||||
'plugin:import/typescript',
|
'plugin:import/typescript',
|
||||||
'plugin:promise/recommended',
|
'plugin:promise/recommended',
|
||||||
'plugin:security/recommended-legacy',
|
|
||||||
'plugin:@eslint-community/eslint-comments/recommended',
|
'plugin:@eslint-community/eslint-comments/recommended',
|
||||||
'prettier',
|
'prettier',
|
||||||
],
|
],
|
||||||
@ -175,6 +174,10 @@ module.exports = {
|
|||||||
'@eslint-community/eslint-comments/require-description': 'off',
|
'@eslint-community/eslint-comments/require-description': 'off',
|
||||||
},
|
},
|
||||||
overrides: [
|
overrides: [
|
||||||
|
{
|
||||||
|
files: ['*.js', '*.cjs', '*.ts', '*.tsx'],
|
||||||
|
extends: ['plugin:security/recommended-legacy'],
|
||||||
|
},
|
||||||
// only for ts files
|
// only for ts files
|
||||||
{
|
{
|
||||||
files: ['*.ts', '*.tsx'],
|
files: ['*.ts', '*.tsx'],
|
||||||
@ -228,5 +231,33 @@ module.exports = {
|
|||||||
files: ['*.json', '*.json5', '*.jsonc'],
|
files: ['*.json', '*.json5', '*.jsonc'],
|
||||||
parser: 'jsonc-eslint-parser',
|
parser: 'jsonc-eslint-parser',
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
files: ['*.graphql', '*.gql'],
|
||||||
|
parser: '@graphql-eslint/eslint-plugin',
|
||||||
|
plugins: ['@graphql-eslint'],
|
||||||
|
extends: ['plugin:@graphql-eslint/schema-recommended'],
|
||||||
|
rules: {
|
||||||
|
'@graphql-eslint/description-style': ['error', { style: 'inline' }],
|
||||||
|
'@graphql-eslint/require-description': 'off',
|
||||||
|
'@graphql-eslint/naming-convention': 'off',
|
||||||
|
'@graphql-eslint/strict-id-in-types': 'off',
|
||||||
|
'@graphql-eslint/no-typename-prefix': 'off',
|
||||||
|
// incompatible: `depends on a GraphQL validation rule "XXX" but it's not available in the "graphql" version you are using. Skipping…`
|
||||||
|
'@graphql-eslint/known-directives': 'off',
|
||||||
|
'@graphql-eslint/known-argument-names': 'off',
|
||||||
|
'@graphql-eslint/known-type-names': 'off',
|
||||||
|
'@graphql-eslint/lone-schema-definition': 'off',
|
||||||
|
'@graphql-eslint/provided-required-arguments': 'off',
|
||||||
|
'@graphql-eslint/unique-directive-names': 'off',
|
||||||
|
'@graphql-eslint/unique-directive-names-per-location': 'off',
|
||||||
|
'@graphql-eslint/unique-field-definition-names': 'off',
|
||||||
|
'@graphql-eslint/unique-operation-types': 'off',
|
||||||
|
'@graphql-eslint/unique-type-names': 'off',
|
||||||
|
},
|
||||||
|
parserOptions: {
|
||||||
|
schema: './src/graphql/types/**/*.gql',
|
||||||
|
assumeValid: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
],
|
],
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1 +1 @@
|
|||||||
v24.2.0
|
v25.3.0
|
||||||
|
|||||||
@ -1 +0,0 @@
|
|||||||
nodejs 24.2.0
|
|
||||||
@ -1,4 +1,4 @@
|
|||||||
FROM node:24.3.0-alpine AS base
|
FROM node:25.5.0-alpine AS base
|
||||||
LABEL org.label-schema.name="ocelot.social:backend"
|
LABEL org.label-schema.name="ocelot.social:backend"
|
||||||
LABEL org.label-schema.description="Backend of the Social Network Software ocelot.social"
|
LABEL org.label-schema.description="Backend of the Social Network Software ocelot.social"
|
||||||
LABEL org.label-schema.usage="https://github.com/Ocelot-Social-Community/Ocelot-Social/blob/master/README.md"
|
LABEL org.label-schema.usage="https://github.com/Ocelot-Social-Community/Ocelot-Social/blob/master/README.md"
|
||||||
|
|||||||
@ -19,18 +19,16 @@ Wait a little until your backend is up and running at [http://localhost:4000/](h
|
|||||||
## Installation without Docker
|
## Installation without Docker
|
||||||
|
|
||||||
For the local installation you need a recent version of
|
For the local installation you need a recent version of
|
||||||
[Node](https://nodejs.org/en/) (>= `v16.19.0`). We are using
|
[Node](https://nodejs.org/en/). We are using
|
||||||
`v24.2.0` and therefore we recommend to use the same version
|
`v25.3.0` and therefore we recommend to use the same version. You can use the
|
||||||
([see](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/4082)
|
|
||||||
some known problems with more recent node versions). You can use the
|
|
||||||
[node version manager](https://github.com/nvm-sh/nvm) `nvm` to switch
|
[node version manager](https://github.com/nvm-sh/nvm) `nvm` to switch
|
||||||
between different local Node versions:
|
between different local Node versions:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
# install Node
|
# install Node using '.nvmrc' file
|
||||||
$ cd backend
|
$ cd backend
|
||||||
$ nvm install v24.2.0
|
$ nvm install
|
||||||
$ nvm use v24.2.0
|
$ nvm use
|
||||||
```
|
```
|
||||||
|
|
||||||
Install node dependencies with [yarn](https://yarnpkg.com/en/):
|
Install node dependencies with [yarn](https://yarnpkg.com/en/):
|
||||||
|
|||||||
@ -18,7 +18,7 @@ module.exports = {
|
|||||||
],
|
],
|
||||||
coverageThreshold: {
|
coverageThreshold: {
|
||||||
global: {
|
global: {
|
||||||
lines: 90,
|
lines: 92,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
testMatch: ['**/src/**/?(*.)+(spec|test).ts?(x)'],
|
testMatch: ['**/src/**/?(*.)+(spec|test).ts?(x)'],
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "ocelot-social-backend",
|
"name": "ocelot-social-backend",
|
||||||
"version": "3.11.0",
|
"version": "3.13.1",
|
||||||
"description": "GraphQL Backend for ocelot.social",
|
"description": "GraphQL Backend for ocelot.social",
|
||||||
"repository": "https://github.com/Ocelot-Social-Community/Ocelot-Social",
|
"repository": "https://github.com/Ocelot-Social-Community/Ocelot-Social",
|
||||||
"author": "ocelot.social Community",
|
"author": "ocelot.social Community",
|
||||||
@ -12,7 +12,7 @@
|
|||||||
"build": "tsc && tsc-alias && ./scripts/build.copy.files.sh",
|
"build": "tsc && tsc-alias && ./scripts/build.copy.files.sh",
|
||||||
"dev": "nodemon --exec ts-node --require tsconfig-paths/register src/index.ts -e js,ts,gql",
|
"dev": "nodemon --exec ts-node --require tsconfig-paths/register src/index.ts -e js,ts,gql",
|
||||||
"dev:debug": "nodemon --exec node --inspect=0.0.0.0:9229 build/src/index.js -e js,ts,gql",
|
"dev:debug": "nodemon --exec node --inspect=0.0.0.0:9229 build/src/index.js -e js,ts,gql",
|
||||||
"lint": "eslint --max-warnings=0 --report-unused-disable-directives --ext .js,.ts,.cjs,.json,.json5,.jsonc .",
|
"lint": "eslint --max-warnings=0 --report-unused-disable-directives --ext .js,.ts,.cjs,.json,.json5,.jsonc,.graphql,.gql .",
|
||||||
"test": "cross-env NODE_ENV=test NODE_OPTIONS=--max-old-space-size=8192 jest --runInBand --coverage --forceExit --detectOpenHandles",
|
"test": "cross-env NODE_ENV=test NODE_OPTIONS=--max-old-space-size=8192 jest --runInBand --coverage --forceExit --detectOpenHandles",
|
||||||
"db:reset": "ts-node --require tsconfig-paths/register src/db/reset.ts",
|
"db:reset": "ts-node --require tsconfig-paths/register src/db/reset.ts",
|
||||||
"db:reset:withmigrations": "ts-node --require tsconfig-paths/register src/db/reset-with-migrations.ts",
|
"db:reset:withmigrations": "ts-node --require tsconfig-paths/register src/db/reset-with-migrations.ts",
|
||||||
@ -23,26 +23,29 @@
|
|||||||
"db:data:categories": "ts-node --require tsconfig-paths/register src/db/categories.ts",
|
"db:data:categories": "ts-node --require tsconfig-paths/register src/db/categories.ts",
|
||||||
"db:migrate": "migrate --compiler 'ts:./src/db/compiler.ts' --migrations-dir ./src/db/migrations --store ./src/db/migrate/store.ts",
|
"db:migrate": "migrate --compiler 'ts:./src/db/compiler.ts' --migrations-dir ./src/db/migrations --store ./src/db/migrate/store.ts",
|
||||||
"db:migrate:create": "migrate --compiler 'ts:./src/db/compiler.ts' --migrations-dir ./src/db/migrations --template-file ./src/db/migrate/template.ts --date-format 'yyyymmddHHmmss' create",
|
"db:migrate:create": "migrate --compiler 'ts:./src/db/compiler.ts' --migrations-dir ./src/db/migrations --template-file ./src/db/migrate/template.ts --date-format 'yyyymmddHHmmss' create",
|
||||||
|
"db:func:disable:notifications": "ts-node --require tsconfig-paths/register src/db/disable-notifications.ts",
|
||||||
"prod:migrate": "migrate --migrations-dir ./build/src/db/migrations --store ./build/src/db/migrate/store.js",
|
"prod:migrate": "migrate --migrations-dir ./build/src/db/migrations --store ./build/src/db/migrate/store.js",
|
||||||
"prod:db:data:branding": "node build/src/db/data-branding.js",
|
"prod:db:data:branding": "node build/src/db/data-branding.js",
|
||||||
"prod:db:data:categories": "node build/src/db/categories.js"
|
"prod:db:data:categories": "node build/src/db/categories.js",
|
||||||
|
"prod:db:data:admin": "node build/src/db/admin.js",
|
||||||
|
"prod:db:func:disable:notifications": "node build/src/db/disable-notifications.js"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@aws-sdk/client-s3": "^3.842.0",
|
"@aws-sdk/client-s3": "^3.980.0",
|
||||||
"@aws-sdk/lib-storage": "^3.842.0",
|
"@aws-sdk/lib-storage": "^3.980.0",
|
||||||
"@sentry/node": "^5.15.4",
|
"@sentry/node": "^5.30.0",
|
||||||
"@types/mime-types": "^3.0.1",
|
"@types/mime-types": "^3.0.1",
|
||||||
"apollo-server": "~2.14.2",
|
"apollo-server": "~2.14.2",
|
||||||
"apollo-server-express": "^2.14.2",
|
"apollo-server-express": "^2.14.2",
|
||||||
"bcryptjs": "~3.0.2",
|
"bcryptjs": "~3.0.3",
|
||||||
"body-parser": "^1.20.3",
|
"body-parser": "^1.20.3",
|
||||||
"cheerio": "~1.1.0",
|
"cheerio": "~1.2.0",
|
||||||
"cross-env": "~7.0.3",
|
"cross-env": "~10.1.0",
|
||||||
"dotenv": "~17.0.1",
|
"dotenv": "~17.0.1",
|
||||||
"email-templates": "^12.0.3",
|
"email-templates": "^12.0.3",
|
||||||
"express": "^5.1.0",
|
"express": "^4.22.1",
|
||||||
"graphql": "^14.6.0",
|
"graphql": "^14.6.0",
|
||||||
"graphql-middleware": "~4.0.2",
|
"graphql-middleware": "~6.1.35",
|
||||||
"graphql-middleware-sentry": "^3.2.1",
|
"graphql-middleware-sentry": "^3.2.1",
|
||||||
"graphql-redis-subscriptions": "^2.7.0",
|
"graphql-redis-subscriptions": "^2.7.0",
|
||||||
"graphql-shield": "~7.2.2",
|
"graphql-shield": "~7.2.2",
|
||||||
@ -50,79 +53,80 @@
|
|||||||
"graphql-tag": "~2.10.3",
|
"graphql-tag": "~2.10.3",
|
||||||
"graphql-upload": "^13.0.0",
|
"graphql-upload": "^13.0.0",
|
||||||
"helmet": "~8.1.0",
|
"helmet": "~8.1.0",
|
||||||
"ioredis": "^5.6.1",
|
"ioredis": "^5.9.2",
|
||||||
"jsonwebtoken": "~8.5.1",
|
"jsonwebtoken": "~8.5.1",
|
||||||
"languagedetect": "^2.0.0",
|
"languagedetect": "^2.0.0",
|
||||||
"linkify-html": "^4.3.1",
|
"linkify-html": "^4.3.2",
|
||||||
"linkifyjs": "^4.3.1",
|
"linkifyjs": "^4.3.2",
|
||||||
"lodash": "~4.17.21",
|
"lodash": "~4.17.23",
|
||||||
"merge-graphql-schemas": "^1.7.8",
|
"merge-graphql-schemas": "^1.7.8",
|
||||||
"metascraper": "^5.49.1",
|
"metascraper": "^5.49.19",
|
||||||
"metascraper-author": "^5.49.1",
|
"metascraper-author": "^5.49.19",
|
||||||
"metascraper-date": "^5.49.1",
|
"metascraper-date": "^5.49.19",
|
||||||
"metascraper-description": "^5.49.1",
|
"metascraper-description": "^5.49.19",
|
||||||
"metascraper-image": "^5.49.1",
|
"metascraper-image": "^5.49.19",
|
||||||
"metascraper-lang": "^5.49.1",
|
"metascraper-lang": "^5.49.19",
|
||||||
"metascraper-lang-detector": "^4.10.2",
|
"metascraper-lang-detector": "^4.10.2",
|
||||||
"metascraper-logo": "^5.49.1",
|
"metascraper-logo": "^5.49.19",
|
||||||
"metascraper-publisher": "^5.49.1",
|
"metascraper-publisher": "^5.49.19",
|
||||||
"metascraper-soundcloud": "^5.34.4",
|
"metascraper-soundcloud": "^5.34.4",
|
||||||
"metascraper-title": "^5.49.1",
|
"metascraper-title": "^5.49.19",
|
||||||
"metascraper-url": "^5.49.1",
|
"metascraper-url": "^5.49.19",
|
||||||
"metascraper-video": "^5.49.1",
|
"metascraper-video": "^5.49.19",
|
||||||
"metascraper-youtube": "^5.49.1",
|
"metascraper-youtube": "^5.49.20",
|
||||||
"migrate": "^2.1.0",
|
"migrate": "^2.1.0",
|
||||||
"mime-types": "^3.0.1",
|
"mime-types": "^3.0.2",
|
||||||
"minimatch": "^10.0.3",
|
"minimatch": "^10.1.1",
|
||||||
"mustache": "^4.2.0",
|
"mustache": "^4.2.0",
|
||||||
"neo4j-driver": "^4.4.11",
|
"neo4j-driver": "^4.4.11",
|
||||||
"neo4j-graphql-js": "^2.11.5",
|
"neo4j-graphql-js": "2.11.5",
|
||||||
"neode": "^0.4.9",
|
"neode": "^0.4.9",
|
||||||
"node-fetch": "^2.7.0",
|
"node-fetch": "^2.7.0",
|
||||||
"nodemailer": "^7.0.3",
|
"nodemailer": "^7.0.12",
|
||||||
"nodemailer-html-to-text": "^3.2.0",
|
"nodemailer-html-to-text": "^3.2.0",
|
||||||
"preview-email": "^3.1.0",
|
"preview-email": "^3.1.1",
|
||||||
"pug": "^3.0.3",
|
"pug": "^3.0.3",
|
||||||
"sanitize-html": "~2.17.0",
|
"sanitize-html": "~2.17.0",
|
||||||
"slug": "~9.1.0",
|
"slugify": "^1.6.6",
|
||||||
"trunc-html": "~1.1.2",
|
"trunc-html": "~1.1.2",
|
||||||
"tslog": "^4.9.3",
|
"tslog": "^4.10.2",
|
||||||
"uuid": "~9.0.1",
|
"uuid": "~9.0.1",
|
||||||
"validator": "^13.15.15",
|
"validator": "^13.15.26",
|
||||||
"xregexp": "^5.1.2"
|
"xregexp": "^5.1.2"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@eslint-community/eslint-plugin-eslint-comments": "^4.5.0",
|
"@eslint-community/eslint-plugin-eslint-comments": "^4.6.0",
|
||||||
"@faker-js/faker": "9.8.0",
|
"@faker-js/faker": "9.9.0",
|
||||||
|
"@graphql-eslint/eslint-plugin": "^3.20.1",
|
||||||
"@types/email-templates": "^10.0.4",
|
"@types/email-templates": "^10.0.4",
|
||||||
"@types/jest": "^29.5.14",
|
"@types/jest": "^30.0.0",
|
||||||
"@types/jsonwebtoken": "~8.5.1",
|
"@types/jsonwebtoken": "~8.5.1",
|
||||||
"@types/lodash": "^4.17.19",
|
"@types/lodash": "^4.17.23",
|
||||||
"@types/node": "^24.0.10",
|
"@types/node": "^25.1.0",
|
||||||
"@types/request": "^2.48.12",
|
"@types/request": "^2.48.13",
|
||||||
"@types/slug": "^5.0.9",
|
"@types/slug": "^5.0.9",
|
||||||
"@types/uuid": "~9.0.1",
|
"@types/uuid": "~9.0.1",
|
||||||
"@typescript-eslint/eslint-plugin": "^5.62.0",
|
"@typescript-eslint/eslint-plugin": "^5.62.0",
|
||||||
"@typescript-eslint/parser": "^5.62.0",
|
"@typescript-eslint/parser": "^5.62.0",
|
||||||
"apollo-server-testing": "~2.11.0",
|
"apollo-server-testing": "~2.11.0",
|
||||||
"eslint": "^8.57.1",
|
"eslint": "^8.57.1",
|
||||||
"eslint-config-prettier": "^10.1.5",
|
"eslint-config-prettier": "^10.1.8",
|
||||||
"eslint-config-standard": "^17.1.0",
|
"eslint-config-standard": "^17.1.0",
|
||||||
"eslint-import-resolver-typescript": "^4.4.4",
|
"eslint-import-resolver-typescript": "^4.4.4",
|
||||||
"eslint-plugin-import": "^2.32.0",
|
"eslint-plugin-import": "^2.32.0",
|
||||||
"eslint-plugin-jest": "^29.0.1",
|
"eslint-plugin-jest": "^29.12.1",
|
||||||
"eslint-plugin-jsonc": "^2.20.1",
|
"eslint-plugin-jsonc": "^2.21.0",
|
||||||
"eslint-plugin-n": "^17.20.0",
|
"eslint-plugin-n": "^17.23.2",
|
||||||
"eslint-plugin-no-catch-all": "^1.1.0",
|
"eslint-plugin-no-catch-all": "^1.1.0",
|
||||||
"eslint-plugin-prettier": "^5.5.1",
|
"eslint-plugin-prettier": "^5.5.5",
|
||||||
"eslint-plugin-promise": "^7.2.1",
|
"eslint-plugin-promise": "^7.2.1",
|
||||||
"eslint-plugin-security": "^3.0.1",
|
"eslint-plugin-security": "^3.0.1",
|
||||||
"jest": "^29.7.0",
|
"jest": "^30.2.0",
|
||||||
"nodemon": "~3.1.10",
|
"nodemon": "~3.1.11",
|
||||||
"prettier": "^3.6.2",
|
"prettier": "^3.8.1",
|
||||||
"require-json5": "^1.3.0",
|
"require-json5": "^1.3.0",
|
||||||
"rosie": "^2.1.1",
|
"rosie": "^2.1.1",
|
||||||
"ts-jest": "^29.4.0",
|
"ts-jest": "^29.4.6",
|
||||||
"ts-node": "^10.9.2",
|
"ts-node": "^10.9.2",
|
||||||
"tsc-alias": "^1.8.16",
|
"tsc-alias": "^1.8.16",
|
||||||
"tsconfig-paths": "^4.2.0",
|
"tsconfig-paths": "^4.2.0",
|
||||||
@ -133,7 +137,9 @@
|
|||||||
"**/graphql-upload": "^11.0.0",
|
"**/graphql-upload": "^11.0.0",
|
||||||
"**/strip-ansi": "6.0.1",
|
"**/strip-ansi": "6.0.1",
|
||||||
"**/string-width": "4.2.0",
|
"**/string-width": "4.2.0",
|
||||||
"**/wrap-ansi": "7.0.0"
|
"**/wrap-ansi": "7.0.0",
|
||||||
|
"**/jwa": "^2.0.1",
|
||||||
|
"**/@types/express": "4.17.25"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=20.12.1"
|
"node": ">=20.12.1"
|
||||||
|
|||||||
@ -30,29 +30,9 @@ const environment = {
|
|||||||
: [],
|
: [],
|
||||||
SEND_MAIL: env.NODE_ENV !== 'test',
|
SEND_MAIL: env.NODE_ENV !== 'test',
|
||||||
LOG_LEVEL: 'DEBUG',
|
LOG_LEVEL: 'DEBUG',
|
||||||
|
PROXY_S3: env.PROXY_S3,
|
||||||
}
|
}
|
||||||
|
|
||||||
const required = {
|
|
||||||
MAPBOX_TOKEN: env.MAPBOX_TOKEN,
|
|
||||||
JWT_SECRET: env.JWT_SECRET,
|
|
||||||
PRIVATE_KEY_PASSPHRASE: env.PRIVATE_KEY_PASSPHRASE,
|
|
||||||
}
|
|
||||||
|
|
||||||
// https://stackoverflow.com/a/53050575
|
|
||||||
type NoUndefinedField<T> = { [P in keyof T]-?: NoUndefinedField<NonNullable<T[P]>> }
|
|
||||||
|
|
||||||
function assertRequiredConfig(
|
|
||||||
conf: typeof required,
|
|
||||||
): asserts conf is NoUndefinedField<typeof required> {
|
|
||||||
Object.entries(conf).forEach(([key, value]) => {
|
|
||||||
if (!value) {
|
|
||||||
throw new Error(`ERROR: "${key}" env variable is missing.`)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
assertRequiredConfig(required)
|
|
||||||
|
|
||||||
const server = {
|
const server = {
|
||||||
CLIENT_URI: env.CLIENT_URI ?? 'http://localhost:3000',
|
CLIENT_URI: env.CLIENT_URI ?? 'http://localhost:3000',
|
||||||
GRAPHQL_URI: env.GRAPHQL_URI ?? 'http://localhost:4000',
|
GRAPHQL_URI: env.GRAPHQL_URI ?? 'http://localhost:4000',
|
||||||
@ -68,7 +48,7 @@ const SMTP_PASSWORD = env.SMTP_PASSWORD
|
|||||||
const SMTP_DKIM_DOMAINNAME = env.SMTP_DKIM_DOMAINNAME
|
const SMTP_DKIM_DOMAINNAME = env.SMTP_DKIM_DOMAINNAME
|
||||||
const SMTP_DKIM_KEYSELECTOR = env.SMTP_DKIM_KEYSELECTOR
|
const SMTP_DKIM_KEYSELECTOR = env.SMTP_DKIM_KEYSELECTOR
|
||||||
// PEM format = https://docs.progress.com/bundle/datadirect-hybrid-data-pipeline-installation-46/page/PEM-file-format.html
|
// PEM format = https://docs.progress.com/bundle/datadirect-hybrid-data-pipeline-installation-46/page/PEM-file-format.html
|
||||||
const SMTP_DKIM_PRIVATKEY = env.SMTP_DKIM_PRIVATKEY?.replace(/\\n/g, '\n') // replace all "\n" in .env string by real line break
|
const SMTP_DKIM_PRIVATEKEY = env.SMTP_DKIM_PRIVATEKEY?.replace(/\\n/g, '\n') // replace all "\n" in .env string by real line break
|
||||||
const SMTP_MAX_CONNECTIONS = (env.SMTP_MAX_CONNECTIONS && parseInt(env.SMTP_MAX_CONNECTIONS)) || 5
|
const SMTP_MAX_CONNECTIONS = (env.SMTP_MAX_CONNECTIONS && parseInt(env.SMTP_MAX_CONNECTIONS)) || 5
|
||||||
const SMTP_MAX_MESSAGES = (env.SMTP_MAX_MESSAGES && parseInt(env.SMTP_MAX_MESSAGES)) || 100
|
const SMTP_MAX_MESSAGES = (env.SMTP_MAX_MESSAGES && parseInt(env.SMTP_MAX_MESSAGES)) || 100
|
||||||
|
|
||||||
@ -87,11 +67,11 @@ if (SMTP_USERNAME && SMTP_PASSWORD) {
|
|||||||
pass: SMTP_PASSWORD,
|
pass: SMTP_PASSWORD,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (SMTP_DKIM_DOMAINNAME && SMTP_DKIM_KEYSELECTOR && SMTP_DKIM_PRIVATKEY) {
|
if (SMTP_DKIM_DOMAINNAME && SMTP_DKIM_KEYSELECTOR && SMTP_DKIM_PRIVATEKEY) {
|
||||||
nodemailerTransportOptions.dkim = {
|
nodemailerTransportOptions.dkim = {
|
||||||
domainName: SMTP_DKIM_DOMAINNAME,
|
domainName: SMTP_DKIM_DOMAINNAME,
|
||||||
keySelector: SMTP_DKIM_KEYSELECTOR,
|
keySelector: SMTP_DKIM_KEYSELECTOR,
|
||||||
privateKey: SMTP_DKIM_PRIVATKEY,
|
privateKey: SMTP_DKIM_PRIVATEKEY,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -112,36 +92,38 @@ const redis = {
|
|||||||
REDIS_PASSWORD: env.REDIS_PASSWORD,
|
REDIS_PASSWORD: env.REDIS_PASSWORD,
|
||||||
}
|
}
|
||||||
|
|
||||||
const s3 = {
|
const required = {
|
||||||
|
EMAIL_DEFAULT_SENDER: env.EMAIL_DEFAULT_SENDER,
|
||||||
|
|
||||||
AWS_ACCESS_KEY_ID: env.AWS_ACCESS_KEY_ID,
|
AWS_ACCESS_KEY_ID: env.AWS_ACCESS_KEY_ID,
|
||||||
AWS_SECRET_ACCESS_KEY: env.AWS_SECRET_ACCESS_KEY,
|
AWS_SECRET_ACCESS_KEY: env.AWS_SECRET_ACCESS_KEY,
|
||||||
AWS_ENDPOINT: env.AWS_ENDPOINT,
|
AWS_ENDPOINT: env.AWS_ENDPOINT,
|
||||||
AWS_REGION: env.AWS_REGION,
|
AWS_REGION: env.AWS_REGION,
|
||||||
AWS_BUCKET: env.AWS_BUCKET,
|
AWS_BUCKET: env.AWS_BUCKET,
|
||||||
S3_PUBLIC_GATEWAY: env.S3_PUBLIC_GATEWAY,
|
|
||||||
|
IMAGOR_PUBLIC_URL: env.IMAGOR_PUBLIC_URL,
|
||||||
|
IMAGOR_SECRET: env.IMAGOR_SECRET,
|
||||||
|
|
||||||
|
MAPBOX_TOKEN: env.MAPBOX_TOKEN,
|
||||||
|
JWT_SECRET: env.JWT_SECRET,
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface S3Configured {
|
// https://stackoverflow.com/a/53050575
|
||||||
AWS_ACCESS_KEY_ID: string
|
type NoUndefinedField<T> = { [P in keyof T]-?: NoUndefinedField<NonNullable<T[P]>> }
|
||||||
AWS_SECRET_ACCESS_KEY: string
|
|
||||||
AWS_ENDPOINT: string
|
function assertRequiredConfig(
|
||||||
AWS_REGION: string
|
conf: typeof required,
|
||||||
AWS_BUCKET: string
|
): asserts conf is NoUndefinedField<typeof required> {
|
||||||
S3_PUBLIC_GATEWAY: string | undefined
|
Object.entries(conf).forEach(([key, value]) => {
|
||||||
|
if (!value) {
|
||||||
|
throw new Error(`ERROR: "${key}" env variable is missing.`)
|
||||||
|
}
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
export const isS3configured = (config: typeof s3): config is S3Configured => {
|
assertRequiredConfig(required)
|
||||||
return !!(
|
|
||||||
config.AWS_ACCESS_KEY_ID &&
|
|
||||||
config.AWS_SECRET_ACCESS_KEY &&
|
|
||||||
config.AWS_ENDPOINT &&
|
|
||||||
config.AWS_REGION &&
|
|
||||||
config.AWS_BUCKET
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
const options = {
|
const options = {
|
||||||
EMAIL_DEFAULT_SENDER: env.EMAIL_DEFAULT_SENDER,
|
|
||||||
SUPPORT_EMAIL: env.SUPPORT_EMAIL,
|
SUPPORT_EMAIL: env.SUPPORT_EMAIL,
|
||||||
SUPPORT_URL: emails.SUPPORT_LINK,
|
SUPPORT_URL: emails.SUPPORT_LINK,
|
||||||
APPLICATION_NAME: metadata.APPLICATION_NAME,
|
APPLICATION_NAME: metadata.APPLICATION_NAME,
|
||||||
@ -156,6 +138,9 @@ const options = {
|
|||||||
MAX_PINNED_POSTS: Number.isNaN(Number(process.env.MAX_PINNED_POSTS))
|
MAX_PINNED_POSTS: Number.isNaN(Number(process.env.MAX_PINNED_POSTS))
|
||||||
? 1
|
? 1
|
||||||
: Number(process.env.MAX_PINNED_POSTS),
|
: Number(process.env.MAX_PINNED_POSTS),
|
||||||
|
MAX_GROUP_PINNED_POSTS: Number.isNaN(Number(process.env.MAX_GROUP_PINNED_POSTS))
|
||||||
|
? 1
|
||||||
|
: Number(process.env.MAX_GROUP_PINNED_POSTS),
|
||||||
}
|
}
|
||||||
|
|
||||||
const language = {
|
const language = {
|
||||||
@ -169,12 +154,21 @@ const CONFIG = {
|
|||||||
...neo4j,
|
...neo4j,
|
||||||
...sentry,
|
...sentry,
|
||||||
...redis,
|
...redis,
|
||||||
...s3,
|
|
||||||
...options,
|
...options,
|
||||||
...language,
|
...language,
|
||||||
}
|
}
|
||||||
|
|
||||||
export type Config = typeof CONFIG
|
export type Config = typeof CONFIG
|
||||||
|
export type S3Config = Pick<
|
||||||
|
Config,
|
||||||
|
| 'AWS_ACCESS_KEY_ID'
|
||||||
|
| 'AWS_SECRET_ACCESS_KEY'
|
||||||
|
| 'AWS_ENDPOINT'
|
||||||
|
| 'AWS_REGION'
|
||||||
|
| 'AWS_BUCKET'
|
||||||
|
| 'IMAGOR_SECRET'
|
||||||
|
| 'IMAGOR_PUBLIC_URL'
|
||||||
|
>
|
||||||
export default CONFIG
|
export default CONFIG
|
||||||
|
|
||||||
export { nodemailerTransportOptions }
|
export { nodemailerTransportOptions }
|
||||||
|
|||||||
61
backend/src/db/disable-notifications.ts
Normal file
61
backend/src/db/disable-notifications.ts
Normal file
@ -0,0 +1,61 @@
|
|||||||
|
import databaseContext from '@context/database'
|
||||||
|
|
||||||
|
const run = async () => {
|
||||||
|
const args = process.argv.slice(2)
|
||||||
|
|
||||||
|
if (args.length !== 1) {
|
||||||
|
// eslint-disable-next-line no-console
|
||||||
|
console.error('Usage: yarn run db:func:disable-notifications <email>')
|
||||||
|
// eslint-disable-next-line n/no-process-exit
|
||||||
|
process.exit(1)
|
||||||
|
}
|
||||||
|
|
||||||
|
const email = args[0]
|
||||||
|
|
||||||
|
const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/
|
||||||
|
if (!emailRegex.test(email)) {
|
||||||
|
// eslint-disable-next-line no-console
|
||||||
|
console.error('Error: Invalid email address format')
|
||||||
|
// eslint-disable-next-line n/no-process-exit
|
||||||
|
process.exit(1)
|
||||||
|
}
|
||||||
|
|
||||||
|
const { write } = databaseContext()
|
||||||
|
|
||||||
|
const result = (
|
||||||
|
await write({
|
||||||
|
query: `
|
||||||
|
MATCH (:EmailAddress {email: $email})-[:BELONGS_TO]->(user:User)
|
||||||
|
SET user.emailNotificationsFollowingUsers = false
|
||||||
|
SET user.emailNotificationsPostInGroup = false
|
||||||
|
SET user.emailNotificationsCommentOnObservedPost = false
|
||||||
|
SET user.emailNotificationsMention = false
|
||||||
|
SET user.emailNotificationsChatMessage = false
|
||||||
|
SET user.emailNotificationsGroupMemberJoined = false
|
||||||
|
SET user.emailNotificationsGroupMemberLeft = false
|
||||||
|
SET user.emailNotificationsGroupMemberRemoved = false
|
||||||
|
SET user.emailNotificationsGroupMemberRoleChanged = false
|
||||||
|
RETURN toString(count(user)) as count
|
||||||
|
`,
|
||||||
|
variables: {
|
||||||
|
email,
|
||||||
|
},
|
||||||
|
})
|
||||||
|
).records[0].get('count') as string
|
||||||
|
|
||||||
|
if (result !== '1') {
|
||||||
|
// eslint-disable-next-line no-console
|
||||||
|
console.error(`User with email address ${email} not found`)
|
||||||
|
// eslint-disable-next-line n/no-process-exit
|
||||||
|
process.exit(1)
|
||||||
|
}
|
||||||
|
|
||||||
|
// eslint-disable-next-line no-console
|
||||||
|
console.log(`Notifications for User with email address ${email} disabled`)
|
||||||
|
// eslint-disable-next-line n/no-process-exit
|
||||||
|
process.exit(0)
|
||||||
|
}
|
||||||
|
|
||||||
|
void (async function () {
|
||||||
|
await run()
|
||||||
|
})()
|
||||||
@ -7,7 +7,7 @@
|
|||||||
import { faker } from '@faker-js/faker'
|
import { faker } from '@faker-js/faker'
|
||||||
import { hashSync } from 'bcryptjs'
|
import { hashSync } from 'bcryptjs'
|
||||||
import { Factory } from 'rosie'
|
import { Factory } from 'rosie'
|
||||||
import slugify from 'slug'
|
import slugify from 'slugify'
|
||||||
import { v4 as uuid } from 'uuid'
|
import { v4 as uuid } from 'uuid'
|
||||||
|
|
||||||
import { generateInviteCode } from '@graphql/resolvers/inviteCodes'
|
import { generateInviteCode } from '@graphql/resolvers/inviteCodes'
|
||||||
|
|||||||
@ -37,42 +37,38 @@ export async function up(_next) {
|
|||||||
urls = urls.filter((url) => url.startsWith('/uploads'))
|
urls = urls.filter((url) => url.startsWith('/uploads'))
|
||||||
// eslint-disable-next-line no-console
|
// eslint-disable-next-line no-console
|
||||||
console.log('URLS uploaded:')
|
console.log('URLS uploaded:')
|
||||||
await Promise.all(
|
for await (const url of urls) {
|
||||||
urls
|
const { pathname } = new URL(url, 'http://example.org')
|
||||||
.map((url) => async () => {
|
// TODO: find a better way to do this - this is quite a hack
|
||||||
const { pathname } = new URL(url, 'http://example.org')
|
const fileLocation =
|
||||||
// TODO: find a better way to do this - this is quite a hack
|
CONFIG.NODE_ENV === 'production'
|
||||||
const fileLocation =
|
? path.join(__dirname, `../../../../public/${pathname}`) // we're in the /build folder
|
||||||
CONFIG.NODE_ENV === 'production'
|
: path.join(__dirname, `../../../public/${pathname}`)
|
||||||
? path.join(__dirname, `../../../../public/${pathname}`) // we're in the /build folder
|
const s3Location = `original${pathname}`
|
||||||
: path.join(__dirname, `../../../public/${pathname}`)
|
const mimeType = lookup(fileLocation)
|
||||||
const s3Location = `original${pathname}`
|
// eslint-disable-next-line security/detect-non-literal-fs-filename
|
||||||
const mimeType = lookup(fileLocation)
|
const fileHandle = await open(fileLocation)
|
||||||
// eslint-disable-next-line security/detect-non-literal-fs-filename
|
const params = {
|
||||||
const fileHandle = await open(fileLocation)
|
Bucket: AWS_BUCKET,
|
||||||
const params = {
|
Key: s3Location,
|
||||||
Bucket: AWS_BUCKET,
|
ACL: ObjectCannedACL.public_read,
|
||||||
Key: s3Location,
|
ContentType: mimeType || 'image/jpeg',
|
||||||
ACL: ObjectCannedACL.public_read,
|
Body: fileHandle.createReadStream(),
|
||||||
ContentType: mimeType || 'image/jpeg',
|
}
|
||||||
Body: fileHandle.createReadStream(),
|
const command = new Upload({ client: s3, params })
|
||||||
}
|
|
||||||
const command = new Upload({ client: s3, params })
|
|
||||||
|
|
||||||
const data = await command.done()
|
const data = await command.done()
|
||||||
const { Location: spacesUrl } = data
|
const { Location: spacesUrl } = data
|
||||||
|
|
||||||
const updatedRecord = await transaction.run(
|
const updatedRecord = await transaction.run(
|
||||||
'MATCH (image:Image {url: $url}) SET image.url = $spacesUrl RETURN image.url as url',
|
'MATCH (image:Image {url: $url}) SET image.url = $spacesUrl RETURN image.url as url',
|
||||||
{ url, spacesUrl },
|
{ url, spacesUrl },
|
||||||
)
|
)
|
||||||
const [updatedUrl] = updatedRecord.records.map((record) => record.get('url') as string)
|
const [updatedUrl] = updatedRecord.records.map((record) => record.get('url') as string)
|
||||||
// eslint-disable-next-line no-console
|
// eslint-disable-next-line no-console
|
||||||
console.log(updatedUrl)
|
console.log(updatedUrl)
|
||||||
return updatedUrl
|
// return updatedUrl
|
||||||
})
|
}
|
||||||
.map((p) => p()),
|
|
||||||
)
|
|
||||||
await transaction.commit()
|
await transaction.commit()
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
// eslint-disable-next-line no-console
|
// eslint-disable-next-line no-console
|
||||||
|
|||||||
@ -0,0 +1,51 @@
|
|||||||
|
/* eslint-disable @typescript-eslint/no-unsafe-argument */
|
||||||
|
|
||||||
|
import { getDriver } from '@db/neo4j'
|
||||||
|
|
||||||
|
export const description = 'Delete follow relation for deleted users'
|
||||||
|
|
||||||
|
export async function up(_next) {
|
||||||
|
const driver = getDriver()
|
||||||
|
const session = driver.session()
|
||||||
|
const transaction = session.beginTransaction()
|
||||||
|
|
||||||
|
try {
|
||||||
|
// Implement your migration here.
|
||||||
|
await transaction.run(`
|
||||||
|
MATCH (:User {deleted: true})-[follow:FOLLOWS]-(:User)
|
||||||
|
DELETE follow;
|
||||||
|
`)
|
||||||
|
await transaction.commit()
|
||||||
|
} catch (error) {
|
||||||
|
// eslint-disable-next-line no-console
|
||||||
|
console.log(error)
|
||||||
|
await transaction.rollback()
|
||||||
|
// eslint-disable-next-line no-console
|
||||||
|
console.log('rolled back')
|
||||||
|
throw new Error(error)
|
||||||
|
} finally {
|
||||||
|
await session.close()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function down(_next) {
|
||||||
|
const driver = getDriver()
|
||||||
|
const session = driver.session()
|
||||||
|
const transaction = session.beginTransaction()
|
||||||
|
|
||||||
|
try {
|
||||||
|
// cannot be rolled back
|
||||||
|
// Implement your migration here.
|
||||||
|
// await transaction.run(``)
|
||||||
|
// await transaction.commit()
|
||||||
|
} catch (error) {
|
||||||
|
// eslint-disable-next-line no-console
|
||||||
|
console.log(error)
|
||||||
|
await transaction.rollback()
|
||||||
|
// eslint-disable-next-line no-console
|
||||||
|
console.log('rolled back')
|
||||||
|
throw new Error(error)
|
||||||
|
} finally {
|
||||||
|
await session.close()
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -18,7 +18,7 @@ export default {
|
|||||||
},
|
},
|
||||||
title: { type: 'string', disallow: [null], min: 3 },
|
title: { type: 'string', disallow: [null], min: 3 },
|
||||||
slug: { type: 'string', allow: [null], unique: 'true' },
|
slug: { type: 'string', allow: [null], unique: 'true' },
|
||||||
content: { type: 'string', disallow: [null], min: 3 },
|
content: { type: 'string', disallow: [null], required: true, min: 3 },
|
||||||
contentExcerpt: { type: 'string', allow: [null] },
|
contentExcerpt: { type: 'string', allow: [null] },
|
||||||
deleted: { type: 'boolean', default: false },
|
deleted: { type: 'boolean', default: false },
|
||||||
disabled: { type: 'boolean', default: false },
|
disabled: { type: 'boolean', default: false },
|
||||||
@ -58,6 +58,7 @@ export default {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
pinned: { type: 'boolean', default: null, valid: [null, true] },
|
pinned: { type: 'boolean', default: null, valid: [null, true] },
|
||||||
|
groupPinned: { type: 'boolean', default: null, valid: [null, true] },
|
||||||
postType: { type: 'string', default: 'Article', valid: ['Article', 'Event'] },
|
postType: { type: 'string', default: 'Article', valid: ['Article', 'Event'] },
|
||||||
observes: {
|
observes: {
|
||||||
type: 'relationship',
|
type: 'relationship',
|
||||||
|
|||||||
@ -1,36 +1,49 @@
|
|||||||
/* eslint-disable @typescript-eslint/no-unsafe-member-access */
|
|
||||||
/* eslint-disable @typescript-eslint/no-unsafe-assignment */
|
|
||||||
/* eslint-disable @typescript-eslint/no-var-requires */
|
|
||||||
/* eslint-disable n/no-missing-require */
|
|
||||||
/* eslint-disable n/global-require */
|
|
||||||
// NOTE: We cannot use `fs` here to clean up the code. Cypress breaks on any npm
|
// NOTE: We cannot use `fs` here to clean up the code. Cypress breaks on any npm
|
||||||
// module that is not browser-compatible. Node's `fs` module is server-side only
|
// module that is not browser-compatible. Node's `fs` module is server-side only
|
||||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
//
|
||||||
declare let Cypress: any | undefined
|
// We use static imports instead of dynamic require() to ensure compatibility
|
||||||
|
// with both Node.js and Webpack (used by Cypress cucumber preprocessor).
|
||||||
|
|
||||||
|
import Badge from './Badge'
|
||||||
|
import Category from './Category'
|
||||||
|
import Comment from './Comment'
|
||||||
|
import Donations from './Donations'
|
||||||
|
import EmailAddress from './EmailAddress'
|
||||||
|
import File from './File'
|
||||||
|
import Group from './Group'
|
||||||
|
import Image from './Image'
|
||||||
|
import InviteCode from './InviteCode'
|
||||||
|
import Location from './Location'
|
||||||
|
import Migration from './Migration'
|
||||||
|
import Post from './Post'
|
||||||
|
import Report from './Report'
|
||||||
|
import SocialMedia from './SocialMedia'
|
||||||
|
import Tag from './Tag'
|
||||||
|
import UnverifiedEmailAddress from './UnverifiedEmailAddress'
|
||||||
|
import User from './User'
|
||||||
|
|
||||||
|
import type Neode from 'neode'
|
||||||
|
|
||||||
|
// Type assertion needed because TypeScript infers literal types from the model
|
||||||
|
// objects (e.g., type: 'string' as literal), but Neode expects the broader
|
||||||
|
// SchemaObject type with PropertyTypes union. The Neode type definitions are
|
||||||
|
// incomplete/incorrect, so we use double assertion to bypass the check.
|
||||||
export default {
|
export default {
|
||||||
File: typeof Cypress !== 'undefined' ? require('./File') : require('./File').default,
|
Badge,
|
||||||
Image: typeof Cypress !== 'undefined' ? require('./Image') : require('./Image').default,
|
Category,
|
||||||
Badge: typeof Cypress !== 'undefined' ? require('./Badge') : require('./Badge').default,
|
Comment,
|
||||||
User: typeof Cypress !== 'undefined' ? require('./User') : require('./User').default,
|
Donations,
|
||||||
Group: typeof Cypress !== 'undefined' ? require('./Group') : require('./Group').default,
|
EmailAddress,
|
||||||
EmailAddress:
|
File,
|
||||||
typeof Cypress !== 'undefined' ? require('./EmailAddress') : require('./EmailAddress').default,
|
Group,
|
||||||
UnverifiedEmailAddress:
|
Image,
|
||||||
typeof Cypress !== 'undefined'
|
InviteCode,
|
||||||
? require('./UnverifiedEmailAddress')
|
Location,
|
||||||
: require('./UnverifiedEmailAddress').default,
|
Migration,
|
||||||
SocialMedia:
|
Post,
|
||||||
typeof Cypress !== 'undefined' ? require('./SocialMedia') : require('./SocialMedia').default,
|
Report,
|
||||||
Post: typeof Cypress !== 'undefined' ? require('./Post') : require('./Post').default,
|
SocialMedia,
|
||||||
Comment: typeof Cypress !== 'undefined' ? require('./Comment') : require('./Comment').default,
|
Tag,
|
||||||
Category: typeof Cypress !== 'undefined' ? require('./Category') : require('./Category').default,
|
UnverifiedEmailAddress,
|
||||||
Tag: typeof Cypress !== 'undefined' ? require('./Tag') : require('./Tag').default,
|
User,
|
||||||
Location: typeof Cypress !== 'undefined' ? require('./Location') : require('./Location').default,
|
} as unknown as Record<string, Neode.SchemaObject>
|
||||||
Donations:
|
|
||||||
typeof Cypress !== 'undefined' ? require('./Donations') : require('./Donations').default,
|
|
||||||
Report: typeof Cypress !== 'undefined' ? require('./Report') : require('./Report').default,
|
|
||||||
Migration:
|
|
||||||
typeof Cypress !== 'undefined' ? require('./Migration') : require('./Migration').default,
|
|
||||||
InviteCode:
|
|
||||||
typeof Cypress !== 'undefined' ? require('./InviteCode') : require('./InviteCode').default,
|
|
||||||
}
|
|
||||||
|
|||||||
@ -8,13 +8,13 @@ import sample from 'lodash/sample'
|
|||||||
|
|
||||||
import CONFIG from '@config/index'
|
import CONFIG from '@config/index'
|
||||||
import { categories } from '@constants/categories'
|
import { categories } from '@constants/categories'
|
||||||
import { changeGroupMemberRoleMutation } from '@graphql/queries/changeGroupMemberRoleMutation'
|
import { ChangeGroupMemberRole } from '@graphql/queries/ChangeGroupMemberRole'
|
||||||
import { createCommentMutation } from '@graphql/queries/createCommentMutation'
|
import { CreateComment } from '@graphql/queries/CreateComment'
|
||||||
import { createGroupMutation } from '@graphql/queries/createGroupMutation'
|
import { CreateGroup } from '@graphql/queries/CreateGroup'
|
||||||
import { CreateMessage } from '@graphql/queries/CreateMessage'
|
import { CreateMessage } from '@graphql/queries/CreateMessage'
|
||||||
import { createPostMutation } from '@graphql/queries/createPostMutation'
|
import { CreatePost } from '@graphql/queries/CreatePost'
|
||||||
import { createRoomMutation } from '@graphql/queries/createRoomMutation'
|
import { CreateRoom } from '@graphql/queries/CreateRoom'
|
||||||
import { joinGroupMutation } from '@graphql/queries/joinGroupMutation'
|
import { JoinGroup } from '@graphql/queries/JoinGroup'
|
||||||
import { createApolloTestSetup } from '@root/test/helpers'
|
import { createApolloTestSetup } from '@root/test/helpers'
|
||||||
|
|
||||||
import Factory from './factories'
|
import Factory from './factories'
|
||||||
@ -341,7 +341,7 @@ const languages = ['de', 'en', 'es', 'fr', 'it', 'pt', 'pl']
|
|||||||
console.log('seed', 'groups')
|
console.log('seed', 'groups')
|
||||||
authenticatedUser = await peterLustig.toJson()
|
authenticatedUser = await peterLustig.toJson()
|
||||||
await mutate({
|
await mutate({
|
||||||
mutation: createGroupMutation(),
|
mutation: CreateGroup,
|
||||||
variables: {
|
variables: {
|
||||||
id: 'g0',
|
id: 'g0',
|
||||||
name: 'Investigative Journalism',
|
name: 'Investigative Journalism',
|
||||||
@ -354,21 +354,21 @@ const languages = ['de', 'en', 'es', 'fr', 'it', 'pt', 'pl']
|
|||||||
},
|
},
|
||||||
})
|
})
|
||||||
await mutate({
|
await mutate({
|
||||||
mutation: joinGroupMutation(),
|
mutation: JoinGroup,
|
||||||
variables: {
|
variables: {
|
||||||
groupId: 'g0',
|
groupId: 'g0',
|
||||||
userId: 'u2',
|
userId: 'u2',
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
await mutate({
|
await mutate({
|
||||||
mutation: joinGroupMutation(),
|
mutation: JoinGroup,
|
||||||
variables: {
|
variables: {
|
||||||
groupId: 'g0',
|
groupId: 'g0',
|
||||||
userId: 'u4',
|
userId: 'u4',
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
await mutate({
|
await mutate({
|
||||||
mutation: joinGroupMutation(),
|
mutation: JoinGroup,
|
||||||
variables: {
|
variables: {
|
||||||
groupId: 'g0',
|
groupId: 'g0',
|
||||||
userId: 'u6',
|
userId: 'u6',
|
||||||
@ -376,7 +376,7 @@ const languages = ['de', 'en', 'es', 'fr', 'it', 'pt', 'pl']
|
|||||||
})
|
})
|
||||||
|
|
||||||
await mutate({
|
await mutate({
|
||||||
mutation: changeGroupMemberRoleMutation(),
|
mutation: ChangeGroupMemberRole,
|
||||||
variables: {
|
variables: {
|
||||||
groupId: 'g0',
|
groupId: 'g0',
|
||||||
userId: 'u2',
|
userId: 'u2',
|
||||||
@ -385,7 +385,7 @@ const languages = ['de', 'en', 'es', 'fr', 'it', 'pt', 'pl']
|
|||||||
})
|
})
|
||||||
|
|
||||||
await mutate({
|
await mutate({
|
||||||
mutation: changeGroupMemberRoleMutation(),
|
mutation: ChangeGroupMemberRole,
|
||||||
variables: {
|
variables: {
|
||||||
groupId: 'g0',
|
groupId: 'g0',
|
||||||
userId: 'u4',
|
userId: 'u4',
|
||||||
@ -396,7 +396,7 @@ const languages = ['de', 'en', 'es', 'fr', 'it', 'pt', 'pl']
|
|||||||
// eslint-disable-next-line no-console
|
// eslint-disable-next-line no-console
|
||||||
console.log('seed', 'group posts')
|
console.log('seed', 'group posts')
|
||||||
await mutate({
|
await mutate({
|
||||||
mutation: createPostMutation(),
|
mutation: CreatePost,
|
||||||
variables: {
|
variables: {
|
||||||
id: 'p0-g0',
|
id: 'p0-g0',
|
||||||
groupId: 'g0',
|
groupId: 'g0',
|
||||||
@ -408,7 +408,7 @@ const languages = ['de', 'en', 'es', 'fr', 'it', 'pt', 'pl']
|
|||||||
|
|
||||||
authenticatedUser = await bobDerBaumeister.toJson()
|
authenticatedUser = await bobDerBaumeister.toJson()
|
||||||
await mutate({
|
await mutate({
|
||||||
mutation: createPostMutation(),
|
mutation: CreatePost,
|
||||||
variables: {
|
variables: {
|
||||||
id: 'p1-g0',
|
id: 'p1-g0',
|
||||||
groupId: 'g0',
|
groupId: 'g0',
|
||||||
@ -420,7 +420,7 @@ const languages = ['de', 'en', 'es', 'fr', 'it', 'pt', 'pl']
|
|||||||
|
|
||||||
authenticatedUser = await jennyRostock.toJson()
|
authenticatedUser = await jennyRostock.toJson()
|
||||||
await mutate({
|
await mutate({
|
||||||
mutation: createGroupMutation(),
|
mutation: CreateGroup,
|
||||||
variables: {
|
variables: {
|
||||||
id: 'g1',
|
id: 'g1',
|
||||||
name: 'School For Citizens',
|
name: 'School For Citizens',
|
||||||
@ -433,35 +433,35 @@ const languages = ['de', 'en', 'es', 'fr', 'it', 'pt', 'pl']
|
|||||||
},
|
},
|
||||||
})
|
})
|
||||||
await mutate({
|
await mutate({
|
||||||
mutation: joinGroupMutation(),
|
mutation: JoinGroup,
|
||||||
variables: {
|
variables: {
|
||||||
groupId: 'g1',
|
groupId: 'g1',
|
||||||
userId: 'u1',
|
userId: 'u1',
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
await mutate({
|
await mutate({
|
||||||
mutation: joinGroupMutation(),
|
mutation: JoinGroup,
|
||||||
variables: {
|
variables: {
|
||||||
groupId: 'g1',
|
groupId: 'g1',
|
||||||
userId: 'u2',
|
userId: 'u2',
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
await mutate({
|
await mutate({
|
||||||
mutation: joinGroupMutation(),
|
mutation: JoinGroup,
|
||||||
variables: {
|
variables: {
|
||||||
groupId: 'g1',
|
groupId: 'g1',
|
||||||
userId: 'u5',
|
userId: 'u5',
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
await mutate({
|
await mutate({
|
||||||
mutation: joinGroupMutation(),
|
mutation: JoinGroup,
|
||||||
variables: {
|
variables: {
|
||||||
groupId: 'g1',
|
groupId: 'g1',
|
||||||
userId: 'u6',
|
userId: 'u6',
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
await mutate({
|
await mutate({
|
||||||
mutation: joinGroupMutation(),
|
mutation: JoinGroup,
|
||||||
variables: {
|
variables: {
|
||||||
groupId: 'g1',
|
groupId: 'g1',
|
||||||
userId: 'u7',
|
userId: 'u7',
|
||||||
@ -469,7 +469,7 @@ const languages = ['de', 'en', 'es', 'fr', 'it', 'pt', 'pl']
|
|||||||
})
|
})
|
||||||
|
|
||||||
await mutate({
|
await mutate({
|
||||||
mutation: changeGroupMemberRoleMutation(),
|
mutation: ChangeGroupMemberRole,
|
||||||
variables: {
|
variables: {
|
||||||
groupId: 'g1',
|
groupId: 'g1',
|
||||||
userId: 'u1',
|
userId: 'u1',
|
||||||
@ -477,7 +477,7 @@ const languages = ['de', 'en', 'es', 'fr', 'it', 'pt', 'pl']
|
|||||||
},
|
},
|
||||||
})
|
})
|
||||||
await mutate({
|
await mutate({
|
||||||
mutation: changeGroupMemberRoleMutation(),
|
mutation: ChangeGroupMemberRole,
|
||||||
variables: {
|
variables: {
|
||||||
groupId: 'g1',
|
groupId: 'g1',
|
||||||
userId: 'u5',
|
userId: 'u5',
|
||||||
@ -485,7 +485,7 @@ const languages = ['de', 'en', 'es', 'fr', 'it', 'pt', 'pl']
|
|||||||
},
|
},
|
||||||
})
|
})
|
||||||
await mutate({
|
await mutate({
|
||||||
mutation: changeGroupMemberRoleMutation(),
|
mutation: ChangeGroupMemberRole,
|
||||||
variables: {
|
variables: {
|
||||||
groupId: 'g1',
|
groupId: 'g1',
|
||||||
userId: 'u6',
|
userId: 'u6',
|
||||||
@ -493,7 +493,7 @@ const languages = ['de', 'en', 'es', 'fr', 'it', 'pt', 'pl']
|
|||||||
},
|
},
|
||||||
})
|
})
|
||||||
await mutate({
|
await mutate({
|
||||||
mutation: createPostMutation(),
|
mutation: CreatePost,
|
||||||
variables: {
|
variables: {
|
||||||
id: 'p0-g1',
|
id: 'p0-g1',
|
||||||
groupId: 'g1',
|
groupId: 'g1',
|
||||||
@ -504,7 +504,7 @@ const languages = ['de', 'en', 'es', 'fr', 'it', 'pt', 'pl']
|
|||||||
})
|
})
|
||||||
authenticatedUser = await peterLustig.toJson()
|
authenticatedUser = await peterLustig.toJson()
|
||||||
await mutate({
|
await mutate({
|
||||||
mutation: createPostMutation(),
|
mutation: CreatePost,
|
||||||
variables: {
|
variables: {
|
||||||
id: 'p1-g1',
|
id: 'p1-g1',
|
||||||
groupId: 'g1',
|
groupId: 'g1',
|
||||||
@ -516,7 +516,7 @@ const languages = ['de', 'en', 'es', 'fr', 'it', 'pt', 'pl']
|
|||||||
|
|
||||||
authenticatedUser = await bobDerBaumeister.toJson()
|
authenticatedUser = await bobDerBaumeister.toJson()
|
||||||
await mutate({
|
await mutate({
|
||||||
mutation: createGroupMutation(),
|
mutation: CreateGroup,
|
||||||
variables: {
|
variables: {
|
||||||
id: 'g2',
|
id: 'g2',
|
||||||
name: 'Yoga Practice',
|
name: 'Yoga Practice',
|
||||||
@ -528,35 +528,35 @@ const languages = ['de', 'en', 'es', 'fr', 'it', 'pt', 'pl']
|
|||||||
},
|
},
|
||||||
})
|
})
|
||||||
await mutate({
|
await mutate({
|
||||||
mutation: joinGroupMutation(),
|
mutation: JoinGroup,
|
||||||
variables: {
|
variables: {
|
||||||
groupId: 'g2',
|
groupId: 'g2',
|
||||||
userId: 'u3',
|
userId: 'u3',
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
await mutate({
|
await mutate({
|
||||||
mutation: joinGroupMutation(),
|
mutation: JoinGroup,
|
||||||
variables: {
|
variables: {
|
||||||
groupId: 'g2',
|
groupId: 'g2',
|
||||||
userId: 'u4',
|
userId: 'u4',
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
await mutate({
|
await mutate({
|
||||||
mutation: joinGroupMutation(),
|
mutation: JoinGroup,
|
||||||
variables: {
|
variables: {
|
||||||
groupId: 'g2',
|
groupId: 'g2',
|
||||||
userId: 'u5',
|
userId: 'u5',
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
await mutate({
|
await mutate({
|
||||||
mutation: joinGroupMutation(),
|
mutation: JoinGroup,
|
||||||
variables: {
|
variables: {
|
||||||
groupId: 'g2',
|
groupId: 'g2',
|
||||||
userId: 'u6',
|
userId: 'u6',
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
await mutate({
|
await mutate({
|
||||||
mutation: joinGroupMutation(),
|
mutation: JoinGroup,
|
||||||
variables: {
|
variables: {
|
||||||
groupId: 'g2',
|
groupId: 'g2',
|
||||||
userId: 'u7',
|
userId: 'u7',
|
||||||
@ -564,7 +564,7 @@ const languages = ['de', 'en', 'es', 'fr', 'it', 'pt', 'pl']
|
|||||||
})
|
})
|
||||||
|
|
||||||
await mutate({
|
await mutate({
|
||||||
mutation: changeGroupMemberRoleMutation(),
|
mutation: ChangeGroupMemberRole,
|
||||||
variables: {
|
variables: {
|
||||||
groupId: 'g2',
|
groupId: 'g2',
|
||||||
userId: 'u3',
|
userId: 'u3',
|
||||||
@ -572,7 +572,7 @@ const languages = ['de', 'en', 'es', 'fr', 'it', 'pt', 'pl']
|
|||||||
},
|
},
|
||||||
})
|
})
|
||||||
await mutate({
|
await mutate({
|
||||||
mutation: changeGroupMemberRoleMutation(),
|
mutation: ChangeGroupMemberRole,
|
||||||
variables: {
|
variables: {
|
||||||
groupId: 'g2',
|
groupId: 'g2',
|
||||||
userId: 'u4',
|
userId: 'u4',
|
||||||
@ -580,7 +580,7 @@ const languages = ['de', 'en', 'es', 'fr', 'it', 'pt', 'pl']
|
|||||||
},
|
},
|
||||||
})
|
})
|
||||||
await mutate({
|
await mutate({
|
||||||
mutation: changeGroupMemberRoleMutation(),
|
mutation: ChangeGroupMemberRole,
|
||||||
variables: {
|
variables: {
|
||||||
groupId: 'g2',
|
groupId: 'g2',
|
||||||
userId: 'u5',
|
userId: 'u5',
|
||||||
@ -588,7 +588,7 @@ const languages = ['de', 'en', 'es', 'fr', 'it', 'pt', 'pl']
|
|||||||
},
|
},
|
||||||
})
|
})
|
||||||
await mutate({
|
await mutate({
|
||||||
mutation: changeGroupMemberRoleMutation(),
|
mutation: ChangeGroupMemberRole,
|
||||||
variables: {
|
variables: {
|
||||||
groupId: 'g2',
|
groupId: 'g2',
|
||||||
userId: 'u6',
|
userId: 'u6',
|
||||||
@ -598,7 +598,7 @@ const languages = ['de', 'en', 'es', 'fr', 'it', 'pt', 'pl']
|
|||||||
|
|
||||||
authenticatedUser = await louie.toJson()
|
authenticatedUser = await louie.toJson()
|
||||||
await mutate({
|
await mutate({
|
||||||
mutation: createPostMutation(),
|
mutation: CreatePost,
|
||||||
variables: {
|
variables: {
|
||||||
id: 'p0-g2',
|
id: 'p0-g2',
|
||||||
groupId: 'g2',
|
groupId: 'g2',
|
||||||
@ -614,7 +614,7 @@ const languages = ['de', 'en', 'es', 'fr', 'it', 'pt', 'pl']
|
|||||||
const now = new Date()
|
const now = new Date()
|
||||||
|
|
||||||
await mutate({
|
await mutate({
|
||||||
mutation: createPostMutation(),
|
mutation: CreatePost,
|
||||||
variables: {
|
variables: {
|
||||||
id: 'e0',
|
id: 'e0',
|
||||||
title: 'Illegaler Kindergeburtstag',
|
title: 'Illegaler Kindergeburtstag',
|
||||||
@ -629,7 +629,7 @@ const languages = ['de', 'en', 'es', 'fr', 'it', 'pt', 'pl']
|
|||||||
},
|
},
|
||||||
})
|
})
|
||||||
await mutate({
|
await mutate({
|
||||||
mutation: createPostMutation(),
|
mutation: CreatePost,
|
||||||
variables: {
|
variables: {
|
||||||
id: 'e1',
|
id: 'e1',
|
||||||
title: 'Wir Schützen den Stuttgarter Schlossgarten',
|
title: 'Wir Schützen den Stuttgarter Schlossgarten',
|
||||||
@ -644,7 +644,7 @@ const languages = ['de', 'en', 'es', 'fr', 'it', 'pt', 'pl']
|
|||||||
},
|
},
|
||||||
})
|
})
|
||||||
await mutate({
|
await mutate({
|
||||||
mutation: createPostMutation(),
|
mutation: CreatePost,
|
||||||
variables: {
|
variables: {
|
||||||
id: 'e2',
|
id: 'e2',
|
||||||
title: 'IT 4 Change Treffen',
|
title: 'IT 4 Change Treffen',
|
||||||
@ -848,7 +848,7 @@ const languages = ['de', 'en', 'es', 'fr', 'it', 'pt', 'pl']
|
|||||||
'The new physics of <a class="hashtag" data-hashtag-id="QuantenFlussTheorie" href="/?hashtag=QuantenFlussTheorie">#QuantenFlussTheorie</a> can explain <a class="hashtag" data-hashtag-id="QuantumGravity" href="/?hashtag=QuantumGravity">#QuantumGravity</a>! <a class="mention" data-mention-id="u1" href="/profile/u1">@peter-lustig</a> got that already. ;-)'
|
'The new physics of <a class="hashtag" data-hashtag-id="QuantenFlussTheorie" href="/?hashtag=QuantenFlussTheorie">#QuantenFlussTheorie</a> can explain <a class="hashtag" data-hashtag-id="QuantumGravity" href="/?hashtag=QuantumGravity">#QuantumGravity</a>! <a class="mention" data-mention-id="u1" href="/profile/u1">@peter-lustig</a> got that already. ;-)'
|
||||||
|
|
||||||
await mutate({
|
await mutate({
|
||||||
mutation: createPostMutation(),
|
mutation: CreatePost,
|
||||||
variables: {
|
variables: {
|
||||||
id: 'p2',
|
id: 'p2',
|
||||||
title: `Nature Philosophy Yoga`,
|
title: `Nature Philosophy Yoga`,
|
||||||
@ -857,7 +857,7 @@ const languages = ['de', 'en', 'es', 'fr', 'it', 'pt', 'pl']
|
|||||||
},
|
},
|
||||||
})
|
})
|
||||||
await mutate({
|
await mutate({
|
||||||
mutation: createPostMutation(),
|
mutation: CreatePost,
|
||||||
variables: {
|
variables: {
|
||||||
id: 'p7',
|
id: 'p7',
|
||||||
title: 'This is post #7',
|
title: 'This is post #7',
|
||||||
@ -866,7 +866,7 @@ const languages = ['de', 'en', 'es', 'fr', 'it', 'pt', 'pl']
|
|||||||
},
|
},
|
||||||
})
|
})
|
||||||
await mutate({
|
await mutate({
|
||||||
mutation: createPostMutation(),
|
mutation: CreatePost,
|
||||||
variables: {
|
variables: {
|
||||||
id: 'p8',
|
id: 'p8',
|
||||||
title: `Quantum Flow Theory explains Quantum Gravity`,
|
title: `Quantum Flow Theory explains Quantum Gravity`,
|
||||||
@ -875,7 +875,7 @@ const languages = ['de', 'en', 'es', 'fr', 'it', 'pt', 'pl']
|
|||||||
},
|
},
|
||||||
})
|
})
|
||||||
await mutate({
|
await mutate({
|
||||||
mutation: createPostMutation(),
|
mutation: CreatePost,
|
||||||
variables: {
|
variables: {
|
||||||
id: 'p12',
|
id: 'p12',
|
||||||
title: 'This is post #12',
|
title: 'This is post #12',
|
||||||
@ -899,7 +899,7 @@ const languages = ['de', 'en', 'es', 'fr', 'it', 'pt', 'pl']
|
|||||||
const mentionInComment2 =
|
const mentionInComment2 =
|
||||||
'Did <a class="mention" data-mention-id="u1" href="/profile/u1">@peter-lustig</a> tell you?'
|
'Did <a class="mention" data-mention-id="u1" href="/profile/u1">@peter-lustig</a> tell you?'
|
||||||
await mutate({
|
await mutate({
|
||||||
mutation: createCommentMutation,
|
mutation: CreateComment,
|
||||||
variables: {
|
variables: {
|
||||||
id: 'c4',
|
id: 'c4',
|
||||||
postId: 'p2',
|
postId: 'p2',
|
||||||
@ -907,7 +907,7 @@ const languages = ['de', 'en', 'es', 'fr', 'it', 'pt', 'pl']
|
|||||||
},
|
},
|
||||||
})
|
})
|
||||||
await mutate({
|
await mutate({
|
||||||
mutation: createCommentMutation,
|
mutation: CreateComment,
|
||||||
variables: {
|
variables: {
|
||||||
id: 'c4-1',
|
id: 'c4-1',
|
||||||
postId: 'p2',
|
postId: 'p2',
|
||||||
@ -915,7 +915,7 @@ const languages = ['de', 'en', 'es', 'fr', 'it', 'pt', 'pl']
|
|||||||
},
|
},
|
||||||
})
|
})
|
||||||
await mutate({
|
await mutate({
|
||||||
mutation: createCommentMutation,
|
mutation: CreateComment,
|
||||||
variables: {
|
variables: {
|
||||||
postId: 'p14',
|
postId: 'p14',
|
||||||
content: faker.lorem.paragraph(),
|
content: faker.lorem.paragraph(),
|
||||||
@ -1223,7 +1223,7 @@ const languages = ['de', 'en', 'es', 'fr', 'it', 'pt', 'pl']
|
|||||||
authenticatedUser = userObj
|
authenticatedUser = userObj
|
||||||
|
|
||||||
await mutate({
|
await mutate({
|
||||||
mutation: joinGroupMutation(),
|
mutation: JoinGroup,
|
||||||
variables: {
|
variables: {
|
||||||
groupId: 'g2',
|
groupId: 'g2',
|
||||||
userId: userObj.id,
|
userId: userObj.id,
|
||||||
@ -1530,7 +1530,7 @@ const languages = ['de', 'en', 'es', 'fr', 'it', 'pt', 'pl']
|
|||||||
console.log('seed', 'chat')
|
console.log('seed', 'chat')
|
||||||
authenticatedUser = await huey.toJson()
|
authenticatedUser = await huey.toJson()
|
||||||
const { data: roomHueyPeter } = await mutate({
|
const { data: roomHueyPeter } = await mutate({
|
||||||
mutation: createRoomMutation(),
|
mutation: CreateRoom,
|
||||||
variables: {
|
variables: {
|
||||||
userId: (await peterLustig.toJson()).id,
|
userId: (await peterLustig.toJson()).id,
|
||||||
},
|
},
|
||||||
@ -1557,7 +1557,7 @@ const languages = ['de', 'en', 'es', 'fr', 'it', 'pt', 'pl']
|
|||||||
|
|
||||||
authenticatedUser = await huey.toJson()
|
authenticatedUser = await huey.toJson()
|
||||||
const { data: roomHueyJenny } = await mutate({
|
const { data: roomHueyJenny } = await mutate({
|
||||||
mutation: createRoomMutation(),
|
mutation: CreateRoom,
|
||||||
variables: {
|
variables: {
|
||||||
userId: (await jennyRostock.toJson()).id,
|
userId: (await jennyRostock.toJson()).id,
|
||||||
},
|
},
|
||||||
@ -1584,7 +1584,7 @@ const languages = ['de', 'en', 'es', 'fr', 'it', 'pt', 'pl']
|
|||||||
for (const user of additionalUsers.slice(0, 99)) {
|
for (const user of additionalUsers.slice(0, 99)) {
|
||||||
authenticatedUser = await jennyRostock.toJson()
|
authenticatedUser = await jennyRostock.toJson()
|
||||||
const { data: room } = await mutate({
|
const { data: room } = await mutate({
|
||||||
mutation: createRoomMutation(),
|
mutation: CreateRoom,
|
||||||
variables: {
|
variables: {
|
||||||
userId: (await user.toJson()).id,
|
userId: (await user.toJson()).id,
|
||||||
},
|
},
|
||||||
|
|||||||
@ -1,9 +1,12 @@
|
|||||||
// Jest Snapshot v1, https://goo.gl/fbAQLP
|
// Jest Snapshot v1, https://jestjs.io/docs/snapshot-testing
|
||||||
|
|
||||||
exports[`sendChatMessageMail English chat_message template 1`] = `
|
exports[`sendChatMessageMail English chat_message template 1`] = `
|
||||||
{
|
{
|
||||||
"attachments": [],
|
"attachments": [],
|
||||||
"from": "ocelot.social <devops@ocelot.social>",
|
"from": {
|
||||||
|
"address": "devops@ocelot.social",
|
||||||
|
"name": "ocelot.social",
|
||||||
|
},
|
||||||
"html": "<!DOCTYPE html>
|
"html": "<!DOCTYPE html>
|
||||||
<html lang="en">
|
<html lang="en">
|
||||||
<head>
|
<head>
|
||||||
@ -13,9 +16,10 @@ exports[`sendChatMessageMail English chat_message template 1`] = `
|
|||||||
<style>body{
|
<style>body{
|
||||||
display: block;
|
display: block;
|
||||||
font-family: Lato, sans-serif;
|
font-family: Lato, sans-serif;
|
||||||
font-size: 17px;
|
font-size: 16px;
|
||||||
text-align: left;
|
text-align: left;
|
||||||
text-align: -webkit-left;
|
text-align: -webkit-left;
|
||||||
|
line-height: 24px;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
padding: 15px;
|
padding: 15px;
|
||||||
margin: 0px;
|
margin: 0px;
|
||||||
@ -23,9 +27,10 @@ exports[`sendChatMessageMail English chat_message template 1`] = `
|
|||||||
|
|
||||||
h2 {
|
h2 {
|
||||||
margin-top: 25px;
|
margin-top: 25px;
|
||||||
font-size: 25px;
|
margin-bottom: 30px;
|
||||||
|
font-size: 24px;
|
||||||
font-weight: normal;
|
font-weight: normal;
|
||||||
line-height: 22px;
|
line-height: 24px;
|
||||||
color: #333333;
|
color: #333333;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -36,11 +41,17 @@ h2 {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.head-logo {
|
.head-logo {
|
||||||
width: 60%;
|
width: 30%;
|
||||||
height: auto;
|
height: auto;
|
||||||
display: block;
|
display: block;
|
||||||
margin-left: auto;
|
margin-left: auto;
|
||||||
margin-right: auto;
|
margin-right: auto;
|
||||||
|
margin-bottom: 50px;
|
||||||
|
}
|
||||||
|
|
||||||
|
p.no-margin-top-bottom {
|
||||||
|
margin-top: 0;
|
||||||
|
margin-bottom: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
a {
|
a {
|
||||||
@ -51,10 +62,9 @@ a.button {
|
|||||||
background: #17b53e;
|
background: #17b53e;
|
||||||
font-family: Lato, sans-serif;
|
font-family: Lato, sans-serif;
|
||||||
font-size: 16px;
|
font-size: 16px;
|
||||||
line-height: 15px;
|
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
text-align:center;
|
text-align:center;
|
||||||
padding: 13px 17px;
|
padding: 9px 18px;
|
||||||
color: #ffffff;
|
color: #ffffff;
|
||||||
display: table;
|
display: table;
|
||||||
margin-left: auto;
|
margin-left: auto;
|
||||||
@ -62,10 +72,6 @@ a.button {
|
|||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
}
|
}
|
||||||
|
|
||||||
span {
|
|
||||||
color: #17b53e;
|
|
||||||
}
|
|
||||||
|
|
||||||
.text-block {
|
.text-block {
|
||||||
margin-top: 20px;
|
margin-top: 20px;
|
||||||
color: #000000;
|
color: #000000;
|
||||||
@ -74,7 +80,7 @@ span {
|
|||||||
footer {
|
footer {
|
||||||
padding: 20px;
|
padding: 20px;
|
||||||
font-family: Lato, sans-serif;
|
font-family: Lato, sans-serif;
|
||||||
font-size: 12px;
|
font-size: 14px;
|
||||||
line-height: 15px;
|
line-height: 15px;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
color: #888888;
|
color: #888888;
|
||||||
@ -94,13 +100,13 @@ footer {
|
|||||||
<p>you have received a new chat message from <a class="user" href="http://webapp:3000/profile/chatSender/chatsender">chatSender</a>.
|
<p>you have received a new chat message from <a class="user" href="http://webapp:3000/profile/chatSender/chatsender">chatSender</a>.
|
||||||
</p><a class="button" href="http://webapp:3000/chat">Show Chat</a>
|
</p><a class="button" href="http://webapp:3000/chat">Show Chat</a>
|
||||||
<div class="text-block">
|
<div class="text-block">
|
||||||
<p>See you soon on <a class="organization" href="https://ocelot.social">ocelot.social</a>!</p>
|
<p class="no-margin-top-bottom">See you soon on <a class="organization" href="https://ocelot.social">ocelot.social</a>!</p>
|
||||||
<p>– The ocelot.social Team</p><br>
|
<p class="no-margin-top-bottom">– The ocelot.social Team</p><br>
|
||||||
<p>PS: If you don't want to receive e-mails anymore, change your <a class="settings" href="http://webapp:3000/settings/notifications">notification settings</a>!</p>
|
<p class="no-margin-top-bottom">PS: If you don't want to receive e-mails anymore, change your <a class="settings" href="http://webapp:3000/settings/notifications">notification settings</a>!</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="support">
|
<div class="support">
|
||||||
<p>If you have questions or problems, feel free to contact our support: <a href="mailto:devops@ocelot.social">devops@ocelot.social</a></p>
|
<p class="no-margin-top-bottom">If you have questions or problems, feel free to contact our support: <a href="mailto:devops@ocelot.social">devops@ocelot.social</a></p>
|
||||||
</div>
|
</div>
|
||||||
<footer>
|
<footer>
|
||||||
<div class="footer"></div><a href="https://ocelot.social">ocelot.social Community</a>
|
<div class="footer"></div><a href="https://ocelot.social">ocelot.social Community</a>
|
||||||
@ -129,14 +135,20 @@ devops@ocelot.social [devops@ocelot.social]
|
|||||||
|
|
||||||
|
|
||||||
ocelot.social Community [https://ocelot.social]",
|
ocelot.social Community [https://ocelot.social]",
|
||||||
"to": "user@example.org",
|
"to": {
|
||||||
|
"address": "user@example.org",
|
||||||
|
"name": "chatReceiver",
|
||||||
|
},
|
||||||
}
|
}
|
||||||
`;
|
`;
|
||||||
|
|
||||||
exports[`sendChatMessageMail German chat_message template 1`] = `
|
exports[`sendChatMessageMail German chat_message template 1`] = `
|
||||||
{
|
{
|
||||||
"attachments": [],
|
"attachments": [],
|
||||||
"from": "ocelot.social <devops@ocelot.social>",
|
"from": {
|
||||||
|
"address": "devops@ocelot.social",
|
||||||
|
"name": "ocelot.social",
|
||||||
|
},
|
||||||
"html": "<!DOCTYPE html>
|
"html": "<!DOCTYPE html>
|
||||||
<html lang="de">
|
<html lang="de">
|
||||||
<head>
|
<head>
|
||||||
@ -146,9 +158,10 @@ exports[`sendChatMessageMail German chat_message template 1`] = `
|
|||||||
<style>body{
|
<style>body{
|
||||||
display: block;
|
display: block;
|
||||||
font-family: Lato, sans-serif;
|
font-family: Lato, sans-serif;
|
||||||
font-size: 17px;
|
font-size: 16px;
|
||||||
text-align: left;
|
text-align: left;
|
||||||
text-align: -webkit-left;
|
text-align: -webkit-left;
|
||||||
|
line-height: 24px;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
padding: 15px;
|
padding: 15px;
|
||||||
margin: 0px;
|
margin: 0px;
|
||||||
@ -156,9 +169,10 @@ exports[`sendChatMessageMail German chat_message template 1`] = `
|
|||||||
|
|
||||||
h2 {
|
h2 {
|
||||||
margin-top: 25px;
|
margin-top: 25px;
|
||||||
font-size: 25px;
|
margin-bottom: 30px;
|
||||||
|
font-size: 24px;
|
||||||
font-weight: normal;
|
font-weight: normal;
|
||||||
line-height: 22px;
|
line-height: 24px;
|
||||||
color: #333333;
|
color: #333333;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -169,11 +183,17 @@ h2 {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.head-logo {
|
.head-logo {
|
||||||
width: 60%;
|
width: 30%;
|
||||||
height: auto;
|
height: auto;
|
||||||
display: block;
|
display: block;
|
||||||
margin-left: auto;
|
margin-left: auto;
|
||||||
margin-right: auto;
|
margin-right: auto;
|
||||||
|
margin-bottom: 50px;
|
||||||
|
}
|
||||||
|
|
||||||
|
p.no-margin-top-bottom {
|
||||||
|
margin-top: 0;
|
||||||
|
margin-bottom: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
a {
|
a {
|
||||||
@ -184,10 +204,9 @@ a.button {
|
|||||||
background: #17b53e;
|
background: #17b53e;
|
||||||
font-family: Lato, sans-serif;
|
font-family: Lato, sans-serif;
|
||||||
font-size: 16px;
|
font-size: 16px;
|
||||||
line-height: 15px;
|
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
text-align:center;
|
text-align:center;
|
||||||
padding: 13px 17px;
|
padding: 9px 18px;
|
||||||
color: #ffffff;
|
color: #ffffff;
|
||||||
display: table;
|
display: table;
|
||||||
margin-left: auto;
|
margin-left: auto;
|
||||||
@ -195,10 +214,6 @@ a.button {
|
|||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
}
|
}
|
||||||
|
|
||||||
span {
|
|
||||||
color: #17b53e;
|
|
||||||
}
|
|
||||||
|
|
||||||
.text-block {
|
.text-block {
|
||||||
margin-top: 20px;
|
margin-top: 20px;
|
||||||
color: #000000;
|
color: #000000;
|
||||||
@ -207,7 +222,7 @@ span {
|
|||||||
footer {
|
footer {
|
||||||
padding: 20px;
|
padding: 20px;
|
||||||
font-family: Lato, sans-serif;
|
font-family: Lato, sans-serif;
|
||||||
font-size: 12px;
|
font-size: 14px;
|
||||||
line-height: 15px;
|
line-height: 15px;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
color: #888888;
|
color: #888888;
|
||||||
@ -227,13 +242,13 @@ footer {
|
|||||||
<p>du hast eine neue Chat-Nachricht von <a class="user" href="http://webapp:3000/profile/chatSender/chatsender">chatSender</a> erhalten.
|
<p>du hast eine neue Chat-Nachricht von <a class="user" href="http://webapp:3000/profile/chatSender/chatsender">chatSender</a> erhalten.
|
||||||
</p><a class="button" href="http://webapp:3000/chat">Chat anzeigen</a>
|
</p><a class="button" href="http://webapp:3000/chat">Chat anzeigen</a>
|
||||||
<div class="text-block">
|
<div class="text-block">
|
||||||
<p>Bis bald bei <a class="organization" href="https://ocelot.social">ocelot.social</a>!</p>
|
<p class="no-margin-top-bottom">Bis bald bei <a class="organization" href="https://ocelot.social">ocelot.social</a>!</p>
|
||||||
<p>– Dein ocelot.social Team</p><br>
|
<p class="no-margin-top-bottom">– Dein ocelot.social Team</p><br>
|
||||||
<p>PS: Möchtest du keine E-Mails mehr erhalten, dann ändere deine <a class="settings" href="http://webapp:3000/settings/notifications">Benachrichtigungseinstellungen</a>!</p>
|
<p class="no-margin-top-bottom">PS: Möchtest du keine E-Mails mehr erhalten, dann ändere deine <a class="settings" href="http://webapp:3000/settings/notifications">Benachrichtigungseinstellungen</a>!</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="support">
|
<div class="support">
|
||||||
<p>Wenn du Fragen oder Probleme hast, kannst du dich gerne an den Support wenden: <a href="mailto:devops@ocelot.social">devops@ocelot.social</a></p>
|
<p class="no-margin-top-bottom">Wenn du Fragen oder Probleme hast, kannst du dich gerne an den Support wenden: <a href="mailto:devops@ocelot.social">devops@ocelot.social</a></p>
|
||||||
</div>
|
</div>
|
||||||
<footer>
|
<footer>
|
||||||
<div class="footer"></div><a href="https://ocelot.social">ocelot.social Community</a>
|
<div class="footer"></div><a href="https://ocelot.social">ocelot.social Community</a>
|
||||||
@ -262,6 +277,9 @@ devops@ocelot.social [devops@ocelot.social]
|
|||||||
|
|
||||||
|
|
||||||
ocelot.social Community [https://ocelot.social]",
|
ocelot.social Community [https://ocelot.social]",
|
||||||
"to": "user@example.org",
|
"to": {
|
||||||
|
"address": "user@example.org",
|
||||||
|
"name": "chatReceiver",
|
||||||
|
},
|
||||||
}
|
}
|
||||||
`;
|
`;
|
||||||
|
|||||||
@ -1,9 +1,12 @@
|
|||||||
// Jest Snapshot v1, https://goo.gl/fbAQLP
|
// Jest Snapshot v1, https://jestjs.io/docs/snapshot-testing
|
||||||
|
|
||||||
exports[`sendEmailVerification English renders correctly 1`] = `
|
exports[`sendEmailVerification English renders correctly 1`] = `
|
||||||
{
|
{
|
||||||
"attachments": [],
|
"attachments": [],
|
||||||
"from": "ocelot.social <devops@ocelot.social>",
|
"from": {
|
||||||
|
"address": "devops@ocelot.social",
|
||||||
|
"name": "ocelot.social",
|
||||||
|
},
|
||||||
"html": "<!DOCTYPE html>
|
"html": "<!DOCTYPE html>
|
||||||
<html lang="en">
|
<html lang="en">
|
||||||
<head>
|
<head>
|
||||||
@ -13,9 +16,10 @@ exports[`sendEmailVerification English renders correctly 1`] = `
|
|||||||
<style>body{
|
<style>body{
|
||||||
display: block;
|
display: block;
|
||||||
font-family: Lato, sans-serif;
|
font-family: Lato, sans-serif;
|
||||||
font-size: 17px;
|
font-size: 16px;
|
||||||
text-align: left;
|
text-align: left;
|
||||||
text-align: -webkit-left;
|
text-align: -webkit-left;
|
||||||
|
line-height: 24px;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
padding: 15px;
|
padding: 15px;
|
||||||
margin: 0px;
|
margin: 0px;
|
||||||
@ -23,9 +27,10 @@ exports[`sendEmailVerification English renders correctly 1`] = `
|
|||||||
|
|
||||||
h2 {
|
h2 {
|
||||||
margin-top: 25px;
|
margin-top: 25px;
|
||||||
font-size: 25px;
|
margin-bottom: 30px;
|
||||||
|
font-size: 24px;
|
||||||
font-weight: normal;
|
font-weight: normal;
|
||||||
line-height: 22px;
|
line-height: 24px;
|
||||||
color: #333333;
|
color: #333333;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -36,11 +41,17 @@ h2 {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.head-logo {
|
.head-logo {
|
||||||
width: 60%;
|
width: 30%;
|
||||||
height: auto;
|
height: auto;
|
||||||
display: block;
|
display: block;
|
||||||
margin-left: auto;
|
margin-left: auto;
|
||||||
margin-right: auto;
|
margin-right: auto;
|
||||||
|
margin-bottom: 50px;
|
||||||
|
}
|
||||||
|
|
||||||
|
p.no-margin-top-bottom {
|
||||||
|
margin-top: 0;
|
||||||
|
margin-bottom: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
a {
|
a {
|
||||||
@ -51,10 +62,9 @@ a.button {
|
|||||||
background: #17b53e;
|
background: #17b53e;
|
||||||
font-family: Lato, sans-serif;
|
font-family: Lato, sans-serif;
|
||||||
font-size: 16px;
|
font-size: 16px;
|
||||||
line-height: 15px;
|
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
text-align:center;
|
text-align:center;
|
||||||
padding: 13px 17px;
|
padding: 9px 18px;
|
||||||
color: #ffffff;
|
color: #ffffff;
|
||||||
display: table;
|
display: table;
|
||||||
margin-left: auto;
|
margin-left: auto;
|
||||||
@ -62,10 +72,6 @@ a.button {
|
|||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
}
|
}
|
||||||
|
|
||||||
span {
|
|
||||||
color: #17b53e;
|
|
||||||
}
|
|
||||||
|
|
||||||
.text-block {
|
.text-block {
|
||||||
margin-top: 20px;
|
margin-top: 20px;
|
||||||
color: #000000;
|
color: #000000;
|
||||||
@ -74,7 +80,7 @@ span {
|
|||||||
footer {
|
footer {
|
||||||
padding: 20px;
|
padding: 20px;
|
||||||
font-family: Lato, sans-serif;
|
font-family: Lato, sans-serif;
|
||||||
font-size: 12px;
|
font-size: 14px;
|
||||||
line-height: 15px;
|
line-height: 15px;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
color: #888888;
|
color: #888888;
|
||||||
@ -95,12 +101,12 @@ footer {
|
|||||||
<p>If you don't want to change your e-mail address feel free to ignore this message. </p>
|
<p>If you don't want to change your e-mail address feel free to ignore this message. </p>
|
||||||
<p>If the above button doesn't work, you can also copy the following code into your browser window: <span>123456</span></p>
|
<p>If the above button doesn't work, you can also copy the following code into your browser window: <span>123456</span></p>
|
||||||
<div class="text-block">
|
<div class="text-block">
|
||||||
<p>See you soon on <a class="organization" href="https://ocelot.social">ocelot.social</a>!</p>
|
<p class="no-margin-top-bottom">See you soon on <a class="organization" href="https://ocelot.social">ocelot.social</a>!</p>
|
||||||
<p>– The ocelot.social Team</p>
|
<p class="no-margin-top-bottom">– The ocelot.social Team</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="support">
|
<div class="support">
|
||||||
<p>If you have questions or problems, feel free to contact our support: <a href="mailto:devops@ocelot.social">devops@ocelot.social</a></p>
|
<p class="no-margin-top-bottom">If you have questions or problems, feel free to contact our support: <a href="mailto:devops@ocelot.social">devops@ocelot.social</a></p>
|
||||||
</div>
|
</div>
|
||||||
<footer>
|
<footer>
|
||||||
<div class="footer"></div><a href="https://ocelot.social">ocelot.social Community</a>
|
<div class="footer"></div><a href="https://ocelot.social">ocelot.social Community</a>
|
||||||
@ -132,14 +138,20 @@ devops@ocelot.social [devops@ocelot.social]
|
|||||||
|
|
||||||
|
|
||||||
ocelot.social Community [https://ocelot.social]",
|
ocelot.social Community [https://ocelot.social]",
|
||||||
"to": "user@example.org",
|
"to": {
|
||||||
|
"address": "user@example.org",
|
||||||
|
"name": "User",
|
||||||
|
},
|
||||||
}
|
}
|
||||||
`;
|
`;
|
||||||
|
|
||||||
exports[`sendEmailVerification German renders correctly 1`] = `
|
exports[`sendEmailVerification German renders correctly 1`] = `
|
||||||
{
|
{
|
||||||
"attachments": [],
|
"attachments": [],
|
||||||
"from": "ocelot.social <devops@ocelot.social>",
|
"from": {
|
||||||
|
"address": "devops@ocelot.social",
|
||||||
|
"name": "ocelot.social",
|
||||||
|
},
|
||||||
"html": "<!DOCTYPE html>
|
"html": "<!DOCTYPE html>
|
||||||
<html lang="de">
|
<html lang="de">
|
||||||
<head>
|
<head>
|
||||||
@ -149,9 +161,10 @@ exports[`sendEmailVerification German renders correctly 1`] = `
|
|||||||
<style>body{
|
<style>body{
|
||||||
display: block;
|
display: block;
|
||||||
font-family: Lato, sans-serif;
|
font-family: Lato, sans-serif;
|
||||||
font-size: 17px;
|
font-size: 16px;
|
||||||
text-align: left;
|
text-align: left;
|
||||||
text-align: -webkit-left;
|
text-align: -webkit-left;
|
||||||
|
line-height: 24px;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
padding: 15px;
|
padding: 15px;
|
||||||
margin: 0px;
|
margin: 0px;
|
||||||
@ -159,9 +172,10 @@ exports[`sendEmailVerification German renders correctly 1`] = `
|
|||||||
|
|
||||||
h2 {
|
h2 {
|
||||||
margin-top: 25px;
|
margin-top: 25px;
|
||||||
font-size: 25px;
|
margin-bottom: 30px;
|
||||||
|
font-size: 24px;
|
||||||
font-weight: normal;
|
font-weight: normal;
|
||||||
line-height: 22px;
|
line-height: 24px;
|
||||||
color: #333333;
|
color: #333333;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -172,11 +186,17 @@ h2 {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.head-logo {
|
.head-logo {
|
||||||
width: 60%;
|
width: 30%;
|
||||||
height: auto;
|
height: auto;
|
||||||
display: block;
|
display: block;
|
||||||
margin-left: auto;
|
margin-left: auto;
|
||||||
margin-right: auto;
|
margin-right: auto;
|
||||||
|
margin-bottom: 50px;
|
||||||
|
}
|
||||||
|
|
||||||
|
p.no-margin-top-bottom {
|
||||||
|
margin-top: 0;
|
||||||
|
margin-bottom: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
a {
|
a {
|
||||||
@ -187,10 +207,9 @@ a.button {
|
|||||||
background: #17b53e;
|
background: #17b53e;
|
||||||
font-family: Lato, sans-serif;
|
font-family: Lato, sans-serif;
|
||||||
font-size: 16px;
|
font-size: 16px;
|
||||||
line-height: 15px;
|
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
text-align:center;
|
text-align:center;
|
||||||
padding: 13px 17px;
|
padding: 9px 18px;
|
||||||
color: #ffffff;
|
color: #ffffff;
|
||||||
display: table;
|
display: table;
|
||||||
margin-left: auto;
|
margin-left: auto;
|
||||||
@ -198,10 +217,6 @@ a.button {
|
|||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
}
|
}
|
||||||
|
|
||||||
span {
|
|
||||||
color: #17b53e;
|
|
||||||
}
|
|
||||||
|
|
||||||
.text-block {
|
.text-block {
|
||||||
margin-top: 20px;
|
margin-top: 20px;
|
||||||
color: #000000;
|
color: #000000;
|
||||||
@ -210,7 +225,7 @@ span {
|
|||||||
footer {
|
footer {
|
||||||
padding: 20px;
|
padding: 20px;
|
||||||
font-family: Lato, sans-serif;
|
font-family: Lato, sans-serif;
|
||||||
font-size: 12px;
|
font-size: 14px;
|
||||||
line-height: 15px;
|
line-height: 15px;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
color: #888888;
|
color: #888888;
|
||||||
@ -231,12 +246,12 @@ footer {
|
|||||||
<p>Falls du deine E-Mail Adresse doch nicht ändern möchtest, kannst du diese Nachricht einfach ignorieren. </p>
|
<p>Falls du deine E-Mail Adresse doch nicht ändern möchtest, kannst du diese Nachricht einfach ignorieren. </p>
|
||||||
<p>Sollte der Button für dich nicht funktionieren, kannst du auch folgenden Code in dein Browserfenster kopieren: <span>123456</span></p>
|
<p>Sollte der Button für dich nicht funktionieren, kannst du auch folgenden Code in dein Browserfenster kopieren: <span>123456</span></p>
|
||||||
<div class="text-block">
|
<div class="text-block">
|
||||||
<p>Bis bald bei <a class="organization" href="https://ocelot.social">ocelot.social</a>!</p>
|
<p class="no-margin-top-bottom">Bis bald bei <a class="organization" href="https://ocelot.social">ocelot.social</a>!</p>
|
||||||
<p>– Dein ocelot.social Team</p>
|
<p class="no-margin-top-bottom">– Dein ocelot.social Team</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="support">
|
<div class="support">
|
||||||
<p>Wenn du Fragen oder Probleme hast, kannst du dich gerne an den Support wenden: <a href="mailto:devops@ocelot.social">devops@ocelot.social</a></p>
|
<p class="no-margin-top-bottom">Wenn du Fragen oder Probleme hast, kannst du dich gerne an den Support wenden: <a href="mailto:devops@ocelot.social">devops@ocelot.social</a></p>
|
||||||
</div>
|
</div>
|
||||||
<footer>
|
<footer>
|
||||||
<div class="footer"></div><a href="https://ocelot.social">ocelot.social Community</a>
|
<div class="footer"></div><a href="https://ocelot.social">ocelot.social Community</a>
|
||||||
@ -268,6 +283,9 @@ devops@ocelot.social [devops@ocelot.social]
|
|||||||
|
|
||||||
|
|
||||||
ocelot.social Community [https://ocelot.social]",
|
ocelot.social Community [https://ocelot.social]",
|
||||||
"to": "user@example.org",
|
"to": {
|
||||||
|
"address": "user@example.org",
|
||||||
|
"name": "User",
|
||||||
|
},
|
||||||
}
|
}
|
||||||
`;
|
`;
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@ -1,9 +1,12 @@
|
|||||||
// Jest Snapshot v1, https://goo.gl/fbAQLP
|
// Jest Snapshot v1, https://jestjs.io/docs/snapshot-testing
|
||||||
|
|
||||||
exports[`sendRegistrationMail with invite code English renders correctly 1`] = `
|
exports[`sendRegistrationMail with invite code English renders correctly 1`] = `
|
||||||
{
|
{
|
||||||
"attachments": [],
|
"attachments": [],
|
||||||
"from": "ocelot.social <devops@ocelot.social>",
|
"from": {
|
||||||
|
"address": "devops@ocelot.social",
|
||||||
|
"name": "ocelot.social",
|
||||||
|
},
|
||||||
"html": "<!DOCTYPE html>
|
"html": "<!DOCTYPE html>
|
||||||
<html lang="en">
|
<html lang="en">
|
||||||
<head>
|
<head>
|
||||||
@ -13,9 +16,10 @@ exports[`sendRegistrationMail with invite code English renders correctly 1`] = `
|
|||||||
<style>body{
|
<style>body{
|
||||||
display: block;
|
display: block;
|
||||||
font-family: Lato, sans-serif;
|
font-family: Lato, sans-serif;
|
||||||
font-size: 17px;
|
font-size: 16px;
|
||||||
text-align: left;
|
text-align: left;
|
||||||
text-align: -webkit-left;
|
text-align: -webkit-left;
|
||||||
|
line-height: 24px;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
padding: 15px;
|
padding: 15px;
|
||||||
margin: 0px;
|
margin: 0px;
|
||||||
@ -23,9 +27,10 @@ exports[`sendRegistrationMail with invite code English renders correctly 1`] = `
|
|||||||
|
|
||||||
h2 {
|
h2 {
|
||||||
margin-top: 25px;
|
margin-top: 25px;
|
||||||
font-size: 25px;
|
margin-bottom: 30px;
|
||||||
|
font-size: 24px;
|
||||||
font-weight: normal;
|
font-weight: normal;
|
||||||
line-height: 22px;
|
line-height: 24px;
|
||||||
color: #333333;
|
color: #333333;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -36,11 +41,17 @@ h2 {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.head-logo {
|
.head-logo {
|
||||||
width: 60%;
|
width: 30%;
|
||||||
height: auto;
|
height: auto;
|
||||||
display: block;
|
display: block;
|
||||||
margin-left: auto;
|
margin-left: auto;
|
||||||
margin-right: auto;
|
margin-right: auto;
|
||||||
|
margin-bottom: 50px;
|
||||||
|
}
|
||||||
|
|
||||||
|
p.no-margin-top-bottom {
|
||||||
|
margin-top: 0;
|
||||||
|
margin-bottom: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
a {
|
a {
|
||||||
@ -51,10 +62,9 @@ a.button {
|
|||||||
background: #17b53e;
|
background: #17b53e;
|
||||||
font-family: Lato, sans-serif;
|
font-family: Lato, sans-serif;
|
||||||
font-size: 16px;
|
font-size: 16px;
|
||||||
line-height: 15px;
|
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
text-align:center;
|
text-align:center;
|
||||||
padding: 13px 17px;
|
padding: 9px 18px;
|
||||||
color: #ffffff;
|
color: #ffffff;
|
||||||
display: table;
|
display: table;
|
||||||
margin-left: auto;
|
margin-left: auto;
|
||||||
@ -62,10 +72,6 @@ a.button {
|
|||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
}
|
}
|
||||||
|
|
||||||
span {
|
|
||||||
color: #17b53e;
|
|
||||||
}
|
|
||||||
|
|
||||||
.text-block {
|
.text-block {
|
||||||
margin-top: 20px;
|
margin-top: 20px;
|
||||||
color: #000000;
|
color: #000000;
|
||||||
@ -74,7 +80,7 @@ span {
|
|||||||
footer {
|
footer {
|
||||||
padding: 20px;
|
padding: 20px;
|
||||||
font-family: Lato, sans-serif;
|
font-family: Lato, sans-serif;
|
||||||
font-size: 12px;
|
font-size: 14px;
|
||||||
line-height: 15px;
|
line-height: 15px;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
color: #888888;
|
color: #888888;
|
||||||
@ -91,19 +97,19 @@ footer {
|
|||||||
<h2>Welcome to ocelot.social!</h2>
|
<h2>Welcome to ocelot.social!</h2>
|
||||||
<div class="wrapper">
|
<div class="wrapper">
|
||||||
<div class="content"></div>
|
<div class="content"></div>
|
||||||
<p>Thank you for joining our cause – it's awesome to have you on board. There's just one tiny step missing before we can start shaping the world together … Please confirm your e-mail address by clicking the button below:</p><a class="button" href="http://webapp:3000/registration?email=user%40example.org&nonce=123456&inviteCode=welcome&method=invite-code">Confirm your e-mail address</a>
|
<p>Thank you for joining our cause – it's awesome to have you on board. There's just one tiny step missing before we can start shaping the world together … Please confirm your e-mail address by clicking the button below:</p><a class="button" href="http://webapp:3000/registration?email=moderator%40example.org&nonce=123456&inviteCode=welcome&method=invite-code">Confirm your e-mail address</a>
|
||||||
<p>If the above button doesn't work, you can also copy the following code into your browser window: <span>123456</span></p>
|
<p>If the above button doesn't work, you can also copy the following code into your browser window: <span>123456</span></p>
|
||||||
<p>However, this only works if you have registered through our website.</p>
|
<p>However, this only works if you have registered through our website.</p>
|
||||||
<p>If you didn't sign up for <a>ocelot.social</a> we recommend you to check it out! It's a social network from people for people who want to connect and change the world together.
|
<p>If you didn't sign up for <a>ocelot.social</a> we recommend you to check it out! It's a social network from people for people who want to connect and change the world together.
|
||||||
</p>
|
</p>
|
||||||
<p>PS: If you ignore this e-mail we will not create an account for you. ;)</p>
|
<p>PS: If you ignore this e-mail we will not create an account for you. ;)</p>
|
||||||
<div class="text-block">
|
<div class="text-block">
|
||||||
<p>See you soon on <a class="organization" href="https://ocelot.social">ocelot.social</a>!</p>
|
<p class="no-margin-top-bottom">See you soon on <a class="organization" href="https://ocelot.social">ocelot.social</a>!</p>
|
||||||
<p>– The ocelot.social Team</p>
|
<p class="no-margin-top-bottom">– The ocelot.social Team</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="support">
|
<div class="support">
|
||||||
<p>If you have questions or problems, feel free to contact our support: <a href="mailto:devops@ocelot.social">devops@ocelot.social</a></p>
|
<p class="no-margin-top-bottom">If you have questions or problems, feel free to contact our support: <a href="mailto:devops@ocelot.social">devops@ocelot.social</a></p>
|
||||||
</div>
|
</div>
|
||||||
<footer>
|
<footer>
|
||||||
<div class="footer"></div><a href="https://ocelot.social">ocelot.social Community</a>
|
<div class="footer"></div><a href="https://ocelot.social">ocelot.social Community</a>
|
||||||
@ -119,7 +125,7 @@ just one tiny step missing before we can start shaping the world together …
|
|||||||
Please confirm your e-mail address by clicking the button below:
|
Please confirm your e-mail address by clicking the button below:
|
||||||
|
|
||||||
Confirm your e-mail address
|
Confirm your e-mail address
|
||||||
[http://webapp:3000/registration?email=user%40example.org&nonce=123456&inviteCode=welcome&method=invite-code]
|
[http://webapp:3000/registration?email=moderator%40example.org&nonce=123456&inviteCode=welcome&method=invite-code]
|
||||||
|
|
||||||
If the above button doesn't work, you can also copy the following code into your
|
If the above button doesn't work, you can also copy the following code into your
|
||||||
browser window: 123456
|
browser window: 123456
|
||||||
@ -141,14 +147,20 @@ devops@ocelot.social [devops@ocelot.social]
|
|||||||
|
|
||||||
|
|
||||||
ocelot.social Community [https://ocelot.social]",
|
ocelot.social Community [https://ocelot.social]",
|
||||||
"to": "user@example.org",
|
"to": {
|
||||||
|
"address": "moderator@example.org",
|
||||||
|
"name": "Bob &"?@\\ Baumeister",
|
||||||
|
},
|
||||||
}
|
}
|
||||||
`;
|
`;
|
||||||
|
|
||||||
exports[`sendRegistrationMail with invite code German renders correctly 1`] = `
|
exports[`sendRegistrationMail with invite code German renders correctly 1`] = `
|
||||||
{
|
{
|
||||||
"attachments": [],
|
"attachments": [],
|
||||||
"from": "ocelot.social <devops@ocelot.social>",
|
"from": {
|
||||||
|
"address": "devops@ocelot.social",
|
||||||
|
"name": "ocelot.social",
|
||||||
|
},
|
||||||
"html": "<!DOCTYPE html>
|
"html": "<!DOCTYPE html>
|
||||||
<html lang="de">
|
<html lang="de">
|
||||||
<head>
|
<head>
|
||||||
@ -158,9 +170,10 @@ exports[`sendRegistrationMail with invite code German renders correctly 1`] = `
|
|||||||
<style>body{
|
<style>body{
|
||||||
display: block;
|
display: block;
|
||||||
font-family: Lato, sans-serif;
|
font-family: Lato, sans-serif;
|
||||||
font-size: 17px;
|
font-size: 16px;
|
||||||
text-align: left;
|
text-align: left;
|
||||||
text-align: -webkit-left;
|
text-align: -webkit-left;
|
||||||
|
line-height: 24px;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
padding: 15px;
|
padding: 15px;
|
||||||
margin: 0px;
|
margin: 0px;
|
||||||
@ -168,9 +181,10 @@ exports[`sendRegistrationMail with invite code German renders correctly 1`] = `
|
|||||||
|
|
||||||
h2 {
|
h2 {
|
||||||
margin-top: 25px;
|
margin-top: 25px;
|
||||||
font-size: 25px;
|
margin-bottom: 30px;
|
||||||
|
font-size: 24px;
|
||||||
font-weight: normal;
|
font-weight: normal;
|
||||||
line-height: 22px;
|
line-height: 24px;
|
||||||
color: #333333;
|
color: #333333;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -181,11 +195,17 @@ h2 {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.head-logo {
|
.head-logo {
|
||||||
width: 60%;
|
width: 30%;
|
||||||
height: auto;
|
height: auto;
|
||||||
display: block;
|
display: block;
|
||||||
margin-left: auto;
|
margin-left: auto;
|
||||||
margin-right: auto;
|
margin-right: auto;
|
||||||
|
margin-bottom: 50px;
|
||||||
|
}
|
||||||
|
|
||||||
|
p.no-margin-top-bottom {
|
||||||
|
margin-top: 0;
|
||||||
|
margin-bottom: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
a {
|
a {
|
||||||
@ -196,10 +216,9 @@ a.button {
|
|||||||
background: #17b53e;
|
background: #17b53e;
|
||||||
font-family: Lato, sans-serif;
|
font-family: Lato, sans-serif;
|
||||||
font-size: 16px;
|
font-size: 16px;
|
||||||
line-height: 15px;
|
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
text-align:center;
|
text-align:center;
|
||||||
padding: 13px 17px;
|
padding: 9px 18px;
|
||||||
color: #ffffff;
|
color: #ffffff;
|
||||||
display: table;
|
display: table;
|
||||||
margin-left: auto;
|
margin-left: auto;
|
||||||
@ -207,10 +226,6 @@ a.button {
|
|||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
}
|
}
|
||||||
|
|
||||||
span {
|
|
||||||
color: #17b53e;
|
|
||||||
}
|
|
||||||
|
|
||||||
.text-block {
|
.text-block {
|
||||||
margin-top: 20px;
|
margin-top: 20px;
|
||||||
color: #000000;
|
color: #000000;
|
||||||
@ -219,7 +234,7 @@ span {
|
|||||||
footer {
|
footer {
|
||||||
padding: 20px;
|
padding: 20px;
|
||||||
font-family: Lato, sans-serif;
|
font-family: Lato, sans-serif;
|
||||||
font-size: 12px;
|
font-size: 14px;
|
||||||
line-height: 15px;
|
line-height: 15px;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
color: #888888;
|
color: #888888;
|
||||||
@ -236,19 +251,19 @@ footer {
|
|||||||
<h2>Willkommen bei ocelot.social!</h2>
|
<h2>Willkommen bei ocelot.social!</h2>
|
||||||
<div class="wrapper">
|
<div class="wrapper">
|
||||||
<div class="content"></div>
|
<div class="content"></div>
|
||||||
<p>Danke, dass du dich angemeldet hast – wir freuen uns, dich dabei zu haben. Jetzt fehlt nur noch eine Kleinigkeit, bevor wir gemeinsam die Welt verbessern können … Bitte bestätige deine E-Mail Adresse:</p><a class="button" href="http://webapp:3000/registration?email=user%40example.org&nonce=123456&inviteCode=welcome&method=invite-code">Bestätige deine E-Mail Adresse</a>
|
<p>Danke, dass du dich angemeldet hast – wir freuen uns, dich dabei zu haben. Jetzt fehlt nur noch eine Kleinigkeit, bevor wir gemeinsam die Welt verbessern können … Bitte bestätige deine E-Mail Adresse:</p><a class="button" href="http://webapp:3000/registration?email=moderator%40example.org&nonce=123456&inviteCode=welcome&method=invite-code">Bestätige deine E-Mail Adresse</a>
|
||||||
<p>Sollte der Button für dich nicht funktionieren, kannst du auch folgenden Code in dein Browserfenster kopieren: <span>123456</span></p>
|
<p>Sollte der Button für dich nicht funktionieren, kannst du auch folgenden Code in dein Browserfenster kopieren: <span>123456</span></p>
|
||||||
<p>Das funktioniert allerdings nur, wenn du dich über unsere Website registriert hast.</p>
|
<p>Das funktioniert allerdings nur, wenn du dich über unsere Website registriert hast.</p>
|
||||||
<p>Falls du dich nicht selbst bei <a>ocelot.social</a> angemeldet hast, schau doch mal vorbei! Wir sind ein gemeinnütziges Aktionsnetzwerk – von Menschen für Menschen.
|
<p>Falls du dich nicht selbst bei <a>ocelot.social</a> angemeldet hast, schau doch mal vorbei! Wir sind ein gemeinnütziges Aktionsnetzwerk – von Menschen für Menschen.
|
||||||
</p>
|
</p>
|
||||||
<p>PS: Wenn du keinen Account bei uns möchtest, kannst du diese E-Mail einfach ignorieren. ;)</p>
|
<p>PS: Wenn du keinen Account bei uns möchtest, kannst du diese E-Mail einfach ignorieren. ;)</p>
|
||||||
<div class="text-block">
|
<div class="text-block">
|
||||||
<p>Bis bald bei <a class="organization" href="https://ocelot.social">ocelot.social</a>!</p>
|
<p class="no-margin-top-bottom">Bis bald bei <a class="organization" href="https://ocelot.social">ocelot.social</a>!</p>
|
||||||
<p>– Dein ocelot.social Team</p>
|
<p class="no-margin-top-bottom">– Dein ocelot.social Team</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="support">
|
<div class="support">
|
||||||
<p>Wenn du Fragen oder Probleme hast, kannst du dich gerne an den Support wenden: <a href="mailto:devops@ocelot.social">devops@ocelot.social</a></p>
|
<p class="no-margin-top-bottom">Wenn du Fragen oder Probleme hast, kannst du dich gerne an den Support wenden: <a href="mailto:devops@ocelot.social">devops@ocelot.social</a></p>
|
||||||
</div>
|
</div>
|
||||||
<footer>
|
<footer>
|
||||||
<div class="footer"></div><a href="https://ocelot.social">ocelot.social Community</a>
|
<div class="footer"></div><a href="https://ocelot.social">ocelot.social Community</a>
|
||||||
@ -264,7 +279,7 @@ fehlt nur noch eine Kleinigkeit, bevor wir gemeinsam die Welt verbessern können
|
|||||||
… Bitte bestätige deine E-Mail Adresse:
|
… Bitte bestätige deine E-Mail Adresse:
|
||||||
|
|
||||||
Bestätige deine E-Mail Adresse
|
Bestätige deine E-Mail Adresse
|
||||||
[http://webapp:3000/registration?email=user%40example.org&nonce=123456&inviteCode=welcome&method=invite-code]
|
[http://webapp:3000/registration?email=moderator%40example.org&nonce=123456&inviteCode=welcome&method=invite-code]
|
||||||
|
|
||||||
Sollte der Button für dich nicht funktionieren, kannst du auch folgenden Code in
|
Sollte der Button für dich nicht funktionieren, kannst du auch folgenden Code in
|
||||||
dein Browserfenster kopieren: 123456
|
dein Browserfenster kopieren: 123456
|
||||||
@ -287,14 +302,20 @@ devops@ocelot.social [devops@ocelot.social]
|
|||||||
|
|
||||||
|
|
||||||
ocelot.social Community [https://ocelot.social]",
|
ocelot.social Community [https://ocelot.social]",
|
||||||
"to": "user@example.org",
|
"to": {
|
||||||
|
"address": "moderator@example.org",
|
||||||
|
"name": "Bob &"?@\\ Baumeister",
|
||||||
|
},
|
||||||
}
|
}
|
||||||
`;
|
`;
|
||||||
|
|
||||||
exports[`sendRegistrationMail without invite code English renders correctly 1`] = `
|
exports[`sendRegistrationMail without invite code English renders correctly 1`] = `
|
||||||
{
|
{
|
||||||
"attachments": [],
|
"attachments": [],
|
||||||
"from": "ocelot.social <devops@ocelot.social>",
|
"from": {
|
||||||
|
"address": "devops@ocelot.social",
|
||||||
|
"name": "ocelot.social",
|
||||||
|
},
|
||||||
"html": "<!DOCTYPE html>
|
"html": "<!DOCTYPE html>
|
||||||
<html lang="en">
|
<html lang="en">
|
||||||
<head>
|
<head>
|
||||||
@ -304,9 +325,10 @@ exports[`sendRegistrationMail without invite code English renders correctly 1`]
|
|||||||
<style>body{
|
<style>body{
|
||||||
display: block;
|
display: block;
|
||||||
font-family: Lato, sans-serif;
|
font-family: Lato, sans-serif;
|
||||||
font-size: 17px;
|
font-size: 16px;
|
||||||
text-align: left;
|
text-align: left;
|
||||||
text-align: -webkit-left;
|
text-align: -webkit-left;
|
||||||
|
line-height: 24px;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
padding: 15px;
|
padding: 15px;
|
||||||
margin: 0px;
|
margin: 0px;
|
||||||
@ -314,9 +336,10 @@ exports[`sendRegistrationMail without invite code English renders correctly 1`]
|
|||||||
|
|
||||||
h2 {
|
h2 {
|
||||||
margin-top: 25px;
|
margin-top: 25px;
|
||||||
font-size: 25px;
|
margin-bottom: 30px;
|
||||||
|
font-size: 24px;
|
||||||
font-weight: normal;
|
font-weight: normal;
|
||||||
line-height: 22px;
|
line-height: 24px;
|
||||||
color: #333333;
|
color: #333333;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -327,11 +350,17 @@ h2 {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.head-logo {
|
.head-logo {
|
||||||
width: 60%;
|
width: 30%;
|
||||||
height: auto;
|
height: auto;
|
||||||
display: block;
|
display: block;
|
||||||
margin-left: auto;
|
margin-left: auto;
|
||||||
margin-right: auto;
|
margin-right: auto;
|
||||||
|
margin-bottom: 50px;
|
||||||
|
}
|
||||||
|
|
||||||
|
p.no-margin-top-bottom {
|
||||||
|
margin-top: 0;
|
||||||
|
margin-bottom: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
a {
|
a {
|
||||||
@ -342,10 +371,9 @@ a.button {
|
|||||||
background: #17b53e;
|
background: #17b53e;
|
||||||
font-family: Lato, sans-serif;
|
font-family: Lato, sans-serif;
|
||||||
font-size: 16px;
|
font-size: 16px;
|
||||||
line-height: 15px;
|
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
text-align:center;
|
text-align:center;
|
||||||
padding: 13px 17px;
|
padding: 9px 18px;
|
||||||
color: #ffffff;
|
color: #ffffff;
|
||||||
display: table;
|
display: table;
|
||||||
margin-left: auto;
|
margin-left: auto;
|
||||||
@ -353,10 +381,6 @@ a.button {
|
|||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
}
|
}
|
||||||
|
|
||||||
span {
|
|
||||||
color: #17b53e;
|
|
||||||
}
|
|
||||||
|
|
||||||
.text-block {
|
.text-block {
|
||||||
margin-top: 20px;
|
margin-top: 20px;
|
||||||
color: #000000;
|
color: #000000;
|
||||||
@ -365,7 +389,7 @@ span {
|
|||||||
footer {
|
footer {
|
||||||
padding: 20px;
|
padding: 20px;
|
||||||
font-family: Lato, sans-serif;
|
font-family: Lato, sans-serif;
|
||||||
font-size: 12px;
|
font-size: 14px;
|
||||||
line-height: 15px;
|
line-height: 15px;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
color: #888888;
|
color: #888888;
|
||||||
@ -382,19 +406,19 @@ footer {
|
|||||||
<h2>Welcome to ocelot.social!</h2>
|
<h2>Welcome to ocelot.social!</h2>
|
||||||
<div class="wrapper">
|
<div class="wrapper">
|
||||||
<div class="content"></div>
|
<div class="content"></div>
|
||||||
<p>Thank you for joining our cause – it's awesome to have you on board. There's just one tiny step missing before we can start shaping the world together … Please confirm your e-mail address by clicking the button below:</p><a class="button" href="http://webapp:3000/registration?email=user%40example.org&nonce=123456&method=invite-mail">Confirm your e-mail address</a>
|
<p>Thank you for joining our cause – it's awesome to have you on board. There's just one tiny step missing before we can start shaping the world together … Please confirm your e-mail address by clicking the button below:</p><a class="button" href="http://webapp:3000/registration?email=moderator%40example.org&nonce=123456&method=invite-mail">Confirm your e-mail address</a>
|
||||||
<p>If the above button doesn't work, you can also copy the following code into your browser window: <span>123456</span></p>
|
<p>If the above button doesn't work, you can also copy the following code into your browser window: <span>123456</span></p>
|
||||||
<p>However, this only works if you have registered through our website.</p>
|
<p>However, this only works if you have registered through our website.</p>
|
||||||
<p>If you didn't sign up for <a>ocelot.social</a> we recommend you to check it out! It's a social network from people for people who want to connect and change the world together.
|
<p>If you didn't sign up for <a>ocelot.social</a> we recommend you to check it out! It's a social network from people for people who want to connect and change the world together.
|
||||||
</p>
|
</p>
|
||||||
<p>PS: If you ignore this e-mail we will not create an account for you. ;)</p>
|
<p>PS: If you ignore this e-mail we will not create an account for you. ;)</p>
|
||||||
<div class="text-block">
|
<div class="text-block">
|
||||||
<p>See you soon on <a class="organization" href="https://ocelot.social">ocelot.social</a>!</p>
|
<p class="no-margin-top-bottom">See you soon on <a class="organization" href="https://ocelot.social">ocelot.social</a>!</p>
|
||||||
<p>– The ocelot.social Team</p>
|
<p class="no-margin-top-bottom">– The ocelot.social Team</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="support">
|
<div class="support">
|
||||||
<p>If you have questions or problems, feel free to contact our support: <a href="mailto:devops@ocelot.social">devops@ocelot.social</a></p>
|
<p class="no-margin-top-bottom">If you have questions or problems, feel free to contact our support: <a href="mailto:devops@ocelot.social">devops@ocelot.social</a></p>
|
||||||
</div>
|
</div>
|
||||||
<footer>
|
<footer>
|
||||||
<div class="footer"></div><a href="https://ocelot.social">ocelot.social Community</a>
|
<div class="footer"></div><a href="https://ocelot.social">ocelot.social Community</a>
|
||||||
@ -410,7 +434,7 @@ just one tiny step missing before we can start shaping the world together …
|
|||||||
Please confirm your e-mail address by clicking the button below:
|
Please confirm your e-mail address by clicking the button below:
|
||||||
|
|
||||||
Confirm your e-mail address
|
Confirm your e-mail address
|
||||||
[http://webapp:3000/registration?email=user%40example.org&nonce=123456&method=invite-mail]
|
[http://webapp:3000/registration?email=moderator%40example.org&nonce=123456&method=invite-mail]
|
||||||
|
|
||||||
If the above button doesn't work, you can also copy the following code into your
|
If the above button doesn't work, you can also copy the following code into your
|
||||||
browser window: 123456
|
browser window: 123456
|
||||||
@ -432,14 +456,20 @@ devops@ocelot.social [devops@ocelot.social]
|
|||||||
|
|
||||||
|
|
||||||
ocelot.social Community [https://ocelot.social]",
|
ocelot.social Community [https://ocelot.social]",
|
||||||
"to": "user@example.org",
|
"to": {
|
||||||
|
"address": "moderator@example.org",
|
||||||
|
"name": "Bob &"?@\\ Baumeister",
|
||||||
|
},
|
||||||
}
|
}
|
||||||
`;
|
`;
|
||||||
|
|
||||||
exports[`sendRegistrationMail without invite code German renders correctly 1`] = `
|
exports[`sendRegistrationMail without invite code German renders correctly 1`] = `
|
||||||
{
|
{
|
||||||
"attachments": [],
|
"attachments": [],
|
||||||
"from": "ocelot.social <devops@ocelot.social>",
|
"from": {
|
||||||
|
"address": "devops@ocelot.social",
|
||||||
|
"name": "ocelot.social",
|
||||||
|
},
|
||||||
"html": "<!DOCTYPE html>
|
"html": "<!DOCTYPE html>
|
||||||
<html lang="de">
|
<html lang="de">
|
||||||
<head>
|
<head>
|
||||||
@ -449,9 +479,10 @@ exports[`sendRegistrationMail without invite code German renders correctly 1`] =
|
|||||||
<style>body{
|
<style>body{
|
||||||
display: block;
|
display: block;
|
||||||
font-family: Lato, sans-serif;
|
font-family: Lato, sans-serif;
|
||||||
font-size: 17px;
|
font-size: 16px;
|
||||||
text-align: left;
|
text-align: left;
|
||||||
text-align: -webkit-left;
|
text-align: -webkit-left;
|
||||||
|
line-height: 24px;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
padding: 15px;
|
padding: 15px;
|
||||||
margin: 0px;
|
margin: 0px;
|
||||||
@ -459,9 +490,10 @@ exports[`sendRegistrationMail without invite code German renders correctly 1`] =
|
|||||||
|
|
||||||
h2 {
|
h2 {
|
||||||
margin-top: 25px;
|
margin-top: 25px;
|
||||||
font-size: 25px;
|
margin-bottom: 30px;
|
||||||
|
font-size: 24px;
|
||||||
font-weight: normal;
|
font-weight: normal;
|
||||||
line-height: 22px;
|
line-height: 24px;
|
||||||
color: #333333;
|
color: #333333;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -472,11 +504,17 @@ h2 {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.head-logo {
|
.head-logo {
|
||||||
width: 60%;
|
width: 30%;
|
||||||
height: auto;
|
height: auto;
|
||||||
display: block;
|
display: block;
|
||||||
margin-left: auto;
|
margin-left: auto;
|
||||||
margin-right: auto;
|
margin-right: auto;
|
||||||
|
margin-bottom: 50px;
|
||||||
|
}
|
||||||
|
|
||||||
|
p.no-margin-top-bottom {
|
||||||
|
margin-top: 0;
|
||||||
|
margin-bottom: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
a {
|
a {
|
||||||
@ -487,10 +525,9 @@ a.button {
|
|||||||
background: #17b53e;
|
background: #17b53e;
|
||||||
font-family: Lato, sans-serif;
|
font-family: Lato, sans-serif;
|
||||||
font-size: 16px;
|
font-size: 16px;
|
||||||
line-height: 15px;
|
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
text-align:center;
|
text-align:center;
|
||||||
padding: 13px 17px;
|
padding: 9px 18px;
|
||||||
color: #ffffff;
|
color: #ffffff;
|
||||||
display: table;
|
display: table;
|
||||||
margin-left: auto;
|
margin-left: auto;
|
||||||
@ -498,10 +535,6 @@ a.button {
|
|||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
}
|
}
|
||||||
|
|
||||||
span {
|
|
||||||
color: #17b53e;
|
|
||||||
}
|
|
||||||
|
|
||||||
.text-block {
|
.text-block {
|
||||||
margin-top: 20px;
|
margin-top: 20px;
|
||||||
color: #000000;
|
color: #000000;
|
||||||
@ -510,7 +543,7 @@ span {
|
|||||||
footer {
|
footer {
|
||||||
padding: 20px;
|
padding: 20px;
|
||||||
font-family: Lato, sans-serif;
|
font-family: Lato, sans-serif;
|
||||||
font-size: 12px;
|
font-size: 14px;
|
||||||
line-height: 15px;
|
line-height: 15px;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
color: #888888;
|
color: #888888;
|
||||||
@ -527,19 +560,19 @@ footer {
|
|||||||
<h2>Willkommen bei ocelot.social!</h2>
|
<h2>Willkommen bei ocelot.social!</h2>
|
||||||
<div class="wrapper">
|
<div class="wrapper">
|
||||||
<div class="content"></div>
|
<div class="content"></div>
|
||||||
<p>Danke, dass du dich angemeldet hast – wir freuen uns, dich dabei zu haben. Jetzt fehlt nur noch eine Kleinigkeit, bevor wir gemeinsam die Welt verbessern können … Bitte bestätige deine E-Mail Adresse:</p><a class="button" href="http://webapp:3000/registration?email=user%40example.org&nonce=123456&method=invite-mail">Bestätige deine E-Mail Adresse</a>
|
<p>Danke, dass du dich angemeldet hast – wir freuen uns, dich dabei zu haben. Jetzt fehlt nur noch eine Kleinigkeit, bevor wir gemeinsam die Welt verbessern können … Bitte bestätige deine E-Mail Adresse:</p><a class="button" href="http://webapp:3000/registration?email=moderator%40example.org&nonce=123456&method=invite-mail">Bestätige deine E-Mail Adresse</a>
|
||||||
<p>Sollte der Button für dich nicht funktionieren, kannst du auch folgenden Code in dein Browserfenster kopieren: <span>123456</span></p>
|
<p>Sollte der Button für dich nicht funktionieren, kannst du auch folgenden Code in dein Browserfenster kopieren: <span>123456</span></p>
|
||||||
<p>Das funktioniert allerdings nur, wenn du dich über unsere Website registriert hast.</p>
|
<p>Das funktioniert allerdings nur, wenn du dich über unsere Website registriert hast.</p>
|
||||||
<p>Falls du dich nicht selbst bei <a>ocelot.social</a> angemeldet hast, schau doch mal vorbei! Wir sind ein gemeinnütziges Aktionsnetzwerk – von Menschen für Menschen.
|
<p>Falls du dich nicht selbst bei <a>ocelot.social</a> angemeldet hast, schau doch mal vorbei! Wir sind ein gemeinnütziges Aktionsnetzwerk – von Menschen für Menschen.
|
||||||
</p>
|
</p>
|
||||||
<p>PS: Wenn du keinen Account bei uns möchtest, kannst du diese E-Mail einfach ignorieren. ;)</p>
|
<p>PS: Wenn du keinen Account bei uns möchtest, kannst du diese E-Mail einfach ignorieren. ;)</p>
|
||||||
<div class="text-block">
|
<div class="text-block">
|
||||||
<p>Bis bald bei <a class="organization" href="https://ocelot.social">ocelot.social</a>!</p>
|
<p class="no-margin-top-bottom">Bis bald bei <a class="organization" href="https://ocelot.social">ocelot.social</a>!</p>
|
||||||
<p>– Dein ocelot.social Team</p>
|
<p class="no-margin-top-bottom">– Dein ocelot.social Team</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="support">
|
<div class="support">
|
||||||
<p>Wenn du Fragen oder Probleme hast, kannst du dich gerne an den Support wenden: <a href="mailto:devops@ocelot.social">devops@ocelot.social</a></p>
|
<p class="no-margin-top-bottom">Wenn du Fragen oder Probleme hast, kannst du dich gerne an den Support wenden: <a href="mailto:devops@ocelot.social">devops@ocelot.social</a></p>
|
||||||
</div>
|
</div>
|
||||||
<footer>
|
<footer>
|
||||||
<div class="footer"></div><a href="https://ocelot.social">ocelot.social Community</a>
|
<div class="footer"></div><a href="https://ocelot.social">ocelot.social Community</a>
|
||||||
@ -555,7 +588,7 @@ fehlt nur noch eine Kleinigkeit, bevor wir gemeinsam die Welt verbessern können
|
|||||||
… Bitte bestätige deine E-Mail Adresse:
|
… Bitte bestätige deine E-Mail Adresse:
|
||||||
|
|
||||||
Bestätige deine E-Mail Adresse
|
Bestätige deine E-Mail Adresse
|
||||||
[http://webapp:3000/registration?email=user%40example.org&nonce=123456&method=invite-mail]
|
[http://webapp:3000/registration?email=moderator%40example.org&nonce=123456&method=invite-mail]
|
||||||
|
|
||||||
Sollte der Button für dich nicht funktionieren, kannst du auch folgenden Code in
|
Sollte der Button für dich nicht funktionieren, kannst du auch folgenden Code in
|
||||||
dein Browserfenster kopieren: 123456
|
dein Browserfenster kopieren: 123456
|
||||||
@ -578,6 +611,9 @@ devops@ocelot.social [devops@ocelot.social]
|
|||||||
|
|
||||||
|
|
||||||
ocelot.social Community [https://ocelot.social]",
|
ocelot.social Community [https://ocelot.social]",
|
||||||
"to": "user@example.org",
|
"to": {
|
||||||
|
"address": "moderator@example.org",
|
||||||
|
"name": "Bob &"?@\\ Baumeister",
|
||||||
|
},
|
||||||
}
|
}
|
||||||
`;
|
`;
|
||||||
|
|||||||
@ -1,9 +1,12 @@
|
|||||||
// Jest Snapshot v1, https://goo.gl/fbAQLP
|
// Jest Snapshot v1, https://jestjs.io/docs/snapshot-testing
|
||||||
|
|
||||||
exports[`sendResetPasswordMail English renders correctly 1`] = `
|
exports[`sendResetPasswordMail English renders correctly 1`] = `
|
||||||
{
|
{
|
||||||
"attachments": [],
|
"attachments": [],
|
||||||
"from": "ocelot.social <devops@ocelot.social>",
|
"from": {
|
||||||
|
"address": "devops@ocelot.social",
|
||||||
|
"name": "ocelot.social",
|
||||||
|
},
|
||||||
"html": "<!DOCTYPE html>
|
"html": "<!DOCTYPE html>
|
||||||
<html lang="en">
|
<html lang="en">
|
||||||
<head>
|
<head>
|
||||||
@ -13,9 +16,10 @@ exports[`sendResetPasswordMail English renders correctly 1`] = `
|
|||||||
<style>body{
|
<style>body{
|
||||||
display: block;
|
display: block;
|
||||||
font-family: Lato, sans-serif;
|
font-family: Lato, sans-serif;
|
||||||
font-size: 17px;
|
font-size: 16px;
|
||||||
text-align: left;
|
text-align: left;
|
||||||
text-align: -webkit-left;
|
text-align: -webkit-left;
|
||||||
|
line-height: 24px;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
padding: 15px;
|
padding: 15px;
|
||||||
margin: 0px;
|
margin: 0px;
|
||||||
@ -23,9 +27,10 @@ exports[`sendResetPasswordMail English renders correctly 1`] = `
|
|||||||
|
|
||||||
h2 {
|
h2 {
|
||||||
margin-top: 25px;
|
margin-top: 25px;
|
||||||
font-size: 25px;
|
margin-bottom: 30px;
|
||||||
|
font-size: 24px;
|
||||||
font-weight: normal;
|
font-weight: normal;
|
||||||
line-height: 22px;
|
line-height: 24px;
|
||||||
color: #333333;
|
color: #333333;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -36,11 +41,17 @@ h2 {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.head-logo {
|
.head-logo {
|
||||||
width: 60%;
|
width: 30%;
|
||||||
height: auto;
|
height: auto;
|
||||||
display: block;
|
display: block;
|
||||||
margin-left: auto;
|
margin-left: auto;
|
||||||
margin-right: auto;
|
margin-right: auto;
|
||||||
|
margin-bottom: 50px;
|
||||||
|
}
|
||||||
|
|
||||||
|
p.no-margin-top-bottom {
|
||||||
|
margin-top: 0;
|
||||||
|
margin-bottom: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
a {
|
a {
|
||||||
@ -51,10 +62,9 @@ a.button {
|
|||||||
background: #17b53e;
|
background: #17b53e;
|
||||||
font-family: Lato, sans-serif;
|
font-family: Lato, sans-serif;
|
||||||
font-size: 16px;
|
font-size: 16px;
|
||||||
line-height: 15px;
|
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
text-align:center;
|
text-align:center;
|
||||||
padding: 13px 17px;
|
padding: 9px 18px;
|
||||||
color: #ffffff;
|
color: #ffffff;
|
||||||
display: table;
|
display: table;
|
||||||
margin-left: auto;
|
margin-left: auto;
|
||||||
@ -62,10 +72,6 @@ a.button {
|
|||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
}
|
}
|
||||||
|
|
||||||
span {
|
|
||||||
color: #17b53e;
|
|
||||||
}
|
|
||||||
|
|
||||||
.text-block {
|
.text-block {
|
||||||
margin-top: 20px;
|
margin-top: 20px;
|
||||||
color: #000000;
|
color: #000000;
|
||||||
@ -74,7 +80,7 @@ span {
|
|||||||
footer {
|
footer {
|
||||||
padding: 20px;
|
padding: 20px;
|
||||||
font-family: Lato, sans-serif;
|
font-family: Lato, sans-serif;
|
||||||
font-size: 12px;
|
font-size: 14px;
|
||||||
line-height: 15px;
|
line-height: 15px;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
color: #888888;
|
color: #888888;
|
||||||
@ -95,12 +101,12 @@ footer {
|
|||||||
<p>If you didn't request a new password feel free to ignore this e-mail.</p>
|
<p>If you didn't request a new password feel free to ignore this e-mail.</p>
|
||||||
<p>If the above button doesn't work you can also copy the following code into your browser window: <span>123456</span></p>
|
<p>If the above button doesn't work you can also copy the following code into your browser window: <span>123456</span></p>
|
||||||
<div class="text-block">
|
<div class="text-block">
|
||||||
<p>See you soon on <a class="organization" href="https://ocelot.social">ocelot.social</a>!</p>
|
<p class="no-margin-top-bottom">See you soon on <a class="organization" href="https://ocelot.social">ocelot.social</a>!</p>
|
||||||
<p>– The ocelot.social Team</p>
|
<p class="no-margin-top-bottom">– The ocelot.social Team</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="support">
|
<div class="support">
|
||||||
<p>If you have questions or problems, feel free to contact our support: <a href="mailto:devops@ocelot.social">devops@ocelot.social</a></p>
|
<p class="no-margin-top-bottom">If you have questions or problems, feel free to contact our support: <a href="mailto:devops@ocelot.social">devops@ocelot.social</a></p>
|
||||||
</div>
|
</div>
|
||||||
<footer>
|
<footer>
|
||||||
<div class="footer"></div><a href="https://ocelot.social">ocelot.social Community</a>
|
<div class="footer"></div><a href="https://ocelot.social">ocelot.social Community</a>
|
||||||
@ -131,14 +137,20 @@ devops@ocelot.social [devops@ocelot.social]
|
|||||||
|
|
||||||
|
|
||||||
ocelot.social Community [https://ocelot.social]",
|
ocelot.social Community [https://ocelot.social]",
|
||||||
"to": "user@example.org",
|
"to": {
|
||||||
|
"address": "user@example.org",
|
||||||
|
"name": "Jenny Rostock",
|
||||||
|
},
|
||||||
}
|
}
|
||||||
`;
|
`;
|
||||||
|
|
||||||
exports[`sendResetPasswordMail German renders correctly 1`] = `
|
exports[`sendResetPasswordMail German renders correctly 1`] = `
|
||||||
{
|
{
|
||||||
"attachments": [],
|
"attachments": [],
|
||||||
"from": "ocelot.social <devops@ocelot.social>",
|
"from": {
|
||||||
|
"address": "devops@ocelot.social",
|
||||||
|
"name": "ocelot.social",
|
||||||
|
},
|
||||||
"html": "<!DOCTYPE html>
|
"html": "<!DOCTYPE html>
|
||||||
<html lang="de">
|
<html lang="de">
|
||||||
<head>
|
<head>
|
||||||
@ -148,9 +160,10 @@ exports[`sendResetPasswordMail German renders correctly 1`] = `
|
|||||||
<style>body{
|
<style>body{
|
||||||
display: block;
|
display: block;
|
||||||
font-family: Lato, sans-serif;
|
font-family: Lato, sans-serif;
|
||||||
font-size: 17px;
|
font-size: 16px;
|
||||||
text-align: left;
|
text-align: left;
|
||||||
text-align: -webkit-left;
|
text-align: -webkit-left;
|
||||||
|
line-height: 24px;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
padding: 15px;
|
padding: 15px;
|
||||||
margin: 0px;
|
margin: 0px;
|
||||||
@ -158,9 +171,10 @@ exports[`sendResetPasswordMail German renders correctly 1`] = `
|
|||||||
|
|
||||||
h2 {
|
h2 {
|
||||||
margin-top: 25px;
|
margin-top: 25px;
|
||||||
font-size: 25px;
|
margin-bottom: 30px;
|
||||||
|
font-size: 24px;
|
||||||
font-weight: normal;
|
font-weight: normal;
|
||||||
line-height: 22px;
|
line-height: 24px;
|
||||||
color: #333333;
|
color: #333333;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -171,11 +185,17 @@ h2 {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.head-logo {
|
.head-logo {
|
||||||
width: 60%;
|
width: 30%;
|
||||||
height: auto;
|
height: auto;
|
||||||
display: block;
|
display: block;
|
||||||
margin-left: auto;
|
margin-left: auto;
|
||||||
margin-right: auto;
|
margin-right: auto;
|
||||||
|
margin-bottom: 50px;
|
||||||
|
}
|
||||||
|
|
||||||
|
p.no-margin-top-bottom {
|
||||||
|
margin-top: 0;
|
||||||
|
margin-bottom: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
a {
|
a {
|
||||||
@ -186,10 +206,9 @@ a.button {
|
|||||||
background: #17b53e;
|
background: #17b53e;
|
||||||
font-family: Lato, sans-serif;
|
font-family: Lato, sans-serif;
|
||||||
font-size: 16px;
|
font-size: 16px;
|
||||||
line-height: 15px;
|
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
text-align:center;
|
text-align:center;
|
||||||
padding: 13px 17px;
|
padding: 9px 18px;
|
||||||
color: #ffffff;
|
color: #ffffff;
|
||||||
display: table;
|
display: table;
|
||||||
margin-left: auto;
|
margin-left: auto;
|
||||||
@ -197,10 +216,6 @@ a.button {
|
|||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
}
|
}
|
||||||
|
|
||||||
span {
|
|
||||||
color: #17b53e;
|
|
||||||
}
|
|
||||||
|
|
||||||
.text-block {
|
.text-block {
|
||||||
margin-top: 20px;
|
margin-top: 20px;
|
||||||
color: #000000;
|
color: #000000;
|
||||||
@ -209,7 +224,7 @@ span {
|
|||||||
footer {
|
footer {
|
||||||
padding: 20px;
|
padding: 20px;
|
||||||
font-family: Lato, sans-serif;
|
font-family: Lato, sans-serif;
|
||||||
font-size: 12px;
|
font-size: 14px;
|
||||||
line-height: 15px;
|
line-height: 15px;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
color: #888888;
|
color: #888888;
|
||||||
@ -230,12 +245,12 @@ footer {
|
|||||||
<p>Falls du kein neues Passwort angefordert hast, kannst du diese E-Mail einfach ignorieren.</p>
|
<p>Falls du kein neues Passwort angefordert hast, kannst du diese E-Mail einfach ignorieren.</p>
|
||||||
<p>Sollte der Button für dich nicht funktionieren, kannst du auch folgenden Code in dein Browserfenster kopieren: <span>123456</span></p>
|
<p>Sollte der Button für dich nicht funktionieren, kannst du auch folgenden Code in dein Browserfenster kopieren: <span>123456</span></p>
|
||||||
<div class="text-block">
|
<div class="text-block">
|
||||||
<p>Bis bald bei <a class="organization" href="https://ocelot.social">ocelot.social</a>!</p>
|
<p class="no-margin-top-bottom">Bis bald bei <a class="organization" href="https://ocelot.social">ocelot.social</a>!</p>
|
||||||
<p>– Dein ocelot.social Team</p>
|
<p class="no-margin-top-bottom">– Dein ocelot.social Team</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="support">
|
<div class="support">
|
||||||
<p>Wenn du Fragen oder Probleme hast, kannst du dich gerne an den Support wenden: <a href="mailto:devops@ocelot.social">devops@ocelot.social</a></p>
|
<p class="no-margin-top-bottom">Wenn du Fragen oder Probleme hast, kannst du dich gerne an den Support wenden: <a href="mailto:devops@ocelot.social">devops@ocelot.social</a></p>
|
||||||
</div>
|
</div>
|
||||||
<footer>
|
<footer>
|
||||||
<div class="footer"></div><a href="https://ocelot.social">ocelot.social Community</a>
|
<div class="footer"></div><a href="https://ocelot.social">ocelot.social Community</a>
|
||||||
@ -267,6 +282,9 @@ devops@ocelot.social [devops@ocelot.social]
|
|||||||
|
|
||||||
|
|
||||||
ocelot.social Community [https://ocelot.social]",
|
ocelot.social Community [https://ocelot.social]",
|
||||||
"to": "user@example.org",
|
"to": {
|
||||||
|
"address": "user@example.org",
|
||||||
|
"name": "Jenny Rostock",
|
||||||
|
},
|
||||||
}
|
}
|
||||||
`;
|
`;
|
||||||
|
|||||||
@ -1,9 +1,12 @@
|
|||||||
// Jest Snapshot v1, https://goo.gl/fbAQLP
|
// Jest Snapshot v1, https://jestjs.io/docs/snapshot-testing
|
||||||
|
|
||||||
exports[`sendWrongEmail English renders correctly 1`] = `
|
exports[`sendWrongEmail English renders correctly 1`] = `
|
||||||
{
|
{
|
||||||
"attachments": [],
|
"attachments": [],
|
||||||
"from": "ocelot.social <devops@ocelot.social>",
|
"from": {
|
||||||
|
"address": "devops@ocelot.social",
|
||||||
|
"name": "ocelot.social",
|
||||||
|
},
|
||||||
"html": "<!DOCTYPE html>
|
"html": "<!DOCTYPE html>
|
||||||
<html lang="en">
|
<html lang="en">
|
||||||
<head>
|
<head>
|
||||||
@ -13,9 +16,10 @@ exports[`sendWrongEmail English renders correctly 1`] = `
|
|||||||
<style>body{
|
<style>body{
|
||||||
display: block;
|
display: block;
|
||||||
font-family: Lato, sans-serif;
|
font-family: Lato, sans-serif;
|
||||||
font-size: 17px;
|
font-size: 16px;
|
||||||
text-align: left;
|
text-align: left;
|
||||||
text-align: -webkit-left;
|
text-align: -webkit-left;
|
||||||
|
line-height: 24px;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
padding: 15px;
|
padding: 15px;
|
||||||
margin: 0px;
|
margin: 0px;
|
||||||
@ -23,9 +27,10 @@ exports[`sendWrongEmail English renders correctly 1`] = `
|
|||||||
|
|
||||||
h2 {
|
h2 {
|
||||||
margin-top: 25px;
|
margin-top: 25px;
|
||||||
font-size: 25px;
|
margin-bottom: 30px;
|
||||||
|
font-size: 24px;
|
||||||
font-weight: normal;
|
font-weight: normal;
|
||||||
line-height: 22px;
|
line-height: 24px;
|
||||||
color: #333333;
|
color: #333333;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -36,11 +41,17 @@ h2 {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.head-logo {
|
.head-logo {
|
||||||
width: 60%;
|
width: 30%;
|
||||||
height: auto;
|
height: auto;
|
||||||
display: block;
|
display: block;
|
||||||
margin-left: auto;
|
margin-left: auto;
|
||||||
margin-right: auto;
|
margin-right: auto;
|
||||||
|
margin-bottom: 50px;
|
||||||
|
}
|
||||||
|
|
||||||
|
p.no-margin-top-bottom {
|
||||||
|
margin-top: 0;
|
||||||
|
margin-bottom: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
a {
|
a {
|
||||||
@ -51,10 +62,9 @@ a.button {
|
|||||||
background: #17b53e;
|
background: #17b53e;
|
||||||
font-family: Lato, sans-serif;
|
font-family: Lato, sans-serif;
|
||||||
font-size: 16px;
|
font-size: 16px;
|
||||||
line-height: 15px;
|
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
text-align:center;
|
text-align:center;
|
||||||
padding: 13px 17px;
|
padding: 9px 18px;
|
||||||
color: #ffffff;
|
color: #ffffff;
|
||||||
display: table;
|
display: table;
|
||||||
margin-left: auto;
|
margin-left: auto;
|
||||||
@ -62,10 +72,6 @@ a.button {
|
|||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
}
|
}
|
||||||
|
|
||||||
span {
|
|
||||||
color: #17b53e;
|
|
||||||
}
|
|
||||||
|
|
||||||
.text-block {
|
.text-block {
|
||||||
margin-top: 20px;
|
margin-top: 20px;
|
||||||
color: #000000;
|
color: #000000;
|
||||||
@ -74,7 +80,7 @@ span {
|
|||||||
footer {
|
footer {
|
||||||
padding: 20px;
|
padding: 20px;
|
||||||
font-family: Lato, sans-serif;
|
font-family: Lato, sans-serif;
|
||||||
font-size: 12px;
|
font-size: 14px;
|
||||||
line-height: 15px;
|
line-height: 15px;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
color: #888888;
|
color: #888888;
|
||||||
@ -95,12 +101,12 @@ footer {
|
|||||||
<p>If you don't have an account at <a>ocelot.social</a> yet or if you didn't want to reset your password, please ignore this e-mail.
|
<p>If you don't have an account at <a>ocelot.social</a> yet or if you didn't want to reset your password, please ignore this e-mail.
|
||||||
</p>
|
</p>
|
||||||
<div class="text-block">
|
<div class="text-block">
|
||||||
<p>See you soon on <a class="organization" href="https://ocelot.social">ocelot.social</a>!</p>
|
<p class="no-margin-top-bottom">See you soon on <a class="organization" href="https://ocelot.social">ocelot.social</a>!</p>
|
||||||
<p>– The ocelot.social Team</p>
|
<p class="no-margin-top-bottom">– The ocelot.social Team</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="support">
|
<div class="support">
|
||||||
<p>If you have questions or problems, feel free to contact our support: <a href="mailto:devops@ocelot.social">devops@ocelot.social</a></p>
|
<p class="no-margin-top-bottom">If you have questions or problems, feel free to contact our support: <a href="mailto:devops@ocelot.social">devops@ocelot.social</a></p>
|
||||||
</div>
|
</div>
|
||||||
<footer>
|
<footer>
|
||||||
<div class="footer"></div><a href="https://ocelot.social">ocelot.social Community</a>
|
<div class="footer"></div><a href="https://ocelot.social">ocelot.social Community</a>
|
||||||
@ -129,14 +135,20 @@ devops@ocelot.social [devops@ocelot.social]
|
|||||||
|
|
||||||
|
|
||||||
ocelot.social Community [https://ocelot.social]",
|
ocelot.social Community [https://ocelot.social]",
|
||||||
"to": "user@example.org",
|
"to": {
|
||||||
|
"address": "moderator@example.org",
|
||||||
|
"name": "Bob &"?@\\ Baumeister",
|
||||||
|
},
|
||||||
}
|
}
|
||||||
`;
|
`;
|
||||||
|
|
||||||
exports[`sendWrongEmail German renders correctly 1`] = `
|
exports[`sendWrongEmail German renders correctly 1`] = `
|
||||||
{
|
{
|
||||||
"attachments": [],
|
"attachments": [],
|
||||||
"from": "ocelot.social <devops@ocelot.social>",
|
"from": {
|
||||||
|
"address": "devops@ocelot.social",
|
||||||
|
"name": "ocelot.social",
|
||||||
|
},
|
||||||
"html": "<!DOCTYPE html>
|
"html": "<!DOCTYPE html>
|
||||||
<html lang="de">
|
<html lang="de">
|
||||||
<head>
|
<head>
|
||||||
@ -146,9 +158,10 @@ exports[`sendWrongEmail German renders correctly 1`] = `
|
|||||||
<style>body{
|
<style>body{
|
||||||
display: block;
|
display: block;
|
||||||
font-family: Lato, sans-serif;
|
font-family: Lato, sans-serif;
|
||||||
font-size: 17px;
|
font-size: 16px;
|
||||||
text-align: left;
|
text-align: left;
|
||||||
text-align: -webkit-left;
|
text-align: -webkit-left;
|
||||||
|
line-height: 24px;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
padding: 15px;
|
padding: 15px;
|
||||||
margin: 0px;
|
margin: 0px;
|
||||||
@ -156,9 +169,10 @@ exports[`sendWrongEmail German renders correctly 1`] = `
|
|||||||
|
|
||||||
h2 {
|
h2 {
|
||||||
margin-top: 25px;
|
margin-top: 25px;
|
||||||
font-size: 25px;
|
margin-bottom: 30px;
|
||||||
|
font-size: 24px;
|
||||||
font-weight: normal;
|
font-weight: normal;
|
||||||
line-height: 22px;
|
line-height: 24px;
|
||||||
color: #333333;
|
color: #333333;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -169,11 +183,17 @@ h2 {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.head-logo {
|
.head-logo {
|
||||||
width: 60%;
|
width: 30%;
|
||||||
height: auto;
|
height: auto;
|
||||||
display: block;
|
display: block;
|
||||||
margin-left: auto;
|
margin-left: auto;
|
||||||
margin-right: auto;
|
margin-right: auto;
|
||||||
|
margin-bottom: 50px;
|
||||||
|
}
|
||||||
|
|
||||||
|
p.no-margin-top-bottom {
|
||||||
|
margin-top: 0;
|
||||||
|
margin-bottom: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
a {
|
a {
|
||||||
@ -184,10 +204,9 @@ a.button {
|
|||||||
background: #17b53e;
|
background: #17b53e;
|
||||||
font-family: Lato, sans-serif;
|
font-family: Lato, sans-serif;
|
||||||
font-size: 16px;
|
font-size: 16px;
|
||||||
line-height: 15px;
|
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
text-align:center;
|
text-align:center;
|
||||||
padding: 13px 17px;
|
padding: 9px 18px;
|
||||||
color: #ffffff;
|
color: #ffffff;
|
||||||
display: table;
|
display: table;
|
||||||
margin-left: auto;
|
margin-left: auto;
|
||||||
@ -195,10 +214,6 @@ a.button {
|
|||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
}
|
}
|
||||||
|
|
||||||
span {
|
|
||||||
color: #17b53e;
|
|
||||||
}
|
|
||||||
|
|
||||||
.text-block {
|
.text-block {
|
||||||
margin-top: 20px;
|
margin-top: 20px;
|
||||||
color: #000000;
|
color: #000000;
|
||||||
@ -207,7 +222,7 @@ span {
|
|||||||
footer {
|
footer {
|
||||||
padding: 20px;
|
padding: 20px;
|
||||||
font-family: Lato, sans-serif;
|
font-family: Lato, sans-serif;
|
||||||
font-size: 12px;
|
font-size: 14px;
|
||||||
line-height: 15px;
|
line-height: 15px;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
color: #888888;
|
color: #888888;
|
||||||
@ -228,12 +243,12 @@ footer {
|
|||||||
<p>Wenn du noch keinen Account bei <a>ocelot.social</a> hast oder dein Password gar nicht ändern willst, kannst du diese E-Mail einfach ignorieren!
|
<p>Wenn du noch keinen Account bei <a>ocelot.social</a> hast oder dein Password gar nicht ändern willst, kannst du diese E-Mail einfach ignorieren!
|
||||||
</p>
|
</p>
|
||||||
<div class="text-block">
|
<div class="text-block">
|
||||||
<p>Bis bald bei <a class="organization" href="https://ocelot.social">ocelot.social</a>!</p>
|
<p class="no-margin-top-bottom">Bis bald bei <a class="organization" href="https://ocelot.social">ocelot.social</a>!</p>
|
||||||
<p>– Dein ocelot.social Team</p>
|
<p class="no-margin-top-bottom">– Dein ocelot.social Team</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="support">
|
<div class="support">
|
||||||
<p>Wenn du Fragen oder Probleme hast, kannst du dich gerne an den Support wenden: <a href="mailto:devops@ocelot.social">devops@ocelot.social</a></p>
|
<p class="no-margin-top-bottom">Wenn du Fragen oder Probleme hast, kannst du dich gerne an den Support wenden: <a href="mailto:devops@ocelot.social">devops@ocelot.social</a></p>
|
||||||
</div>
|
</div>
|
||||||
<footer>
|
<footer>
|
||||||
<div class="footer"></div><a href="https://ocelot.social">ocelot.social Community</a>
|
<div class="footer"></div><a href="https://ocelot.social">ocelot.social Community</a>
|
||||||
@ -262,6 +277,9 @@ devops@ocelot.social [devops@ocelot.social]
|
|||||||
|
|
||||||
|
|
||||||
ocelot.social Community [https://ocelot.social]",
|
ocelot.social Community [https://ocelot.social]",
|
||||||
"to": "user@example.org",
|
"to": {
|
||||||
|
"address": "moderator@example.org",
|
||||||
|
"name": "Bob &"?@\\ Baumeister",
|
||||||
|
},
|
||||||
}
|
}
|
||||||
`;
|
`;
|
||||||
|
|||||||
@ -1,9 +1,12 @@
|
|||||||
// Jest Snapshot v1, https://goo.gl/fbAQLP
|
// Jest Snapshot v1, https://jestjs.io/docs/snapshot-testing
|
||||||
|
|
||||||
exports[`sendResetPasswordMail with support English renders correctly 1`] = `
|
exports[`sendResetPasswordMail with support English renders correctly 1`] = `
|
||||||
{
|
{
|
||||||
"attachments": [],
|
"attachments": [],
|
||||||
"from": "ocelot.social <devops@ocelot.social>",
|
"from": {
|
||||||
|
"address": "devops@ocelot.social",
|
||||||
|
"name": "ocelot.social",
|
||||||
|
},
|
||||||
"html": "<!DOCTYPE html>
|
"html": "<!DOCTYPE html>
|
||||||
<html lang="en">
|
<html lang="en">
|
||||||
<head>
|
<head>
|
||||||
@ -13,9 +16,10 @@ exports[`sendResetPasswordMail with support English renders correctly 1`] = `
|
|||||||
<style>body{
|
<style>body{
|
||||||
display: block;
|
display: block;
|
||||||
font-family: Lato, sans-serif;
|
font-family: Lato, sans-serif;
|
||||||
font-size: 17px;
|
font-size: 16px;
|
||||||
text-align: left;
|
text-align: left;
|
||||||
text-align: -webkit-left;
|
text-align: -webkit-left;
|
||||||
|
line-height: 24px;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
padding: 15px;
|
padding: 15px;
|
||||||
margin: 0px;
|
margin: 0px;
|
||||||
@ -23,9 +27,10 @@ exports[`sendResetPasswordMail with support English renders correctly 1`] = `
|
|||||||
|
|
||||||
h2 {
|
h2 {
|
||||||
margin-top: 25px;
|
margin-top: 25px;
|
||||||
font-size: 25px;
|
margin-bottom: 30px;
|
||||||
|
font-size: 24px;
|
||||||
font-weight: normal;
|
font-weight: normal;
|
||||||
line-height: 22px;
|
line-height: 24px;
|
||||||
color: #333333;
|
color: #333333;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -36,11 +41,17 @@ h2 {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.head-logo {
|
.head-logo {
|
||||||
width: 60%;
|
width: 30%;
|
||||||
height: auto;
|
height: auto;
|
||||||
display: block;
|
display: block;
|
||||||
margin-left: auto;
|
margin-left: auto;
|
||||||
margin-right: auto;
|
margin-right: auto;
|
||||||
|
margin-bottom: 50px;
|
||||||
|
}
|
||||||
|
|
||||||
|
p.no-margin-top-bottom {
|
||||||
|
margin-top: 0;
|
||||||
|
margin-bottom: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
a {
|
a {
|
||||||
@ -51,10 +62,9 @@ a.button {
|
|||||||
background: #17b53e;
|
background: #17b53e;
|
||||||
font-family: Lato, sans-serif;
|
font-family: Lato, sans-serif;
|
||||||
font-size: 16px;
|
font-size: 16px;
|
||||||
line-height: 15px;
|
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
text-align:center;
|
text-align:center;
|
||||||
padding: 13px 17px;
|
padding: 9px 18px;
|
||||||
color: #ffffff;
|
color: #ffffff;
|
||||||
display: table;
|
display: table;
|
||||||
margin-left: auto;
|
margin-left: auto;
|
||||||
@ -62,10 +72,6 @@ a.button {
|
|||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
}
|
}
|
||||||
|
|
||||||
span {
|
|
||||||
color: #17b53e;
|
|
||||||
}
|
|
||||||
|
|
||||||
.text-block {
|
.text-block {
|
||||||
margin-top: 20px;
|
margin-top: 20px;
|
||||||
color: #000000;
|
color: #000000;
|
||||||
@ -74,7 +80,7 @@ span {
|
|||||||
footer {
|
footer {
|
||||||
padding: 20px;
|
padding: 20px;
|
||||||
font-family: Lato, sans-serif;
|
font-family: Lato, sans-serif;
|
||||||
font-size: 12px;
|
font-size: 14px;
|
||||||
line-height: 15px;
|
line-height: 15px;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
color: #888888;
|
color: #888888;
|
||||||
@ -95,12 +101,12 @@ footer {
|
|||||||
<p>If you didn't request a new password feel free to ignore this e-mail.</p>
|
<p>If you didn't request a new password feel free to ignore this e-mail.</p>
|
||||||
<p>If the above button doesn't work you can also copy the following code into your browser window: <span>123456</span></p>
|
<p>If the above button doesn't work you can also copy the following code into your browser window: <span>123456</span></p>
|
||||||
<div class="text-block">
|
<div class="text-block">
|
||||||
<p>See you soon on <a class="organization" href="https://ocelot.social">ocelot.social</a>!</p>
|
<p class="no-margin-top-bottom">See you soon on <a class="organization" href="https://ocelot.social">ocelot.social</a>!</p>
|
||||||
<p>– The ocelot.social Team</p>
|
<p class="no-margin-top-bottom">– The ocelot.social Team</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="support">
|
<div class="support">
|
||||||
<p>If you have questions or problems, feel free to contact our support: <a href="mailto:support@example.org">support@example.org</a></p>
|
<p class="no-margin-top-bottom">If you have questions or problems, feel free to contact our support: <a href="mailto:support@example.org">support@example.org</a></p>
|
||||||
</div>
|
</div>
|
||||||
<footer>
|
<footer>
|
||||||
<div class="footer"></div><a href="https://ocelot.social">ocelot.social Community</a>
|
<div class="footer"></div><a href="https://ocelot.social">ocelot.social Community</a>
|
||||||
@ -131,14 +137,20 @@ support@example.org [support@example.org]
|
|||||||
|
|
||||||
|
|
||||||
ocelot.social Community [https://ocelot.social]",
|
ocelot.social Community [https://ocelot.social]",
|
||||||
"to": "user@example.org",
|
"to": {
|
||||||
|
"address": "user@example.org",
|
||||||
|
"name": "Jenny Rostock",
|
||||||
|
},
|
||||||
}
|
}
|
||||||
`;
|
`;
|
||||||
|
|
||||||
exports[`sendResetPasswordMail with support German renders correctly 1`] = `
|
exports[`sendResetPasswordMail with support German renders correctly 1`] = `
|
||||||
{
|
{
|
||||||
"attachments": [],
|
"attachments": [],
|
||||||
"from": "ocelot.social <devops@ocelot.social>",
|
"from": {
|
||||||
|
"address": "devops@ocelot.social",
|
||||||
|
"name": "ocelot.social",
|
||||||
|
},
|
||||||
"html": "<!DOCTYPE html>
|
"html": "<!DOCTYPE html>
|
||||||
<html lang="de">
|
<html lang="de">
|
||||||
<head>
|
<head>
|
||||||
@ -148,9 +160,10 @@ exports[`sendResetPasswordMail with support German renders correctly 1`] = `
|
|||||||
<style>body{
|
<style>body{
|
||||||
display: block;
|
display: block;
|
||||||
font-family: Lato, sans-serif;
|
font-family: Lato, sans-serif;
|
||||||
font-size: 17px;
|
font-size: 16px;
|
||||||
text-align: left;
|
text-align: left;
|
||||||
text-align: -webkit-left;
|
text-align: -webkit-left;
|
||||||
|
line-height: 24px;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
padding: 15px;
|
padding: 15px;
|
||||||
margin: 0px;
|
margin: 0px;
|
||||||
@ -158,9 +171,10 @@ exports[`sendResetPasswordMail with support German renders correctly 1`] = `
|
|||||||
|
|
||||||
h2 {
|
h2 {
|
||||||
margin-top: 25px;
|
margin-top: 25px;
|
||||||
font-size: 25px;
|
margin-bottom: 30px;
|
||||||
|
font-size: 24px;
|
||||||
font-weight: normal;
|
font-weight: normal;
|
||||||
line-height: 22px;
|
line-height: 24px;
|
||||||
color: #333333;
|
color: #333333;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -171,11 +185,17 @@ h2 {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.head-logo {
|
.head-logo {
|
||||||
width: 60%;
|
width: 30%;
|
||||||
height: auto;
|
height: auto;
|
||||||
display: block;
|
display: block;
|
||||||
margin-left: auto;
|
margin-left: auto;
|
||||||
margin-right: auto;
|
margin-right: auto;
|
||||||
|
margin-bottom: 50px;
|
||||||
|
}
|
||||||
|
|
||||||
|
p.no-margin-top-bottom {
|
||||||
|
margin-top: 0;
|
||||||
|
margin-bottom: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
a {
|
a {
|
||||||
@ -186,10 +206,9 @@ a.button {
|
|||||||
background: #17b53e;
|
background: #17b53e;
|
||||||
font-family: Lato, sans-serif;
|
font-family: Lato, sans-serif;
|
||||||
font-size: 16px;
|
font-size: 16px;
|
||||||
line-height: 15px;
|
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
text-align:center;
|
text-align:center;
|
||||||
padding: 13px 17px;
|
padding: 9px 18px;
|
||||||
color: #ffffff;
|
color: #ffffff;
|
||||||
display: table;
|
display: table;
|
||||||
margin-left: auto;
|
margin-left: auto;
|
||||||
@ -197,10 +216,6 @@ a.button {
|
|||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
}
|
}
|
||||||
|
|
||||||
span {
|
|
||||||
color: #17b53e;
|
|
||||||
}
|
|
||||||
|
|
||||||
.text-block {
|
.text-block {
|
||||||
margin-top: 20px;
|
margin-top: 20px;
|
||||||
color: #000000;
|
color: #000000;
|
||||||
@ -209,7 +224,7 @@ span {
|
|||||||
footer {
|
footer {
|
||||||
padding: 20px;
|
padding: 20px;
|
||||||
font-family: Lato, sans-serif;
|
font-family: Lato, sans-serif;
|
||||||
font-size: 12px;
|
font-size: 14px;
|
||||||
line-height: 15px;
|
line-height: 15px;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
color: #888888;
|
color: #888888;
|
||||||
@ -230,12 +245,12 @@ footer {
|
|||||||
<p>Falls du kein neues Passwort angefordert hast, kannst du diese E-Mail einfach ignorieren.</p>
|
<p>Falls du kein neues Passwort angefordert hast, kannst du diese E-Mail einfach ignorieren.</p>
|
||||||
<p>Sollte der Button für dich nicht funktionieren, kannst du auch folgenden Code in dein Browserfenster kopieren: <span>123456</span></p>
|
<p>Sollte der Button für dich nicht funktionieren, kannst du auch folgenden Code in dein Browserfenster kopieren: <span>123456</span></p>
|
||||||
<div class="text-block">
|
<div class="text-block">
|
||||||
<p>Bis bald bei <a class="organization" href="https://ocelot.social">ocelot.social</a>!</p>
|
<p class="no-margin-top-bottom">Bis bald bei <a class="organization" href="https://ocelot.social">ocelot.social</a>!</p>
|
||||||
<p>– Dein ocelot.social Team</p>
|
<p class="no-margin-top-bottom">– Dein ocelot.social Team</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="support">
|
<div class="support">
|
||||||
<p>Wenn du Fragen oder Probleme hast, kannst du dich gerne an den Support wenden: <a href="mailto:support@example.org">support@example.org</a></p>
|
<p class="no-margin-top-bottom">Wenn du Fragen oder Probleme hast, kannst du dich gerne an den Support wenden: <a href="mailto:support@example.org">support@example.org</a></p>
|
||||||
</div>
|
</div>
|
||||||
<footer>
|
<footer>
|
||||||
<div class="footer"></div><a href="https://ocelot.social">ocelot.social Community</a>
|
<div class="footer"></div><a href="https://ocelot.social">ocelot.social Community</a>
|
||||||
@ -267,14 +282,20 @@ support@example.org [support@example.org]
|
|||||||
|
|
||||||
|
|
||||||
ocelot.social Community [https://ocelot.social]",
|
ocelot.social Community [https://ocelot.social]",
|
||||||
"to": "user@example.org",
|
"to": {
|
||||||
|
"address": "user@example.org",
|
||||||
|
"name": "Jenny Rostock",
|
||||||
|
},
|
||||||
}
|
}
|
||||||
`;
|
`;
|
||||||
|
|
||||||
exports[`sendResetPasswordMail without support English renders correctly 1`] = `
|
exports[`sendResetPasswordMail without support English renders correctly 1`] = `
|
||||||
{
|
{
|
||||||
"attachments": [],
|
"attachments": [],
|
||||||
"from": "ocelot.social <devops@ocelot.social>",
|
"from": {
|
||||||
|
"address": "devops@ocelot.social",
|
||||||
|
"name": "ocelot.social",
|
||||||
|
},
|
||||||
"html": "<!DOCTYPE html>
|
"html": "<!DOCTYPE html>
|
||||||
<html lang="en">
|
<html lang="en">
|
||||||
<head>
|
<head>
|
||||||
@ -284,9 +305,10 @@ exports[`sendResetPasswordMail without support English renders correctly 1`] = `
|
|||||||
<style>body{
|
<style>body{
|
||||||
display: block;
|
display: block;
|
||||||
font-family: Lato, sans-serif;
|
font-family: Lato, sans-serif;
|
||||||
font-size: 17px;
|
font-size: 16px;
|
||||||
text-align: left;
|
text-align: left;
|
||||||
text-align: -webkit-left;
|
text-align: -webkit-left;
|
||||||
|
line-height: 24px;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
padding: 15px;
|
padding: 15px;
|
||||||
margin: 0px;
|
margin: 0px;
|
||||||
@ -294,9 +316,10 @@ exports[`sendResetPasswordMail without support English renders correctly 1`] = `
|
|||||||
|
|
||||||
h2 {
|
h2 {
|
||||||
margin-top: 25px;
|
margin-top: 25px;
|
||||||
font-size: 25px;
|
margin-bottom: 30px;
|
||||||
|
font-size: 24px;
|
||||||
font-weight: normal;
|
font-weight: normal;
|
||||||
line-height: 22px;
|
line-height: 24px;
|
||||||
color: #333333;
|
color: #333333;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -307,11 +330,17 @@ h2 {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.head-logo {
|
.head-logo {
|
||||||
width: 60%;
|
width: 30%;
|
||||||
height: auto;
|
height: auto;
|
||||||
display: block;
|
display: block;
|
||||||
margin-left: auto;
|
margin-left: auto;
|
||||||
margin-right: auto;
|
margin-right: auto;
|
||||||
|
margin-bottom: 50px;
|
||||||
|
}
|
||||||
|
|
||||||
|
p.no-margin-top-bottom {
|
||||||
|
margin-top: 0;
|
||||||
|
margin-bottom: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
a {
|
a {
|
||||||
@ -322,10 +351,9 @@ a.button {
|
|||||||
background: #17b53e;
|
background: #17b53e;
|
||||||
font-family: Lato, sans-serif;
|
font-family: Lato, sans-serif;
|
||||||
font-size: 16px;
|
font-size: 16px;
|
||||||
line-height: 15px;
|
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
text-align:center;
|
text-align:center;
|
||||||
padding: 13px 17px;
|
padding: 9px 18px;
|
||||||
color: #ffffff;
|
color: #ffffff;
|
||||||
display: table;
|
display: table;
|
||||||
margin-left: auto;
|
margin-left: auto;
|
||||||
@ -333,10 +361,6 @@ a.button {
|
|||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
}
|
}
|
||||||
|
|
||||||
span {
|
|
||||||
color: #17b53e;
|
|
||||||
}
|
|
||||||
|
|
||||||
.text-block {
|
.text-block {
|
||||||
margin-top: 20px;
|
margin-top: 20px;
|
||||||
color: #000000;
|
color: #000000;
|
||||||
@ -345,7 +369,7 @@ span {
|
|||||||
footer {
|
footer {
|
||||||
padding: 20px;
|
padding: 20px;
|
||||||
font-family: Lato, sans-serif;
|
font-family: Lato, sans-serif;
|
||||||
font-size: 12px;
|
font-size: 14px;
|
||||||
line-height: 15px;
|
line-height: 15px;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
color: #888888;
|
color: #888888;
|
||||||
@ -366,8 +390,8 @@ footer {
|
|||||||
<p>If you didn't request a new password feel free to ignore this e-mail.</p>
|
<p>If you didn't request a new password feel free to ignore this e-mail.</p>
|
||||||
<p>If the above button doesn't work you can also copy the following code into your browser window: <span>123456</span></p>
|
<p>If the above button doesn't work you can also copy the following code into your browser window: <span>123456</span></p>
|
||||||
<div class="text-block">
|
<div class="text-block">
|
||||||
<p>See you soon on <a class="organization" href="https://ocelot.social">ocelot.social</a>!</p>
|
<p class="no-margin-top-bottom">See you soon on <a class="organization" href="https://ocelot.social">ocelot.social</a>!</p>
|
||||||
<p>– The ocelot.social Team</p>
|
<p class="no-margin-top-bottom">– The ocelot.social Team</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<footer>
|
<footer>
|
||||||
@ -396,14 +420,20 @@ See you soon on ocelot.social [https://ocelot.social]!
|
|||||||
|
|
||||||
|
|
||||||
ocelot.social Community [https://ocelot.social]",
|
ocelot.social Community [https://ocelot.social]",
|
||||||
"to": "user@example.org",
|
"to": {
|
||||||
|
"address": "user@example.org",
|
||||||
|
"name": "Jenny Rostock",
|
||||||
|
},
|
||||||
}
|
}
|
||||||
`;
|
`;
|
||||||
|
|
||||||
exports[`sendResetPasswordMail without support German renders correctly 1`] = `
|
exports[`sendResetPasswordMail without support German renders correctly 1`] = `
|
||||||
{
|
{
|
||||||
"attachments": [],
|
"attachments": [],
|
||||||
"from": "ocelot.social <devops@ocelot.social>",
|
"from": {
|
||||||
|
"address": "devops@ocelot.social",
|
||||||
|
"name": "ocelot.social",
|
||||||
|
},
|
||||||
"html": "<!DOCTYPE html>
|
"html": "<!DOCTYPE html>
|
||||||
<html lang="de">
|
<html lang="de">
|
||||||
<head>
|
<head>
|
||||||
@ -413,9 +443,10 @@ exports[`sendResetPasswordMail without support German renders correctly 1`] = `
|
|||||||
<style>body{
|
<style>body{
|
||||||
display: block;
|
display: block;
|
||||||
font-family: Lato, sans-serif;
|
font-family: Lato, sans-serif;
|
||||||
font-size: 17px;
|
font-size: 16px;
|
||||||
text-align: left;
|
text-align: left;
|
||||||
text-align: -webkit-left;
|
text-align: -webkit-left;
|
||||||
|
line-height: 24px;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
padding: 15px;
|
padding: 15px;
|
||||||
margin: 0px;
|
margin: 0px;
|
||||||
@ -423,9 +454,10 @@ exports[`sendResetPasswordMail without support German renders correctly 1`] = `
|
|||||||
|
|
||||||
h2 {
|
h2 {
|
||||||
margin-top: 25px;
|
margin-top: 25px;
|
||||||
font-size: 25px;
|
margin-bottom: 30px;
|
||||||
|
font-size: 24px;
|
||||||
font-weight: normal;
|
font-weight: normal;
|
||||||
line-height: 22px;
|
line-height: 24px;
|
||||||
color: #333333;
|
color: #333333;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -436,11 +468,17 @@ h2 {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.head-logo {
|
.head-logo {
|
||||||
width: 60%;
|
width: 30%;
|
||||||
height: auto;
|
height: auto;
|
||||||
display: block;
|
display: block;
|
||||||
margin-left: auto;
|
margin-left: auto;
|
||||||
margin-right: auto;
|
margin-right: auto;
|
||||||
|
margin-bottom: 50px;
|
||||||
|
}
|
||||||
|
|
||||||
|
p.no-margin-top-bottom {
|
||||||
|
margin-top: 0;
|
||||||
|
margin-bottom: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
a {
|
a {
|
||||||
@ -451,10 +489,9 @@ a.button {
|
|||||||
background: #17b53e;
|
background: #17b53e;
|
||||||
font-family: Lato, sans-serif;
|
font-family: Lato, sans-serif;
|
||||||
font-size: 16px;
|
font-size: 16px;
|
||||||
line-height: 15px;
|
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
text-align:center;
|
text-align:center;
|
||||||
padding: 13px 17px;
|
padding: 9px 18px;
|
||||||
color: #ffffff;
|
color: #ffffff;
|
||||||
display: table;
|
display: table;
|
||||||
margin-left: auto;
|
margin-left: auto;
|
||||||
@ -462,10 +499,6 @@ a.button {
|
|||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
}
|
}
|
||||||
|
|
||||||
span {
|
|
||||||
color: #17b53e;
|
|
||||||
}
|
|
||||||
|
|
||||||
.text-block {
|
.text-block {
|
||||||
margin-top: 20px;
|
margin-top: 20px;
|
||||||
color: #000000;
|
color: #000000;
|
||||||
@ -474,7 +507,7 @@ span {
|
|||||||
footer {
|
footer {
|
||||||
padding: 20px;
|
padding: 20px;
|
||||||
font-family: Lato, sans-serif;
|
font-family: Lato, sans-serif;
|
||||||
font-size: 12px;
|
font-size: 14px;
|
||||||
line-height: 15px;
|
line-height: 15px;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
color: #888888;
|
color: #888888;
|
||||||
@ -495,8 +528,8 @@ footer {
|
|||||||
<p>Falls du kein neues Passwort angefordert hast, kannst du diese E-Mail einfach ignorieren.</p>
|
<p>Falls du kein neues Passwort angefordert hast, kannst du diese E-Mail einfach ignorieren.</p>
|
||||||
<p>Sollte der Button für dich nicht funktionieren, kannst du auch folgenden Code in dein Browserfenster kopieren: <span>123456</span></p>
|
<p>Sollte der Button für dich nicht funktionieren, kannst du auch folgenden Code in dein Browserfenster kopieren: <span>123456</span></p>
|
||||||
<div class="text-block">
|
<div class="text-block">
|
||||||
<p>Bis bald bei <a class="organization" href="https://ocelot.social">ocelot.social</a>!</p>
|
<p class="no-margin-top-bottom">Bis bald bei <a class="organization" href="https://ocelot.social">ocelot.social</a>!</p>
|
||||||
<p>– Dein ocelot.social Team</p>
|
<p class="no-margin-top-bottom">– Dein ocelot.social Team</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<footer>
|
<footer>
|
||||||
@ -526,6 +559,9 @@ Bis bald bei ocelot.social [https://ocelot.social]!
|
|||||||
|
|
||||||
|
|
||||||
ocelot.social Community [https://ocelot.social]",
|
ocelot.social Community [https://ocelot.social]",
|
||||||
"to": "user@example.org",
|
"to": {
|
||||||
|
"address": "user@example.org",
|
||||||
|
"name": "Jenny Rostock",
|
||||||
|
},
|
||||||
}
|
}
|
||||||
`;
|
`;
|
||||||
|
|||||||
@ -2,7 +2,6 @@
|
|||||||
|
|
||||||
/* eslint-disable @typescript-eslint/no-unsafe-member-access */
|
/* eslint-disable @typescript-eslint/no-unsafe-member-access */
|
||||||
/* eslint-disable @typescript-eslint/no-unsafe-argument */
|
/* eslint-disable @typescript-eslint/no-unsafe-argument */
|
||||||
/* eslint-disable @typescript-eslint/restrict-template-expressions */
|
|
||||||
import path from 'node:path'
|
import path from 'node:path'
|
||||||
|
|
||||||
import Email from 'email-templates'
|
import Email from 'email-templates'
|
||||||
@ -29,7 +28,7 @@ export const defaultParams = {
|
|||||||
renderSettingsUrl: true,
|
renderSettingsUrl: true,
|
||||||
}
|
}
|
||||||
|
|
||||||
const from = `${CONFIG.APPLICATION_NAME} <${CONFIG.EMAIL_DEFAULT_SENDER}>`
|
const from = { name: CONFIG.APPLICATION_NAME, address: CONFIG.EMAIL_DEFAULT_SENDER }
|
||||||
|
|
||||||
const transport = createTransport(nodemailerTransportOptions)
|
const transport = createTransport(nodemailerTransportOptions)
|
||||||
|
|
||||||
@ -74,8 +73,8 @@ interface OriginalMessage {
|
|||||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||||
export const sendNotificationMail = async (notification: any): Promise<OriginalMessage> => {
|
export const sendNotificationMail = async (notification: any): Promise<OriginalMessage> => {
|
||||||
const locale = notification?.to?.locale
|
const locale = notification?.to?.locale
|
||||||
const to = notification?.email
|
|
||||||
const name = notification?.to?.name
|
const name = notification?.to?.name
|
||||||
|
const to = { name, address: notification?.email }
|
||||||
const template = notification?.reason
|
const template = notification?.reason
|
||||||
|
|
||||||
try {
|
try {
|
||||||
@ -94,8 +93,8 @@ export const sendNotificationMail = async (notification: any): Promise<OriginalM
|
|||||||
: notification?.from?.title,
|
: notification?.from?.title,
|
||||||
postUrl: new URL(
|
postUrl: new URL(
|
||||||
notification?.from?.__typename === 'Comment'
|
notification?.from?.__typename === 'Comment'
|
||||||
? `/post/${notification?.from?.post?.id}/${notification?.from?.post?.slug}`
|
? `/post/${encodeURIComponent(notification?.from?.post?.id)}/${encodeURIComponent(notification?.from?.post?.slug)}`
|
||||||
: `/post/${notification?.from?.id}/${notification?.from?.slug}`,
|
: `/post/${encodeURIComponent(notification?.from?.id)}/${encodeURIComponent(notification?.from?.slug)}`,
|
||||||
CONFIG.CLIENT_URI,
|
CONFIG.CLIENT_URI,
|
||||||
),
|
),
|
||||||
postAuthorName:
|
postAuthorName:
|
||||||
@ -106,7 +105,7 @@ export const sendNotificationMail = async (notification: any): Promise<OriginalM
|
|||||||
notification?.from?.__typename === 'Comment'
|
notification?.from?.__typename === 'Comment'
|
||||||
? undefined
|
? undefined
|
||||||
: new URL(
|
: new URL(
|
||||||
`user/${notification?.from?.author?.id}/${notification?.from?.author?.slug}`,
|
`profile/${encodeURIComponent(notification?.from?.author?.id)}/${encodeURIComponent(notification?.from?.author?.slug)}`,
|
||||||
CONFIG.CLIENT_URI,
|
CONFIG.CLIENT_URI,
|
||||||
),
|
),
|
||||||
commenterName:
|
commenterName:
|
||||||
@ -116,14 +115,14 @@ export const sendNotificationMail = async (notification: any): Promise<OriginalM
|
|||||||
commenterUrl:
|
commenterUrl:
|
||||||
notification?.from?.__typename === 'Comment'
|
notification?.from?.__typename === 'Comment'
|
||||||
? new URL(
|
? new URL(
|
||||||
`/profile/${notification?.from?.author?.id}/${notification?.from?.author?.slug}`,
|
`/profile/${encodeURIComponent(notification?.from?.author?.id)}/${encodeURIComponent(notification?.from?.author?.slug)}`,
|
||||||
CONFIG.CLIENT_URI,
|
CONFIG.CLIENT_URI,
|
||||||
)
|
)
|
||||||
: undefined,
|
: undefined,
|
||||||
commentUrl:
|
commentUrl:
|
||||||
notification?.from?.__typename === 'Comment'
|
notification?.from?.__typename === 'Comment'
|
||||||
? new URL(
|
? new URL(
|
||||||
`/post/${notification?.from?.post?.id}/${notification?.from?.post?.slug}#commentId-${notification?.from?.id}`,
|
`/post/${encodeURIComponent(notification?.from?.post?.id)}/${encodeURIComponent(notification?.from?.post?.slug)}#commentId-${encodeURIComponent(notification?.from?.id)}`,
|
||||||
CONFIG.CLIENT_URI,
|
CONFIG.CLIENT_URI,
|
||||||
)
|
)
|
||||||
: undefined,
|
: undefined,
|
||||||
@ -132,7 +131,7 @@ export const sendNotificationMail = async (notification: any): Promise<OriginalM
|
|||||||
groupUrl:
|
groupUrl:
|
||||||
notification?.from?.__typename === 'Group'
|
notification?.from?.__typename === 'Group'
|
||||||
? new URL(
|
? new URL(
|
||||||
`/groups/${notification?.from?.id}/${notification?.from?.slug}`,
|
`/groups/${encodeURIComponent(notification?.from?.id)}/${encodeURIComponent(notification?.from?.slug)}`,
|
||||||
CONFIG.CLIENT_URI,
|
CONFIG.CLIENT_URI,
|
||||||
)
|
)
|
||||||
: undefined,
|
: undefined,
|
||||||
@ -143,7 +142,7 @@ export const sendNotificationMail = async (notification: any): Promise<OriginalM
|
|||||||
groupRelatedUserUrl:
|
groupRelatedUserUrl:
|
||||||
notification?.from?.__typename === 'Group'
|
notification?.from?.__typename === 'Group'
|
||||||
? new URL(
|
? new URL(
|
||||||
`/profile/${notification?.relatedUser?.id}/${notification?.relatedUser?.slug}`,
|
`/profile/${encodeURIComponent(notification?.relatedUser?.id)}/${encodeURIComponent(notification?.relatedUser?.slug)}`,
|
||||||
CONFIG.CLIENT_URI,
|
CONFIG.CLIENT_URI,
|
||||||
)
|
)
|
||||||
: undefined,
|
: undefined,
|
||||||
@ -165,7 +164,7 @@ export const sendChatMessageMail = async (
|
|||||||
data: ChatMessageEmailInput,
|
data: ChatMessageEmailInput,
|
||||||
): Promise<OriginalMessage> => {
|
): Promise<OriginalMessage> => {
|
||||||
const { senderUser, recipientUser } = data
|
const { senderUser, recipientUser } = data
|
||||||
const to = data.email
|
const to = { name: recipientUser.name, address: data.email }
|
||||||
try {
|
try {
|
||||||
const { originalMessage } = await email.send({
|
const { originalMessage } = await email.send({
|
||||||
template: path.join(__dirname, 'templates', 'chat_message'),
|
template: path.join(__dirname, 'templates', 'chat_message'),
|
||||||
@ -177,7 +176,10 @@ export const sendChatMessageMail = async (
|
|||||||
locale: recipientUser.locale,
|
locale: recipientUser.locale,
|
||||||
name: recipientUser.name,
|
name: recipientUser.name,
|
||||||
chattingUser: senderUser.name,
|
chattingUser: senderUser.name,
|
||||||
chattingUserUrl: new URL(`/profile/${senderUser.id}/${senderUser.slug}`, CONFIG.CLIENT_URI),
|
chattingUserUrl: new URL(
|
||||||
|
`/profile/${encodeURIComponent(senderUser.id)}/${encodeURIComponent(senderUser.slug)}`,
|
||||||
|
CONFIG.CLIENT_URI,
|
||||||
|
),
|
||||||
chatUrl: new URL('/chat', CONFIG.CLIENT_URI),
|
chatUrl: new URL('/chat', CONFIG.CLIENT_URI),
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
@ -188,6 +190,7 @@ export const sendChatMessageMail = async (
|
|||||||
}
|
}
|
||||||
|
|
||||||
interface VerifyMailInput {
|
interface VerifyMailInput {
|
||||||
|
name: string
|
||||||
email: string
|
email: string
|
||||||
nonce: string
|
nonce: string
|
||||||
locale: string
|
locale: string
|
||||||
@ -200,10 +203,10 @@ interface RegistrationMailInput extends VerifyMailInput {
|
|||||||
export const sendRegistrationMail = async (
|
export const sendRegistrationMail = async (
|
||||||
data: RegistrationMailInput,
|
data: RegistrationMailInput,
|
||||||
): Promise<OriginalMessage> => {
|
): Promise<OriginalMessage> => {
|
||||||
const { nonce, locale, inviteCode } = data
|
const { name, nonce, locale, inviteCode } = data
|
||||||
const to = data.email
|
const to = { name, address: data.email }
|
||||||
const actionUrl = new URL('/registration', CONFIG.CLIENT_URI)
|
const actionUrl = new URL('/registration', CONFIG.CLIENT_URI)
|
||||||
actionUrl.searchParams.set('email', to)
|
actionUrl.searchParams.set('email', to.address)
|
||||||
actionUrl.searchParams.set('nonce', nonce)
|
actionUrl.searchParams.set('nonce', nonce)
|
||||||
if (inviteCode) {
|
if (inviteCode) {
|
||||||
actionUrl.searchParams.set('inviteCode', inviteCode)
|
actionUrl.searchParams.set('inviteCode', inviteCode)
|
||||||
@ -240,9 +243,9 @@ export const sendEmailVerification = async (
|
|||||||
data: EmailVerificationInput,
|
data: EmailVerificationInput,
|
||||||
): Promise<OriginalMessage> => {
|
): Promise<OriginalMessage> => {
|
||||||
const { nonce, locale, name } = data
|
const { nonce, locale, name } = data
|
||||||
const to = data.email
|
const to = { name, address: data.email }
|
||||||
const actionUrl = new URL('/settings/my-email-address/verify', CONFIG.CLIENT_URI)
|
const actionUrl = new URL('/settings/my-email-address/verify', CONFIG.CLIENT_URI)
|
||||||
actionUrl.searchParams.set('email', to)
|
actionUrl.searchParams.set('email', to.address)
|
||||||
actionUrl.searchParams.set('nonce', nonce)
|
actionUrl.searchParams.set('nonce', nonce)
|
||||||
|
|
||||||
try {
|
try {
|
||||||
@ -270,9 +273,9 @@ export const sendResetPasswordMail = async (
|
|||||||
data: EmailVerificationInput,
|
data: EmailVerificationInput,
|
||||||
): Promise<OriginalMessage> => {
|
): Promise<OriginalMessage> => {
|
||||||
const { nonce, locale, name } = data
|
const { nonce, locale, name } = data
|
||||||
const to = data.email
|
const to = { name, address: data.email }
|
||||||
const actionUrl = new URL('/password-reset/change-password', CONFIG.CLIENT_URI)
|
const actionUrl = new URL('/password-reset/change-password', CONFIG.CLIENT_URI)
|
||||||
actionUrl.searchParams.set('email', to)
|
actionUrl.searchParams.set('email', to.address)
|
||||||
actionUrl.searchParams.set('nonce', nonce)
|
actionUrl.searchParams.set('nonce', nonce)
|
||||||
try {
|
try {
|
||||||
const { originalMessage } = await email.send({
|
const { originalMessage } = await email.send({
|
||||||
@ -296,11 +299,12 @@ export const sendResetPasswordMail = async (
|
|||||||
}
|
}
|
||||||
|
|
||||||
export const sendWrongEmail = async (data: {
|
export const sendWrongEmail = async (data: {
|
||||||
|
name: string
|
||||||
locale: string
|
locale: string
|
||||||
email: string
|
email: string
|
||||||
}): Promise<OriginalMessage> => {
|
}): Promise<OriginalMessage> => {
|
||||||
const { locale } = data
|
const { locale, name } = data
|
||||||
const to = data.email
|
const to = { name, address: data.email }
|
||||||
const actionUrl = new URL('/password-reset/request', CONFIG.CLIENT_URI)
|
const actionUrl = new URL('/password-reset/request', CONFIG.CLIENT_URI)
|
||||||
try {
|
try {
|
||||||
const { originalMessage } = await email.send({
|
const { originalMessage } = await email.send({
|
||||||
|
|||||||
@ -7,12 +7,14 @@ import { sendRegistrationMail } from './sendEmail'
|
|||||||
|
|
||||||
describe('sendRegistrationMail', () => {
|
describe('sendRegistrationMail', () => {
|
||||||
const data: {
|
const data: {
|
||||||
|
name: string
|
||||||
email: string
|
email: string
|
||||||
nonce: string
|
nonce: string
|
||||||
locale: string
|
locale: string
|
||||||
inviteCode?: string
|
inviteCode?: string
|
||||||
} = {
|
} = {
|
||||||
email: 'user@example.org',
|
name: 'Bob &"?@\\ Baumeister',
|
||||||
|
email: 'moderator@example.org',
|
||||||
nonce: '123456',
|
nonce: '123456',
|
||||||
locale: 'en',
|
locale: 'en',
|
||||||
inviteCode: 'welcome',
|
inviteCode: 'welcome',
|
||||||
|
|||||||
@ -7,10 +7,12 @@ import { sendWrongEmail } from './sendEmail'
|
|||||||
|
|
||||||
describe('sendWrongEmail', () => {
|
describe('sendWrongEmail', () => {
|
||||||
const data: {
|
const data: {
|
||||||
|
name: string
|
||||||
email: string
|
email: string
|
||||||
locale: string
|
locale: string
|
||||||
} = {
|
} = {
|
||||||
email: 'user@example.org',
|
name: 'Bob &"?@\\ Baumeister',
|
||||||
|
email: 'moderator@example.org',
|
||||||
locale: 'en',
|
locale: 'en',
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -3,5 +3,5 @@ extend ../layout.pug
|
|||||||
block content
|
block content
|
||||||
.content
|
.content
|
||||||
- var groupUrl = groupUrl
|
- var groupUrl = groupUrl
|
||||||
p= t('changedGroupMemberRole', { groupName })
|
p!= t('changedGroupMemberRole', { groupName })
|
||||||
a.button(href=groupUrl)= t('buttons.viewGroup')
|
a.button(href=groupUrl)!= t('buttons.viewGroup')
|
||||||
|
|||||||
@ -1 +1 @@
|
|||||||
= `${APPLICATION_NAME} – ${t('notification')}: ${t('subjects.changedGroupMemberRole')}`
|
!= `${APPLICATION_NAME} – ${t('notification')}: ${t('subjects.changedGroupMemberRole')}`
|
||||||
@ -2,7 +2,7 @@ extend ../layout.pug
|
|||||||
|
|
||||||
block content
|
block content
|
||||||
.content
|
.content
|
||||||
p= t('chatMessageStart')
|
p!= t('chatMessageStart')
|
||||||
a.user(href=chattingUserUrl)= chattingUser
|
a.user(href=chattingUserUrl)!= chattingUser
|
||||||
= t('chatMessageEnd')
|
!= t('chatMessageEnd')
|
||||||
a.button(href=chatUrl)= t('buttons.viewChat')
|
a.button(href=chatUrl)!= t('buttons.viewChat')
|
||||||
|
|||||||
@ -1 +1 @@
|
|||||||
= `${APPLICATION_NAME} – ${t('notification')}: ${t('subjects.chatMessage')}`
|
!= `${APPLICATION_NAME} – ${t('notification')}: ${t('subjects.chatMessage')}`
|
||||||
@ -3,6 +3,6 @@ extend ../layout.pug
|
|||||||
block content
|
block content
|
||||||
.content
|
.content
|
||||||
p
|
p
|
||||||
a.user(href=commenterUrl)= commenterName
|
a.user(href=commenterUrl)!= commenterName
|
||||||
= t('commentedOnPost', { postTitle})
|
!= t('commentedOnPost', { postTitle})
|
||||||
a.button(href=commentUrl)= t('buttons.viewComment')
|
a.button(href=commentUrl)!= t('buttons.viewComment')
|
||||||
|
|||||||
@ -1 +1 @@
|
|||||||
= `${APPLICATION_NAME} – ${t('notification')}: ${t('subjects.commentedOnPost')}`
|
!= `${APPLICATION_NAME} – ${t('notification')}: ${t('subjects.commentedOnPost')}`
|
||||||
@ -2,9 +2,9 @@ extend ../layout.pug
|
|||||||
|
|
||||||
block content
|
block content
|
||||||
.content
|
.content
|
||||||
p= t('emailVerification.introduction')
|
p!= t('emailVerification.introduction')
|
||||||
a.button(href=actionUrl)= t('buttons.verifyEmail')
|
a.button(href=actionUrl)!= t('buttons.verifyEmail')
|
||||||
p= t('emailVerification.doNotChange')
|
p!= t('emailVerification.doNotChange')
|
||||||
|
|
||||||
p= t('emailVerification.codeHint')
|
p!= t('emailVerification.codeHint')
|
||||||
span= nonce
|
span!= nonce
|
||||||
|
|||||||
@ -1 +1 @@
|
|||||||
= `${t('subjects.newEmail')} ${APPLICATION_NAME}`
|
!= `${t('subjects.newEmail')} ${APPLICATION_NAME}`
|
||||||
@ -3,6 +3,6 @@ extend ../layout.pug
|
|||||||
block content
|
block content
|
||||||
.content
|
.content
|
||||||
p
|
p
|
||||||
a.user(href=postAuthorUrl)= postAuthorName
|
a.user(href=postAuthorUrl)!= postAuthorName
|
||||||
= t('followedUserPosted', { postTitle })
|
!= t('followedUserPosted', { postTitle })
|
||||||
a.button(href=postUrl)= t('buttons.viewPost')
|
a.button(href=postUrl)!= t('buttons.viewPost')
|
||||||
|
|||||||
@ -1 +1 @@
|
|||||||
= `${APPLICATION_NAME} – ${t('notification')}: ${t('subjects.followedUserPosted')}`
|
!= `${APPLICATION_NAME} – ${t('notification')}: ${t('subjects.followedUserPosted')}`
|
||||||
@ -2,4 +2,4 @@ footer
|
|||||||
.footer
|
.footer
|
||||||
- var organizationUrl = ORGANIZATION_URL
|
- var organizationUrl = ORGANIZATION_URL
|
||||||
- var organizationName = ORGANIZATION_NAME
|
- var organizationName = ORGANIZATION_NAME
|
||||||
a(href=organizationUrl)= organizationName
|
a(href=organizationUrl)!= organizationName
|
||||||
@ -4,14 +4,14 @@
|
|||||||
- var team = APPLICATION_NAME
|
- var team = APPLICATION_NAME
|
||||||
- var settingsUrl = settingsUrl
|
- var settingsUrl = settingsUrl
|
||||||
- var renderSettingsUrl = renderSettingsUrl
|
- var renderSettingsUrl = renderSettingsUrl
|
||||||
p= t('general.seeYou')
|
p.no-margin-top-bottom!= t('general.seeYou')
|
||||||
a.organization(href=organizationUrl)= team
|
a.organization(href=organizationUrl)!= team
|
||||||
| !
|
| !
|
||||||
p= t('general.yourTeam', { team })
|
p.no-margin-top-bottom!= t('general.yourTeam', { team })
|
||||||
|
|
||||||
if renderSettingsUrl
|
if renderSettingsUrl
|
||||||
br
|
br
|
||||||
p= t('general.settingsHint')
|
p.no-margin-top-bottom!= t('general.settingsHint')
|
||||||
a.settings(href=settingsUrl)= t('general.settingsName')
|
a.settings(href=settingsUrl)!= t('general.settingsName')
|
||||||
| !
|
| !
|
||||||
|
|
||||||
|
|||||||
@ -1 +1 @@
|
|||||||
h2= `${t('general.greeting')} ${name},`
|
h2!= `${t('general.greeting')} ${name},`
|
||||||
|
|||||||
@ -1,2 +1,2 @@
|
|||||||
p= t('support')
|
p.no-margin-top-bottom!= t('support')
|
||||||
a(href='mailto:' + supportEmail)= supportEmail
|
a(href='mailto:' + supportEmail)!= supportEmail
|
||||||
@ -1,9 +1,10 @@
|
|||||||
body{
|
body{
|
||||||
display: block;
|
display: block;
|
||||||
font-family: Lato, sans-serif;
|
font-family: Lato, sans-serif;
|
||||||
font-size: 17px;
|
font-size: 16px;
|
||||||
text-align: left;
|
text-align: left;
|
||||||
text-align: -webkit-left;
|
text-align: -webkit-left;
|
||||||
|
line-height: 24px;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
padding: 15px;
|
padding: 15px;
|
||||||
margin: 0px;
|
margin: 0px;
|
||||||
@ -11,9 +12,10 @@ body{
|
|||||||
|
|
||||||
h2 {
|
h2 {
|
||||||
margin-top: 25px;
|
margin-top: 25px;
|
||||||
font-size: 25px;
|
margin-bottom: 30px;
|
||||||
|
font-size: 24px;
|
||||||
font-weight: normal;
|
font-weight: normal;
|
||||||
line-height: 22px;
|
line-height: 24px;
|
||||||
color: #333333;
|
color: #333333;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -24,11 +26,17 @@ h2 {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.head-logo {
|
.head-logo {
|
||||||
width: 60%;
|
width: 30%;
|
||||||
height: auto;
|
height: auto;
|
||||||
display: block;
|
display: block;
|
||||||
margin-left: auto;
|
margin-left: auto;
|
||||||
margin-right: auto;
|
margin-right: auto;
|
||||||
|
margin-bottom: 50px;
|
||||||
|
}
|
||||||
|
|
||||||
|
p.no-margin-top-bottom {
|
||||||
|
margin-top: 0;
|
||||||
|
margin-bottom: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
a {
|
a {
|
||||||
@ -39,10 +47,9 @@ a.button {
|
|||||||
background: #17b53e;
|
background: #17b53e;
|
||||||
font-family: Lato, sans-serif;
|
font-family: Lato, sans-serif;
|
||||||
font-size: 16px;
|
font-size: 16px;
|
||||||
line-height: 15px;
|
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
text-align:center;
|
text-align:center;
|
||||||
padding: 13px 17px;
|
padding: 9px 18px;
|
||||||
color: #ffffff;
|
color: #ffffff;
|
||||||
display: table;
|
display: table;
|
||||||
margin-left: auto;
|
margin-left: auto;
|
||||||
@ -50,10 +57,6 @@ a.button {
|
|||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
}
|
}
|
||||||
|
|
||||||
span {
|
|
||||||
color: #17b53e;
|
|
||||||
}
|
|
||||||
|
|
||||||
.text-block {
|
.text-block {
|
||||||
margin-top: 20px;
|
margin-top: 20px;
|
||||||
color: #000000;
|
color: #000000;
|
||||||
@ -62,7 +65,7 @@ span {
|
|||||||
footer {
|
footer {
|
||||||
padding: 20px;
|
padding: 20px;
|
||||||
font-family: Lato, sans-serif;
|
font-family: Lato, sans-serif;
|
||||||
font-size: 12px;
|
font-size: 14px;
|
||||||
line-height: 15px;
|
line-height: 15px;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
color: #888888;
|
color: #888888;
|
||||||
|
|||||||
@ -1 +1 @@
|
|||||||
h2= `${t('general.welcome')} ${APPLICATION_NAME}!`
|
h2!= `${t('general.welcome')} ${APPLICATION_NAME}!`
|
||||||
@ -3,6 +3,6 @@ extend ../layout.pug
|
|||||||
block content
|
block content
|
||||||
.content
|
.content
|
||||||
p
|
p
|
||||||
a.user(href=commenterUrl)= commenterName
|
a.user(href=commenterUrl)!= commenterName
|
||||||
= t('mentionedInComment', { postTitle})
|
!= t('mentionedInComment', { postTitle})
|
||||||
a.button(href=commentUrl)= t('buttons.viewComment')
|
a.button(href=commentUrl)!= t('buttons.viewComment')
|
||||||
|
|||||||
@ -1 +1 @@
|
|||||||
= `${APPLICATION_NAME} – ${t('notification')}: ${t('subjects.mentionedInComment')}`
|
!= `${APPLICATION_NAME} – ${t('notification')}: ${t('subjects.mentionedInComment')}`
|
||||||
@ -3,6 +3,6 @@ extend ../layout.pug
|
|||||||
block content
|
block content
|
||||||
.content
|
.content
|
||||||
p
|
p
|
||||||
a.user(href=postAuthorUrl)= postAuthorName
|
a.user(href=postAuthorUrl)!= postAuthorName
|
||||||
= t('mentionedInPost', { postTitle })
|
!= t('mentionedInPost', { postTitle })
|
||||||
a.button(href=postUrl)= t('buttons.viewPost')
|
a.button(href=postUrl)!= t('buttons.viewPost')
|
||||||
|
|||||||
@ -1 +1 @@
|
|||||||
= `${APPLICATION_NAME} – ${t('notification')}: ${t('subjects.mentionedInPost')}`
|
!= `${APPLICATION_NAME} – ${t('notification')}: ${t('subjects.mentionedInPost')}`
|
||||||
@ -3,5 +3,5 @@ extend ../layout.pug
|
|||||||
block content
|
block content
|
||||||
.content
|
.content
|
||||||
- var postUrl = postUrl
|
- var postUrl = postUrl
|
||||||
p= t('postInGroup', { postTitle})
|
p!= t('postInGroup', { postTitle})
|
||||||
a.button(href=postUrl)= t('buttons.viewPost')
|
a.button(href=postUrl)!= t('buttons.viewPost')
|
||||||
|
|||||||
@ -1 +1 @@
|
|||||||
= `${APPLICATION_NAME} – ${t('notification')}: ${t('subjects.postInGroup')}`
|
!= `${APPLICATION_NAME} – ${t('notification')}: ${t('subjects.postInGroup')}`
|
||||||
@ -2,14 +2,14 @@ extend ../layout.pug
|
|||||||
|
|
||||||
block content
|
block content
|
||||||
.content
|
.content
|
||||||
p= t('registration.introduction')
|
p!= t('registration.introduction')
|
||||||
a.button(href=actionUrl)= t('buttons.confirmEmail')
|
a.button(href=actionUrl)!= t('buttons.confirmEmail')
|
||||||
p= t('registration.codeHint')
|
p!= t('registration.codeHint')
|
||||||
span= nonce
|
span!= nonce
|
||||||
p= t('registration.codeHintException')
|
p!= t('registration.codeHintException')
|
||||||
|
|
||||||
p= t('registration.notYouStart')
|
p!= t('registration.notYouStart')
|
||||||
a(href=ORGANIZATION_LINK)= APPLICATION_NAME
|
a(href=ORGANIZATION_LINK)!= APPLICATION_NAME
|
||||||
= t('registration.notYouEnd')
|
!= t('registration.notYouEnd')
|
||||||
|
|
||||||
p= t('registration.ps')
|
p!= t('registration.ps')
|
||||||
@ -1 +1 @@
|
|||||||
= `${t('general.welcome')} ${APPLICATION_NAME}`
|
!= `${t('general.welcome')} ${APPLICATION_NAME}`
|
||||||
@ -2,4 +2,4 @@ extend ../layout.pug
|
|||||||
|
|
||||||
block content
|
block content
|
||||||
.content
|
.content
|
||||||
p= t('removedUserFromGroup', { groupName })
|
p!= t('removedUserFromGroup', { groupName })
|
||||||
|
|||||||
@ -1 +1 @@
|
|||||||
= `${APPLICATION_NAME} – ${t('notification')}: ${t('subjects.removedUserFromGroup')}`
|
!= `${APPLICATION_NAME} – ${t('notification')}: ${t('subjects.removedUserFromGroup')}`
|
||||||
@ -2,8 +2,8 @@ extend ../layout.pug
|
|||||||
|
|
||||||
block content
|
block content
|
||||||
.content
|
.content
|
||||||
p= t('resetPassword.introduction')
|
p!= t('resetPassword.introduction')
|
||||||
a.button(href=actionUrl)= t('buttons.confirmEmail')
|
a.button(href=actionUrl)!= t('buttons.confirmEmail')
|
||||||
p= t('resetPassword.ignore')
|
p!= t('resetPassword.ignore')
|
||||||
p= t('resetPassword.codeHint')
|
p!= t('resetPassword.codeHint')
|
||||||
span= nonce
|
span!= nonce
|
||||||
|
|||||||
@ -1 +1 @@
|
|||||||
= `${t('subjects.resetPassword')} ${APPLICATION_NAME}`
|
!= `${t('subjects.resetPassword')} ${APPLICATION_NAME}`
|
||||||
@ -3,6 +3,6 @@ extend ../layout.pug
|
|||||||
block content
|
block content
|
||||||
.content
|
.content
|
||||||
p
|
p
|
||||||
a.user(href=groupRelatedUserUrl)= groupRelatedUserName
|
a.user(href=groupRelatedUserUrl)!= groupRelatedUserName
|
||||||
= t('userJoinedGroup', { groupName })
|
!= t('userJoinedGroup', { groupName })
|
||||||
a.button(href=groupUrl)= t('buttons.viewGroup')
|
a.button(href=groupUrl)!= t('buttons.viewGroup')
|
||||||
|
|||||||
@ -1 +1 @@
|
|||||||
= `${APPLICATION_NAME} – ${t('notification')}: ${t('subjects.userJoinedGroup')}`
|
!= `${APPLICATION_NAME} – ${t('notification')}: ${t('subjects.userJoinedGroup')}`
|
||||||
@ -3,6 +3,6 @@ extend ../layout.pug
|
|||||||
block content
|
block content
|
||||||
.content
|
.content
|
||||||
p
|
p
|
||||||
a.user(href=groupRelatedUserUrl)= groupRelatedUserName
|
a.user(href=groupRelatedUserUrl)!= groupRelatedUserName
|
||||||
= t('userLeftGroup', { groupName })
|
!= t('userLeftGroup', { groupName })
|
||||||
a.button(href=groupUrl)= t('buttons.viewGroup')
|
a.button(href=groupUrl)!= t('buttons.viewGroup')
|
||||||
|
|||||||
@ -1 +1 @@
|
|||||||
= `${APPLICATION_NAME} – ${t('notification')}: ${t('subjects.userLeftGroup')}`
|
!= `${APPLICATION_NAME} – ${t('notification')}: ${t('subjects.userLeftGroup')}`
|
||||||
@ -2,9 +2,9 @@ extend ../layout.pug
|
|||||||
|
|
||||||
block content
|
block content
|
||||||
.content
|
.content
|
||||||
p= t('wrongEmail.introduction')
|
p!= t('wrongEmail.introduction')
|
||||||
a.button(href=actionUrl)= t('buttons.tryAgain')
|
a.button(href=actionUrl)!= t('buttons.tryAgain')
|
||||||
|
|
||||||
p= t('wrongEmail.ignoreStart')
|
p!= t('wrongEmail.ignoreStart')
|
||||||
a(href=ORGANIZATION_LINK)= APPLICATION_NAME
|
a(href=ORGANIZATION_LINK)!= APPLICATION_NAME
|
||||||
= t('wrongEmail.ignoreEnd')
|
!= t('wrongEmail.ignoreEnd')
|
||||||
|
|||||||
@ -1 +1 @@
|
|||||||
= `${t('subjects.wrongEmail')} ${APPLICATION_NAME}`
|
!= `${t('subjects.wrongEmail')} ${APPLICATION_NAME}`
|
||||||
11
backend/src/graphql/queries/AddEmailAddress.ts
Normal file
11
backend/src/graphql/queries/AddEmailAddress.ts
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
import gql from 'graphql-tag'
|
||||||
|
|
||||||
|
export const AddEmailAddress = gql`
|
||||||
|
mutation ($email: String!) {
|
||||||
|
AddEmailAddress(email: $email) {
|
||||||
|
email
|
||||||
|
verifiedAt
|
||||||
|
createdAt
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`
|
||||||
15
backend/src/graphql/queries/AddPostEmotions.ts
Normal file
15
backend/src/graphql/queries/AddPostEmotions.ts
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
import gql from 'graphql-tag'
|
||||||
|
|
||||||
|
export const AddPostEmotions = gql`
|
||||||
|
mutation ($to: _PostInput!, $data: _EMOTEDInput!) {
|
||||||
|
AddPostEmotions(to: $to, data: $data) {
|
||||||
|
from {
|
||||||
|
id
|
||||||
|
}
|
||||||
|
to {
|
||||||
|
id
|
||||||
|
}
|
||||||
|
emotion
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`
|
||||||
12
backend/src/graphql/queries/Category.ts
Normal file
12
backend/src/graphql/queries/Category.ts
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
import gql from 'graphql-tag'
|
||||||
|
|
||||||
|
export const Category = gql`
|
||||||
|
query {
|
||||||
|
Category {
|
||||||
|
id
|
||||||
|
slug
|
||||||
|
name
|
||||||
|
icon
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`
|
||||||
16
backend/src/graphql/queries/ChangeGroupMemberRole.ts
Normal file
16
backend/src/graphql/queries/ChangeGroupMemberRole.ts
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
import gql from 'graphql-tag'
|
||||||
|
|
||||||
|
export const ChangeGroupMemberRole = gql`
|
||||||
|
mutation ($groupId: ID!, $userId: ID!, $roleInGroup: GroupMemberRole!) {
|
||||||
|
ChangeGroupMemberRole(groupId: $groupId, userId: $userId, roleInGroup: $roleInGroup) {
|
||||||
|
user {
|
||||||
|
id
|
||||||
|
name
|
||||||
|
slug
|
||||||
|
}
|
||||||
|
membership {
|
||||||
|
role
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`
|
||||||
@ -1,9 +1,15 @@
|
|||||||
import gql from 'graphql-tag'
|
import gql from 'graphql-tag'
|
||||||
|
|
||||||
export const createCommentMutation = gql`
|
export const CreateComment = gql`
|
||||||
mutation ($id: ID, $postId: ID!, $content: String!) {
|
mutation ($id: ID, $postId: ID!, $content: String!) {
|
||||||
CreateComment(id: $id, postId: $postId, content: $content) {
|
CreateComment(id: $id, postId: $postId, content: $content) {
|
||||||
id
|
id
|
||||||
|
content
|
||||||
|
author {
|
||||||
|
name
|
||||||
|
}
|
||||||
|
isPostObservedByMe
|
||||||
|
postObservingUsersCount
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
`
|
`
|
||||||
53
backend/src/graphql/queries/CreateGroup.ts
Normal file
53
backend/src/graphql/queries/CreateGroup.ts
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
import gql from 'graphql-tag'
|
||||||
|
|
||||||
|
export const CreateGroup = gql`
|
||||||
|
mutation (
|
||||||
|
$id: ID
|
||||||
|
$name: String!
|
||||||
|
$slug: String
|
||||||
|
$about: String
|
||||||
|
$description: String!
|
||||||
|
$groupType: GroupType!
|
||||||
|
$actionRadius: GroupActionRadius!
|
||||||
|
$categoryIds: [ID]
|
||||||
|
$locationName: String # empty string '' sets it to null
|
||||||
|
) {
|
||||||
|
CreateGroup(
|
||||||
|
id: $id
|
||||||
|
name: $name
|
||||||
|
slug: $slug
|
||||||
|
about: $about
|
||||||
|
description: $description
|
||||||
|
groupType: $groupType
|
||||||
|
actionRadius: $actionRadius
|
||||||
|
categoryIds: $categoryIds
|
||||||
|
locationName: $locationName
|
||||||
|
) {
|
||||||
|
id
|
||||||
|
name
|
||||||
|
slug
|
||||||
|
createdAt
|
||||||
|
updatedAt
|
||||||
|
disabled
|
||||||
|
deleted
|
||||||
|
about
|
||||||
|
description
|
||||||
|
descriptionExcerpt
|
||||||
|
groupType
|
||||||
|
actionRadius
|
||||||
|
categories {
|
||||||
|
id
|
||||||
|
slug
|
||||||
|
name
|
||||||
|
icon
|
||||||
|
}
|
||||||
|
locationName
|
||||||
|
location {
|
||||||
|
name
|
||||||
|
nameDE
|
||||||
|
nameEN
|
||||||
|
}
|
||||||
|
myRole
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`
|
||||||
51
backend/src/graphql/queries/CreatePost.ts
Normal file
51
backend/src/graphql/queries/CreatePost.ts
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
import gql from 'graphql-tag'
|
||||||
|
|
||||||
|
export const CreatePost = gql`
|
||||||
|
mutation (
|
||||||
|
$id: ID
|
||||||
|
$title: String!
|
||||||
|
$slug: String
|
||||||
|
$content: String!
|
||||||
|
$categoryIds: [ID]
|
||||||
|
$groupId: ID
|
||||||
|
$postType: PostType
|
||||||
|
$eventInput: _EventInput
|
||||||
|
) {
|
||||||
|
CreatePost(
|
||||||
|
id: $id
|
||||||
|
title: $title
|
||||||
|
slug: $slug
|
||||||
|
content: $content
|
||||||
|
categoryIds: $categoryIds
|
||||||
|
groupId: $groupId
|
||||||
|
postType: $postType
|
||||||
|
eventInput: $eventInput
|
||||||
|
) {
|
||||||
|
id
|
||||||
|
slug
|
||||||
|
title
|
||||||
|
content
|
||||||
|
disabled
|
||||||
|
deleted
|
||||||
|
postType
|
||||||
|
author {
|
||||||
|
name
|
||||||
|
}
|
||||||
|
categories {
|
||||||
|
id
|
||||||
|
}
|
||||||
|
eventStart
|
||||||
|
eventEnd
|
||||||
|
eventLocationName
|
||||||
|
eventVenue
|
||||||
|
eventIsOnline
|
||||||
|
eventLocation {
|
||||||
|
lng
|
||||||
|
lat
|
||||||
|
}
|
||||||
|
isObservedByMe
|
||||||
|
observingUsersCount
|
||||||
|
language
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`
|
||||||
22
backend/src/graphql/queries/CreateRoom.ts
Normal file
22
backend/src/graphql/queries/CreateRoom.ts
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
import gql from 'graphql-tag'
|
||||||
|
|
||||||
|
export const CreateRoom = gql`
|
||||||
|
mutation ($userId: ID!) {
|
||||||
|
CreateRoom(userId: $userId) {
|
||||||
|
id
|
||||||
|
roomId
|
||||||
|
roomName
|
||||||
|
lastMessageAt
|
||||||
|
unreadCount
|
||||||
|
#avatar
|
||||||
|
users {
|
||||||
|
_id
|
||||||
|
id
|
||||||
|
name
|
||||||
|
avatar {
|
||||||
|
url
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`
|
||||||
14
backend/src/graphql/queries/CreateSocialMedia.ts
Normal file
14
backend/src/graphql/queries/CreateSocialMedia.ts
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
import gql from 'graphql-tag'
|
||||||
|
|
||||||
|
export const CreateSocialMedia = gql`
|
||||||
|
mutation ($url: String!) {
|
||||||
|
CreateSocialMedia(url: $url) {
|
||||||
|
id
|
||||||
|
url
|
||||||
|
url
|
||||||
|
ownedBy {
|
||||||
|
name
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`
|
||||||
12
backend/src/graphql/queries/DeleteComment.ts
Normal file
12
backend/src/graphql/queries/DeleteComment.ts
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
import gql from 'graphql-tag'
|
||||||
|
|
||||||
|
export const DeleteComment = gql`
|
||||||
|
mutation ($id: ID!) {
|
||||||
|
DeleteComment(id: $id) {
|
||||||
|
id
|
||||||
|
content
|
||||||
|
contentExcerpt
|
||||||
|
deleted
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`
|
||||||
20
backend/src/graphql/queries/DeletePost.ts
Normal file
20
backend/src/graphql/queries/DeletePost.ts
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
import gql from 'graphql-tag'
|
||||||
|
|
||||||
|
export const DeletePost = gql`
|
||||||
|
mutation ($id: ID!) {
|
||||||
|
DeletePost(id: $id) {
|
||||||
|
id
|
||||||
|
deleted
|
||||||
|
content
|
||||||
|
contentExcerpt
|
||||||
|
image {
|
||||||
|
url
|
||||||
|
}
|
||||||
|
comments {
|
||||||
|
deleted
|
||||||
|
content
|
||||||
|
contentExcerpt
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`
|
||||||
10
backend/src/graphql/queries/DeleteSocialMedia.ts
Normal file
10
backend/src/graphql/queries/DeleteSocialMedia.ts
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
import gql from 'graphql-tag'
|
||||||
|
|
||||||
|
export const DeleteSocialMedia = gql`
|
||||||
|
mutation ($id: ID!) {
|
||||||
|
DeleteSocialMedia(id: $id) {
|
||||||
|
id
|
||||||
|
url
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`
|
||||||
30
backend/src/graphql/queries/DeleteUser.ts
Normal file
30
backend/src/graphql/queries/DeleteUser.ts
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
import gql from 'graphql-tag'
|
||||||
|
|
||||||
|
export const DeleteUser = gql`
|
||||||
|
mutation ($id: ID!, $resource: [Deletable]) {
|
||||||
|
DeleteUser(id: $id, resource: $resource) {
|
||||||
|
id
|
||||||
|
name
|
||||||
|
about
|
||||||
|
deleted
|
||||||
|
contributions {
|
||||||
|
id
|
||||||
|
content
|
||||||
|
contentExcerpt
|
||||||
|
deleted
|
||||||
|
comments {
|
||||||
|
id
|
||||||
|
content
|
||||||
|
contentExcerpt
|
||||||
|
deleted
|
||||||
|
}
|
||||||
|
}
|
||||||
|
comments {
|
||||||
|
id
|
||||||
|
content
|
||||||
|
contentExcerpt
|
||||||
|
deleted
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`
|
||||||
12
backend/src/graphql/queries/Donations.ts
Normal file
12
backend/src/graphql/queries/Donations.ts
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
import gql from 'graphql-tag'
|
||||||
|
|
||||||
|
export const Donations = gql`
|
||||||
|
query {
|
||||||
|
Donations {
|
||||||
|
id
|
||||||
|
showDonations
|
||||||
|
goal
|
||||||
|
progress
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`
|
||||||
@ -3,10 +3,14 @@ import gql from 'graphql-tag'
|
|||||||
export const GroupMembers = gql`
|
export const GroupMembers = gql`
|
||||||
query GroupMembers($id: ID!) {
|
query GroupMembers($id: ID!) {
|
||||||
GroupMembers(id: $id) {
|
GroupMembers(id: $id) {
|
||||||
id
|
user {
|
||||||
name
|
id
|
||||||
slug
|
name
|
||||||
myRoleInGroup
|
slug
|
||||||
|
}
|
||||||
|
membership {
|
||||||
|
role
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
`
|
`
|
||||||
|
|||||||
16
backend/src/graphql/queries/JoinGroup.ts
Normal file
16
backend/src/graphql/queries/JoinGroup.ts
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
import gql from 'graphql-tag'
|
||||||
|
|
||||||
|
export const JoinGroup = gql`
|
||||||
|
mutation ($groupId: ID!, $userId: ID!) {
|
||||||
|
JoinGroup(groupId: $groupId, userId: $userId) {
|
||||||
|
user {
|
||||||
|
id
|
||||||
|
name
|
||||||
|
slug
|
||||||
|
}
|
||||||
|
membership {
|
||||||
|
role
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`
|
||||||
16
backend/src/graphql/queries/LeaveGroup.ts
Normal file
16
backend/src/graphql/queries/LeaveGroup.ts
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
import gql from 'graphql-tag'
|
||||||
|
|
||||||
|
export const LeaveGroup = gql`
|
||||||
|
mutation ($groupId: ID!, $userId: ID!) {
|
||||||
|
LeaveGroup(groupId: $groupId, userId: $userId) {
|
||||||
|
user {
|
||||||
|
id
|
||||||
|
name
|
||||||
|
slug
|
||||||
|
}
|
||||||
|
membership {
|
||||||
|
role
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`
|
||||||
@ -1,12 +1,39 @@
|
|||||||
import gql from 'graphql-tag'
|
import gql from 'graphql-tag'
|
||||||
|
|
||||||
export const Post = gql`
|
export const Post = gql`
|
||||||
query ($orderBy: [_PostOrdering]) {
|
query ($id: ID, $filter: _PostFilter, $first: Int, $offset: Int, $orderBy: [_PostOrdering]) {
|
||||||
Post(orderBy: $orderBy) {
|
Post(id: $id, filter: $filter, first: $first, offset: $offset, orderBy: $orderBy) {
|
||||||
id
|
id
|
||||||
|
title
|
||||||
|
content
|
||||||
|
contentExcerpt
|
||||||
|
eventStart
|
||||||
pinned
|
pinned
|
||||||
createdAt
|
createdAt
|
||||||
pinnedAt
|
pinnedAt
|
||||||
|
isObservedByMe
|
||||||
|
observingUsersCount
|
||||||
|
clickedCount
|
||||||
|
emotionsCount
|
||||||
|
emotions {
|
||||||
|
emotion
|
||||||
|
User {
|
||||||
|
id
|
||||||
|
}
|
||||||
|
}
|
||||||
|
author {
|
||||||
|
id
|
||||||
|
name
|
||||||
|
}
|
||||||
|
shoutedBy {
|
||||||
|
id
|
||||||
|
}
|
||||||
|
tags {
|
||||||
|
id
|
||||||
|
}
|
||||||
|
comments {
|
||||||
|
content
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
`
|
`
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user