diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index 1d2aef77e..595c9d584 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -1,25 +1,9 @@ --- -name: πŸ› Bug report -about: Create a report to help us improve +name: πŸ› Bug Report +about: Create a report to help us to improve. labels: bug title: πŸ› [Bug] --- -## :bug: Bugreport +## :bug: Bug Report - -### Steps to reproduce the behavior -1. -2. -3. -4. ... -5. Profit - -### Expected behavior - - -### Version & Environment - - -### Additional context - diff --git a/.github/ISSUE_TEMPLATE/devops_ticket.md b/.github/ISSUE_TEMPLATE/devops_ticket.md index 77355d1cf..115664911 100644 --- a/.github/ISSUE_TEMPLATE/devops_ticket.md +++ b/.github/ISSUE_TEMPLATE/devops_ticket.md @@ -1,24 +1,9 @@ --- -name: πŸ’₯ DevOps ticket -about: Help us manage our deployed App. +name: πŸ’₯ DevOps Ticket +about: Help us manage our deployed app. labels: devops title: πŸ’₯ [DevOps] --- -## πŸ’₯ DevOps ticket +## πŸ’₯ DevOps Ticket - -### Motive - - -### Related issues - - -### Implementation - - -### Validation - - -### Additional context - diff --git a/.github/ISSUE_TEMPLATE/epic.md b/.github/ISSUE_TEMPLATE/epic.md new file mode 100644 index 000000000..cf72cd673 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/epic.md @@ -0,0 +1,12 @@ +--- +name: 🌟 Epic +about: Define a big development step. +labels: epic +title: 🌟 [EPIC] +--- + + + +## 🌟 EPIC + diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md index ef3b30be2..beae80901 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -1,24 +1,9 @@ --- -name: πŸš€ Feature request -about: Suggest an idea for this project +name: πŸš€ Feature Request +about: Suggest an idea for this project. labels: feature title: πŸš€ [Feature] --- -## :rocket: Feature +## :rocket: Feature Request - -### User Problem - - -### Implementation - - -### Design & Layout - - -### Validation - - -### Additional context - diff --git a/.github/ISSUE_TEMPLATE/question.md b/.github/ISSUE_TEMPLATE/question.md index aabbc0f0a..40e6e381b 100644 --- a/.github/ISSUE_TEMPLATE/question.md +++ b/.github/ISSUE_TEMPLATE/question.md @@ -1,12 +1,12 @@ --- name: πŸ’¬ Question -about: If you need help understanding HumanConnection. +about: If you need help understanding ocelot.social. labels: question title: πŸ’¬ [Question] --- - - + + -## :speech_balloon: Question +## πŸ’¬ Question diff --git a/.github/ISSUE_TEMPLATE/refactor_tickets.md b/.github/ISSUE_TEMPLATE/refactor_tickets.md index b595abd5d..d1841e35e 100644 --- a/.github/ISSUE_TEMPLATE/refactor_tickets.md +++ b/.github/ISSUE_TEMPLATE/refactor_tickets.md @@ -1,21 +1,10 @@ --- -name: πŸ”§ Refactor ticket +name: πŸ”§ Refactor about: Help us improve our code by refactoring it. labels: refactor title: πŸ”§ [Refactor] --- -## :zap: Refactor ticket +## πŸ”§ Refactor -### Motive - - -### Related issues - - -### Implementation - - -### Additional context - diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 000000000..c5433c921 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,179 @@ +version: 2 +updates: +- package-ecosystem: npm + directory: "/" + schedule: + interval: daily + time: "04:00" + open-pull-requests-limit: 10 + ignore: + - dependency-name: cypress + versions: + - 6.3.0 + - 6.4.0 + - 6.5.0 + - 6.6.0 + - 6.7.1 + - 6.8.0 + - 7.0.0 + - 7.0.1 + - 7.1.0 + - dependency-name: cypress-cucumber-preprocessor + versions: + - 4.0.0 + - 4.0.1 + - 4.0.3 + - dependency-name: date-fns + versions: + - 2.16.1 + - 2.17.0 + - 2.18.0 + - 2.19.0 + - 2.20.0 + - 2.20.1 + - 2.20.2 + - 2.20.3 + - 2.21.0 + - dependency-name: cypress-file-upload + versions: + - 5.0.2 + - 5.0.3 + - 5.0.4 + - 5.0.5 + - dependency-name: neo4j-driver + versions: + - 4.2.2 +- package-ecosystem: npm + directory: "/backend" + schedule: + interval: daily + time: "04:00" + open-pull-requests-limit: 10 + ignore: + - dependency-name: y18n + versions: + - 4.0.1 + - 4.0.2 + - dependency-name: metascraper-publisher + versions: + - 5.16.16 + - 5.18.1 + - 5.18.12 + - 5.18.2 + - 5.18.4 + - 5.18.5 + - 5.18.6 + - 5.18.9 + - 5.20.0 + - 5.21.0 + - 5.21.2 + - 5.21.3 + - 5.21.4 + - 5.21.5 + - dependency-name: metascraper-author + versions: + - 5.16.16 + - 5.18.1 + - 5.18.12 + - 5.18.2 + - 5.18.4 + - 5.18.5 + - 5.18.6 + - 5.18.9 + - 5.20.0 + - 5.21.0 + - 5.21.2 + - 5.21.3 + - 5.21.4 + - 5.21.5 + - dependency-name: neo4j-driver + versions: + - 4.2.2 + - dependency-name: neo4j-graphql-js + versions: + - 2.19.1 + - dependency-name: mustache + versions: + - 4.1.0 +- package-ecosystem: npm + directory: "/webapp" + schedule: + interval: daily + time: "04:00" + open-pull-requests-limit: 10 + ignore: + - dependency-name: nuxt + versions: + - 2.14.12 + - 2.15.0 + - 2.15.1 + - 2.15.2 + - 2.15.3 + - dependency-name: v-tooltip + versions: + - 2.1.2 + - dependency-name: "@vue/server-test-utils" + versions: + - 1.1.2 + - 1.1.3 + - dependency-name: node-notifier + versions: + - 8.0.1 +- package-ecosystem: docker + directory: "/webapp" + schedule: + interval: daily + time: "04:00" + open-pull-requests-limit: 10 + ignore: + - dependency-name: node + versions: + - ">= 15.5.a, < 15.6" + - dependency-name: node + versions: + - 15.10.0.pre.alpine3.10 + - 15.11.0.pre.alpine3.10 + - 15.12.0.pre.alpine3.10 + - 15.13.0.pre.alpine3.10 + - 15.7.0.pre.alpine3.10 + - 15.8.0.pre.alpine3.10 + - 15.9.0.pre.alpine3.10 +- package-ecosystem: docker + directory: "/backend" + schedule: + interval: daily + time: "04:00" + open-pull-requests-limit: 10 + ignore: + - dependency-name: node + versions: + - ">= 15.4.a, < 15.5" + - dependency-name: node + versions: + - ">= 15.5.a, < 15.6" + - dependency-name: node + versions: + - 15.10.0.pre.alpine3.10 + - 15.11.0.pre.alpine3.10 + - 15.12.0.pre.alpine3.10 + - 15.13.0.pre.alpine3.10 + - 15.7.0.pre.alpine3.10 + - 15.8.0.pre.alpine3.10 + - 15.9.0.pre.alpine3.10 +- package-ecosystem: docker + directory: "/neo4j" + schedule: + interval: daily + time: "04:00" + open-pull-requests-limit: 10 + ignore: + - dependency-name: neo4j + versions: + - 4.2.3 + - 4.2.4 +- package-ecosystem: docker + directory: "/deployment/legacy-migration/maintenance-worker" + schedule: + interval: daily + time: "04:00" + open-pull-requests-limit: 10 diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index de956e17b..1c7927665 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -4,6 +4,7 @@ on: push: branches: - master + # - 4451-new-deployment-with-base-and-code # for testing while developing jobs: ############################################################################## @@ -92,7 +93,10 @@ jobs: # BUILD BACKEND DOCKER IMAGE (production) ################################ ########################################################################## - name: Backend | Build `production` image - run: docker build --target production -t "ocelotsocialnetwork/backend:latest" -t "ocelotsocialnetwork/backend:${VERSION}" -t "ocelotsocialnetwork/backend:${BUILD_VERSION}" --build-arg BBUILD_DATE=$BUILD_DATE --build-arg BBUILD_VERSION=$BUILD_VERSION --build-arg BBUILD_COMMIT=$BUILD_COMMIT backend/ + run: | + docker build --target base -t "ocelotsocialnetwork/backend:latest-base" -t "ocelotsocialnetwork/backend:${VERSION}-base" -t "ocelotsocialnetwork/backend:${BUILD_VERSION}-base" --build-arg BBUILD_DATE=$BUILD_DATE --build-arg BBUILD_VERSION=$BUILD_VERSION --build-arg BBUILD_COMMIT=$BUILD_COMMIT backend/ + docker build --target code -t "ocelotsocialnetwork/backend:latest-code" -t "ocelotsocialnetwork/backend:${VERSION}-code" -t "ocelotsocialnetwork/backend:${BUILD_VERSION}-code" --build-arg BBUILD_DATE=$BUILD_DATE --build-arg BBUILD_VERSION=$BUILD_VERSION --build-arg BBUILD_COMMIT=$BUILD_COMMIT backend/ + docker build --target production -t "ocelotsocialnetwork/backend:latest" -t "ocelotsocialnetwork/backend:${VERSION}" -t "ocelotsocialnetwork/backend:${BUILD_VERSION}" --build-arg BBUILD_DATE=$BUILD_DATE --build-arg BBUILD_VERSION=$BUILD_VERSION --build-arg BBUILD_COMMIT=$BUILD_COMMIT backend/ - name: Backend | Save docker image run: docker save "ocelotsocialnetwork/backend" > /tmp/backend.tar - name: Upload Artifact @@ -129,7 +133,10 @@ jobs: # BUILD WEBAPP DOCKER IMAGE (build) ###################################### ########################################################################## - name: Webapp | Build `production` image - run: docker build --target production -t "ocelotsocialnetwork/webapp:latest" -t "ocelotsocialnetwork/webapp:${VERSION}" -t "ocelotsocialnetwork/webapp:${BUILD_VERSION}" --build-arg BBUILD_DATE=$BUILD_DATE --build-arg BBUILD_VERSION=$BUILD_VERSION --build-arg BBUILD_COMMIT=$BUILD_COMMIT webapp/ + run: | + docker build --target base -t "ocelotsocialnetwork/webapp:latest-base" -t "ocelotsocialnetwork/webapp:${VERSION}-base" -t "ocelotsocialnetwork/webapp:${BUILD_VERSION}-base" --build-arg BBUILD_DATE=$BUILD_DATE --build-arg BBUILD_VERSION=$BUILD_VERSION --build-arg BBUILD_COMMIT=$BUILD_COMMIT webapp/ + docker build --target code -t "ocelotsocialnetwork/webapp:latest-code" -t "ocelotsocialnetwork/webapp:${VERSION}-code" -t "ocelotsocialnetwork/webapp:${BUILD_VERSION}-code" --build-arg BBUILD_DATE=$BUILD_DATE --build-arg BBUILD_VERSION=$BUILD_VERSION --build-arg BBUILD_COMMIT=$BUILD_COMMIT webapp/ + docker build --target production -t "ocelotsocialnetwork/webapp:latest" -t "ocelotsocialnetwork/webapp:${VERSION}" -t "ocelotsocialnetwork/webapp:${BUILD_VERSION}" --build-arg BBUILD_DATE=$BUILD_DATE --build-arg BBUILD_VERSION=$BUILD_VERSION --build-arg BBUILD_COMMIT=$BUILD_COMMIT webapp/ - name: Webapp | Save docker image run: docker save "ocelotsocialnetwork/webapp" > /tmp/webapp.tar - name: Upload Artifact @@ -166,7 +173,10 @@ jobs: # BUILD MAINTENANCE DOCKER IMAGE (build) ################################# ########################################################################## - name: Maintenance | Build `production` image - run: docker build --target production -t "ocelotsocialnetwork/maintenance:latest" -t "ocelotsocialnetwork/maintenance:${VERSION}" -t "ocelotsocialnetwork/maintenance:${BUILD_VERSION}" --build-arg BBUILD_DATE=$BUILD_DATE --build-arg BBUILD_VERSION=$BUILD_VERSION --build-arg BBUILD_COMMIT=$BUILD_COMMIT webapp/ -f webapp/Dockerfile.maintenance + run: | + docker build --target base -t "ocelotsocialnetwork/maintenance:latest-base" -t "ocelotsocialnetwork/maintenance:${VERSION}-base" -t "ocelotsocialnetwork/maintenance:${BUILD_VERSION}-base" --build-arg BBUILD_DATE=$BUILD_DATE --build-arg BBUILD_VERSION=$BUILD_VERSION --build-arg BBUILD_COMMIT=$BUILD_COMMIT webapp/ -f webapp/Dockerfile.maintenance + docker build --target code -t "ocelotsocialnetwork/maintenance:latest-code" -t "ocelotsocialnetwork/maintenance:${VERSION}-code" -t "ocelotsocialnetwork/maintenance:${BUILD_VERSION}-code" --build-arg BBUILD_DATE=$BUILD_DATE --build-arg BBUILD_VERSION=$BUILD_VERSION --build-arg BBUILD_COMMIT=$BUILD_COMMIT webapp/ -f webapp/Dockerfile.maintenance + docker build --target production -t "ocelotsocialnetwork/maintenance:latest" -t "ocelotsocialnetwork/maintenance:${VERSION}" -t "ocelotsocialnetwork/maintenance:${BUILD_VERSION}" --build-arg BBUILD_DATE=$BUILD_DATE --build-arg BBUILD_VERSION=$BUILD_VERSION --build-arg BBUILD_COMMIT=$BUILD_COMMIT webapp/ -f webapp/Dockerfile.maintenance - name: Maintenance | Save docker image run: docker save "ocelotsocialnetwork/maintenance" > /tmp/maintenance.tar - name: Upload Artifact diff --git a/CHANGELOG.md b/CHANGELOG.md index 5a040d403..e7e69342a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,8 +4,22 @@ All notable changes to this project will be documented in this file. Dates are d Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog). -#### [v1.0.3](https://github.com/Ocelot-Social-Community/Ocelot-Social/compare/1.0.2...v1.0.3) +#### [v1.0.4](https://github.com/Ocelot-Social-Community/Ocelot-Social/compare/1.0.3...v1.0.4) +- fixed wrong env variable [`#4474`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4474) +- chore: [WIP] 🍰 New Deployment With 'base' And 'code' Docker Images [`#4452`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4452) +- feat: 🍰 Flexible Footer Links [`#4468`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4468) +- docs: 🍰 Correct 'Contribution.md' [`#4466`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4466) +- docs: 🍰 Correct Discord Links And Divers [`#4461`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4461) +- Implement flexible page footer links [`1bd4af6`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/1bd4af6fd3b5db167575910948a0a72461a1129a) +- Implement tests for flexible page footer links [`627a20f`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/627a20f66a65450996a5fe3128fd37769fdfd629) +- Correct Discord links and divers [`0318910`](https://github.com/Ocelot-Social-Community/Ocelot-Social/commit/0318910488e245c4a1d09181265de63d05a89cf1) + +#### [1.0.3](https://github.com/Ocelot-Social-Community/Ocelot-Social/compare/1.0.2...1.0.3) + +> 19 May 2021 + +- chore: 🍰 Release v1.0.3 [`#4435`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4435) - chore: 🍰 Refactor Logos [`#4433`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4433) - feat: 🍰 Show Password Component [`#4370`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4370) - chore: 🍰 Replace Ocelot Logos 619x593 With 600x570 [`#4428`](https://github.com/Ocelot-Social-Community/Ocelot-Social/pull/4428) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index b5f74d879..50d3721d1 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -4,31 +4,33 @@ Thank you so much for thinking of contributing to the Human Connection project! ## Getting Set Up -Instructions for how to install all the necessary software and some code guidelines can be found in our [documentation](https://docs.human-connection.org/human-connection/). +Instructions for how to install all the necessary software and some code guidelines can be found in our main [Readme](/README.md) or in our [documentation](https://docs.human-connection.org/human-connection/). -To get you started we recommend that you join forces with a regular contributor. Please join [our discord instance](https://human-connection.org/discord) to chat with developers or just get in touch directly on an issue on either [Github](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues) or [Zenhub](https://app.zenhub.com/workspaces/ocelotsocial-5fb21ff922cb410015dd6535/board?filterLogic=any&repos=301151089): +To get you started we recommend that you join forces with a regular contributor. Please join [our Discord instance](https://discord.gg/AJSX9DCSUA) to chat with developers or just get in touch directly on an issue on either [Github](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues) or [Zenhub](https://app.zenhub.com/workspaces/ocelotsocial-5fb21ff922cb410015dd6535/board?filterLogic=any&repos=301151089): ![](https://dl.dropbox.com/s/vbmcihkduy9dhko/Screenshot%202019-01-03%2015.50.11.png?dl=0) -We also have regular pair programming sessions that you are very welcome to join! We feel this is often the best way to get to know both the project and the team. Most developers are also available for spontaneous sessions if the times listed below don't work for you – just ping us on discord. +We also have regular pair programming sessions that you are very welcome to join! We feel this is often the best way to get to know both the project and the team. Most developers are also available for spontaneous sessions if the times listed below don't work for you – just ping us on Discord. ## Development Flow We operate in two week sprints that are planned, estimated and prioritised on [Zenhub](https://app.zenhub.com/workspaces/ocelotsocial-5fb21ff922cb410015dd6535/board?filterLogic=any&repos=301151089). All issues are also linked to and synced with [Github](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues). Look for the `good first issue` label if you're not sure where to start! -We try to discuss all questions directly related to a feature or bug in the respective issue, in order to preserve it for the future and for other developers. We use discord for real-time communication. +We try to discuss all questions directly related to a feature or bug in the respective issue, in order to preserve it for the future and for other developers. We use Discord for real-time communication. This is how we solve bugs and implement features, step by step: + 1. We find an issue we want to work on, usually during the sprint planning but as an open source contributor this can happen at any time. 2. We communicate with the team to see if the issue is still available. (When you comment on an issue but don't get an answer there within 1-2 days try to mention @Human-Connection/hc-dev-team to make sure we check in.) 3. We make sure we understand the issue in detail – what problem is it solving and how should it be implemented? -4. We assign ourselves to the issue and move it to `In Progress` on [Zenhub](https://app.zenhub.com/workspaces/human-connection-nitro-5c0154ecc699f60fc92cf11f). +4. We assign ourselves to the issue and move it to `In Progress` on [Zenhub](https://app.zenhub.com/workspaces/ocelotsocial-5fb21ff922cb410015dd6535/board?filterLogic=any&repos=301151089). 5. We start working on it in a `new branch` and open a `pull request` prefixed with `[WIP]` (work in progress) to which we regularly push our changes. 6. When questions come up we clarify them with the team (directly in the issue on Github). 7. When we are happy with our work and our PR is passing all tests we remove the `[WIP]` from the PR description and ask for reviews (if you're not sure who to ask there is @Human-Connection/hc-dev-team which pings all core developers). 8. We then incorporate the suggestions from the reviews into our work and once it has been approved it can be merged into master! Every pull request needs to: + * fix an issue (if there is something you want to work on but there is no issue for it, create one first and discuss it with the team) * include tests for the code that is added or changed * pass all tests (linter, backend, frontend, end-to-end) @@ -38,37 +40,46 @@ Every pull request needs to: There are many volunteers all around the world helping us build this network and without their contributions we wouldn't be where we are today. Big thank you to all of you! -You can see the core team behind Human Connection [on our website](https://human-connection.org/en/the-team/). On Github you will mostly run into our developers: -* Robert (@roschaefer) -* Matt (@mattwr18) +You can talk to our core team on [Discord](https://discord.gg/AJSX9DCSUA). And on Github you will mostly run into our core developers: + +* Ulf (@ulfgebhardt) +* Moriz (@Mogge) * Wolle (@Tirokk) * Alex (@ogerly) + + ## Meetings and Pair Programming Sessions Times below refer to **German Time** – that's CET (GMT+1) in winter and CEST (GMT+2) in summer – because most Human Connection core team members are living in Germany. Daily standup -* every Monday–Friday 11:30 -* in the discord `Conference Room` + +* every Monday–Thursday 11:30 am (german time see above πŸ‘†πŸΌ) +* in our [Discord](https://discord.gg/AJSX9DCSUA) `Office Cube` * all contributors welcome! * everybody shares what they are working on and asks for help if they are blocked + ## Philosophy @@ -102,10 +115,9 @@ We use pair programming sessions as a tool for knowledge sharing. We can learn a As a volunteeer you have no commitment except your own self development and your awesomeness by contributing to this free and open-source software project. Cheers to you! - ## Open-Source Bounties -There are so many good reasons to contribute to Human Connection +There are so many good reasons to contribute to ocelot.social * You learn state-of-the-art technologies * You build your portfolio @@ -121,7 +133,7 @@ pull request approved and merged for free**. You can choose something really quick and easy. What's important is starting a working relationship with the team, learning the workflow, and understanding this contribution guide. You can filter issues by 'good first issue', to get an idea where to start. Please join -our our [community chat](https://human-connection.org/discord), too. +our our [Discord community chat](https://discord.gg/AJSX9DCSUA), too. You can filter Github issues with label [bounty](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues?q=is%3Aopen+is%3Aissue+label%3Abounty). These issues should have a second label `€` which indicate their respective financial compensation in Euros. diff --git a/README.md b/README.md index 4e1777c25..416fcaefb 100644 --- a/README.md +++ b/README.md @@ -31,6 +31,7 @@ Logins: ## Directory Layout There are four important directories: + * [Backend](./backend) runs on the server and is a middleware between database and frontend * [Frontend](./webapp) is a server-side-rendered and client-side-rendered web frontend * [Cypress](./cypress) contains end-to-end tests and executable feature specifications @@ -46,16 +47,19 @@ There are two approaches: ## Installation ### Clone the Repository + Clone the repository, this will create a new folder called `Ocelot-Social`: Using HTTPS: + ```bash $ git clone https://github.com/Ocelot-Social-Community/Ocelot-Social.git ``` Using SSH: + ```bash -$ git clone git@github.com:Human-Connection/Human-Connection.git +$ git clone git@github.com:Ocelot-Social-Community/Ocelot-Social.git ``` Change into the new folder. @@ -88,13 +92,15 @@ docker-compose version 1.23.2 #### Start Ocelot-Social via Docker-Compose For Development: + ```bash -docker-compose up +$ docker-compose up ``` -For Production +For Production: + ```bash -docker-compose -f docker-compose.yml up +$ docker-compose -f docker-compose.yml up ``` This will start all required Docker containers @@ -107,12 +113,12 @@ The only deployment method in this repository is `docker-compose` for developmen ## Developer Chat -Join our friendly open-source community on [Discord](https://discordapp.com/invite/DFSjPaX) :heart_eyes_cat: +Join our friendly open-source community on [Discord](https://discord.gg/AJSX9DCSUA) :heart_eyes_cat: Just introduce yourself at `#introduce-yourself` and mention `@@Mentor` to get you onboard :neckbeard: Check out the [contribution guideline](./CONTRIBUTING.md), too! We give write permissions to every developer who asks for it. Just text us on -[Discord](https://discord.gg/6ub73U3). +[Discord](https://discord.gg/AJSX9DCSUA). ## Technology Stack @@ -131,4 +137,5 @@ Browser compatibility testing with [BrowserStack](https://www.browserstack.com/) BrowserStack Logo ## License + See the [LICENSE](LICENSE.md) file for license rights and limitations (MIT). diff --git a/backend/Dockerfile b/backend/Dockerfile index c632f8803..0ebdfb1eb 100644 --- a/backend/Dockerfile +++ b/backend/Dockerfile @@ -1,5 +1,5 @@ ################################################################################## -# BASE ########################################################################### +# BASE (Is pushed to DockerHub for rebranding) ################################### ################################################################################## FROM node:12.19.0-alpine3.10 as base @@ -59,12 +59,18 @@ FROM base as development CMD /bin/sh -c "yarn install && yarn run dev" ################################################################################## -# BUILD (Does contain all files and is therefore bloated) ######################## +# CODE (Does contain all code files and is pushed to DockerHub for rebranding) ### ################################################################################## -FROM base as build +FROM base as code -# Copy everything +# copy everything, but do not build. COPY . . + +################################################################################## +# BUILD (Does contain all files and the compilate and is therefore bloated) ###### +################################################################################## +FROM code as build + # yarn install RUN yarn install --production=false --frozen-lockfile --non-interactive # yarn build @@ -85,7 +91,6 @@ FROM base as production # Copy "binary"-files from build image COPY --from=build ${DOCKER_WORKDIR}/dist ./dist -COPY --from=build ${DOCKER_WORKDIR}/node_modules ./node_modules # Copy static files # TODO - externalize the uploads so we can copy the whole folder COPY --from=build ${DOCKER_WORKDIR}/public/img/ ./public/img/ @@ -94,4 +99,4 @@ COPY --from=build ${DOCKER_WORKDIR}/public/providers.json ./public/providers.jso COPY --from=build ${DOCKER_WORKDIR}/package.json ./package.json # Run command -CMD /bin/sh -c "yarn run start" \ No newline at end of file +CMD /bin/sh -c "yarn run start" diff --git a/backend/package.json b/backend/package.json index 9787253a1..ac5c1d2f8 100644 --- a/backend/package.json +++ b/backend/package.json @@ -1,6 +1,6 @@ { "name": "ocelot-social-backend", - "version": "1.0.3", + "version": "1.0.4", "description": "GraphQL Backend for ocelot.social", "repository": "https://github.com/Ocelot-Social-Community/Ocelot-Social", "author": "ocelot.social Community", @@ -39,6 +39,12 @@ ] }, "dependencies": { + "@babel/cli": "~7.8.4", + "@babel/core": "~7.9.0", + "@babel/node": "~7.8.7", + "@babel/plugin-proposal-throw-expressions": "^7.8.3", + "@babel/preset-env": "~7.9.5", + "@babel/register": "^7.9.0", "@hapi/joi": "^17.1.1", "@sentry/node": "^5.15.4", "apollo-cache-inmemory": "~1.6.5", @@ -48,12 +54,15 @@ "apollo-server": "~2.14.2", "apollo-server-express": "^2.14.2", "aws-sdk": "^2.652.0", + "babel-core": "~7.0.0-0", + "babel-eslint": "~10.1.0", + "babel-jest": "~25.2.6", "babel-plugin-transform-runtime": "^6.23.0", "bcryptjs": "~2.4.3", "cheerio": "~1.0.0-rc.3", "cors": "~2.8.5", "cross-env": "~7.0.2", - "date-fns": "2.11.1", + "date-fns": "2.22.1", "debug": "~4.1.1", "dotenv": "~8.2.0", "express": "^4.17.1", @@ -72,7 +81,7 @@ "languagedetect": "^2.0.0", "linkifyjs": "~2.1.8", "lodash": "~4.17.14", - "merge-graphql-schemas": "^1.7.7", + "merge-graphql-schemas": "^1.7.8", "metascraper": "^5.11.8", "metascraper-audio": "^5.14.26", "metascraper-author": "^5.14.22", @@ -92,7 +101,7 @@ "migrate": "^1.7.0", "mime-types": "^2.1.26", "minimatch": "^3.0.4", - "mustache": "^4.0.1", + "mustache": "^4.2.0", "neo4j-driver": "^4.0.2", "neo4j-graphql-js": "^2.11.5", "neode": "^0.3.7", @@ -111,16 +120,7 @@ "xregexp": "^4.3.0" }, "devDependencies": { - "@babel/cli": "~7.8.4", - "@babel/core": "~7.9.0", - "@babel/node": "~7.8.7", - "@babel/plugin-proposal-throw-expressions": "^7.8.3", - "@babel/preset-env": "~7.9.5", - "@babel/register": "^7.9.0", "apollo-server-testing": "~2.11.0", - "babel-core": "~7.0.0-0", - "babel-eslint": "~10.1.0", - "babel-jest": "~25.2.6", "chai": "~4.2.0", "cucumber": "~6.0.5", "eslint": "~6.8.0", @@ -134,7 +134,7 @@ "eslint-plugin-standard": "~4.0.1", "jest": "~25.3.0", "nodemon": "~2.0.2", - "prettier": "~2.2.0", + "prettier": "~2.3.2", "rosie": "^2.0.1", "supertest": "~4.0.2" }, diff --git a/backend/src/config/index.js b/backend/src/config/index.js index 4acf8e675..f3a8fb63c 100644 --- a/backend/src/config/index.js +++ b/backend/src/config/index.js @@ -40,8 +40,8 @@ const server = { const smtp = { SMTP_HOST: env.SMTP_HOST, SMTP_PORT: env.SMTP_PORT, - SMTP_IGNORE_TLS: env.SMTP_IGNORE_TLS === 'true' || true, - SMTP_SECURE: env.SMTP_IGNORE_TLS === 'true' || false, + SMTP_IGNORE_TLS: env.SMTP_IGNORE_TLS !== 'false', // default = true + SMTP_SECURE: env.SMTP_SECURE === 'true', SMTP_USERNAME: env.SMTP_USERNAME, SMTP_PASSWORD: env.SMTP_PASSWORD, } diff --git a/backend/src/config/links.js b/backend/src/config/links.js index c6f932c82..6b945a5e0 100644 --- a/backend/src/config/links.js +++ b/backend/src/config/links.js @@ -1,7 +1,13 @@ // this file is duplicated in `backend/src/config/links.js` and `webapp/constants/links.js` and replaced on rebranding export default { ORGANIZATION: 'https://ocelot.social', - DONATE: 'https://ocelot-social.herokuapp.com/donations', - FAQ: 'https://ocelot.social', SUPPORT: 'https://ocelot.social', + + // on null or empty strings internal imprint is used, see 'webapp/locales/html/' + DONATE: 'https://ocelot-social.herokuapp.com/donations', // we use 'ocelot-social.herokuapp.com' at the moment, because redirections of 'ocelot.social' subpages are not working correctly + IMPRINT: 'https://ocelot-social.herokuapp.com/imprint', // we use 'ocelot-social.herokuapp.com' at the moment, because redirections of 'ocelot.social' subpages are not working correctly + TERMS_AND_CONDITIONS: null, + CODE_OF_CONDUCT: null, + DATA_PRIVACY: null, + FAQ: 'https://ocelot.social', } diff --git a/backend/src/db/seed.js b/backend/src/db/seed.js index 713a03142..7d9b5e954 100644 --- a/backend/src/db/seed.js +++ b/backend/src/db/seed.js @@ -137,100 +137,93 @@ const languages = ['de', 'en', 'es', 'fr', 'it', 'pt', 'pl'] }), ]) - const [ - peterLustig, - bobDerBaumeister, - jennyRostock, - huey, - dewey, - louie, - dagobert, - ] = await Promise.all([ - Factory.build( - 'user', - { - id: 'u1', - name: 'Peter Lustig', - slug: 'peter-lustig', - role: 'admin', - }, - { - email: 'admin@example.org', - }, - ), - Factory.build( - 'user', - { - id: 'u2', - name: 'Bob der Baumeister', - slug: 'bob-der-baumeister', - role: 'moderator', - }, - { - email: 'moderator@example.org', - }, - ), - Factory.build( - 'user', - { - id: 'u3', - name: 'Jenny Rostock', - slug: 'jenny-rostock', - role: 'user', - }, - { - email: 'user@example.org', - }, - ), - Factory.build( - 'user', - { - id: 'u4', - name: 'Huey', - slug: 'huey', - role: 'user', - }, - { - email: 'huey@example.org', - }, - ), - Factory.build( - 'user', - { - id: 'u5', - name: 'Dewey', - slug: 'dewey', - role: 'user', - }, - { - email: 'dewey@example.org', - }, - ), - Factory.build( - 'user', - { - id: 'u6', - name: 'Louie', - slug: 'louie', - role: 'user', - }, - { - email: 'louie@example.org', - }, - ), - Factory.build( - 'user', - { - id: 'u7', - name: 'Dagobert', - slug: 'dagobert', - role: 'user', - }, - { - email: 'dagobert@example.org', - }, - ), - ]) + const [peterLustig, bobDerBaumeister, jennyRostock, huey, dewey, louie, dagobert] = + await Promise.all([ + Factory.build( + 'user', + { + id: 'u1', + name: 'Peter Lustig', + slug: 'peter-lustig', + role: 'admin', + }, + { + email: 'admin@example.org', + }, + ), + Factory.build( + 'user', + { + id: 'u2', + name: 'Bob der Baumeister', + slug: 'bob-der-baumeister', + role: 'moderator', + }, + { + email: 'moderator@example.org', + }, + ), + Factory.build( + 'user', + { + id: 'u3', + name: 'Jenny Rostock', + slug: 'jenny-rostock', + role: 'user', + }, + { + email: 'user@example.org', + }, + ), + Factory.build( + 'user', + { + id: 'u4', + name: 'Huey', + slug: 'huey', + role: 'user', + }, + { + email: 'huey@example.org', + }, + ), + Factory.build( + 'user', + { + id: 'u5', + name: 'Dewey', + slug: 'dewey', + role: 'user', + }, + { + email: 'dewey@example.org', + }, + ), + Factory.build( + 'user', + { + id: 'u6', + name: 'Louie', + slug: 'louie', + role: 'user', + }, + { + email: 'louie@example.org', + }, + ), + Factory.build( + 'user', + { + id: 'u7', + name: 'Dagobert', + slug: 'dagobert', + role: 'user', + }, + { + email: 'dagobert@example.org', + }, + ), + ]) await Promise.all([ peterLustig.relateTo(Berlin, 'isIn'), @@ -561,7 +554,7 @@ const languages = ['de', 'en', 'es', 'fr', 'it', 'pt', 'pl'] const hashtagAndMention1 = 'The new physics of #QuantenFlussTheorie can explain #QuantumGravity! @peter-lustig got that already. ;-)' const createPostMutation = gql` - mutation($id: ID, $title: String!, $content: String!, $categoryIds: [ID]) { + mutation ($id: ID, $title: String!, $content: String!, $categoryIds: [ID]) { CreatePost(id: $id, title: $title, content: $content, categoryIds: $categoryIds) { id } @@ -618,7 +611,7 @@ const languages = ['de', 'en', 'es', 'fr', 'it', 'pt', 'pl'] const mentionInComment2 = 'Did @peter-lustig tell you?' const createCommentMutation = gql` - mutation($id: ID, $postId: ID!, $content: String!) { + mutation ($id: ID, $postId: ID!, $content: String!) { CreateComment(id: $id, postId: $postId, content: $content) { id } diff --git a/backend/src/middleware/hashtags/hashtagsMiddleware.spec.js b/backend/src/middleware/hashtags/hashtagsMiddleware.spec.js index be9039a6f..613bd6b62 100644 --- a/backend/src/middleware/hashtags/hashtagsMiddleware.spec.js +++ b/backend/src/middleware/hashtags/hashtagsMiddleware.spec.js @@ -13,7 +13,7 @@ const driver = getDriver() const neode = getNeode() const categoryIds = ['cat9'] const createPostMutation = gql` - mutation($id: ID, $title: String!, $postContent: String!, $categoryIds: [ID]!) { + mutation ($id: ID, $title: String!, $postContent: String!, $categoryIds: [ID]!) { CreatePost(id: $id, title: $title, content: $postContent, categoryIds: $categoryIds) { id title @@ -22,7 +22,7 @@ const createPostMutation = gql` } ` const updatePostMutation = gql` - mutation($id: ID!, $title: String!, $postContent: String!, $categoryIds: [ID]!) { + mutation ($id: ID!, $title: String!, $postContent: String!, $categoryIds: [ID]!) { UpdatePost(id: $id, content: $postContent, title: $title, categoryIds: $categoryIds) { title content @@ -95,7 +95,7 @@ describe('hashtags', () => {

` const postWithHastagsQuery = gql` - query($id: ID) { + query ($id: ID) { Post(id: $id) { tags { id diff --git a/backend/src/middleware/languages/languages.spec.js b/backend/src/middleware/languages/languages.spec.js index 1448e4e4b..9bba45c0c 100644 --- a/backend/src/middleware/languages/languages.spec.js +++ b/backend/src/middleware/languages/languages.spec.js @@ -29,7 +29,7 @@ afterAll(async () => { }) const createPostMutation = gql` - mutation($title: String!, $content: String!, $categoryIds: [ID]) { + mutation ($title: String!, $content: String!, $categoryIds: [ID]) { CreatePost(title: $title, content: $content, categoryIds: $categoryIds) { language } diff --git a/backend/src/middleware/notifications/notificationsMiddleware.spec.js b/backend/src/middleware/notifications/notificationsMiddleware.spec.js index af4ed9693..7583a6727 100644 --- a/backend/src/middleware/notifications/notificationsMiddleware.spec.js +++ b/backend/src/middleware/notifications/notificationsMiddleware.spec.js @@ -10,7 +10,7 @@ const driver = getDriver() const neode = getNeode() const categoryIds = ['cat9'] const createPostMutation = gql` - mutation($id: ID, $title: String!, $postContent: String!, $categoryIds: [ID]!) { + mutation ($id: ID, $title: String!, $postContent: String!, $categoryIds: [ID]!) { CreatePost(id: $id, title: $title, content: $postContent, categoryIds: $categoryIds) { id title @@ -19,7 +19,7 @@ const createPostMutation = gql` } ` const updatePostMutation = gql` - mutation($id: ID!, $title: String!, $postContent: String!, $categoryIds: [ID]!) { + mutation ($id: ID!, $title: String!, $postContent: String!, $categoryIds: [ID]!) { UpdatePost(id: $id, content: $postContent, title: $title, categoryIds: $categoryIds) { title content @@ -27,7 +27,7 @@ const updatePostMutation = gql` } ` const createCommentMutation = gql` - mutation($id: ID, $postId: ID!, $commentContent: String!) { + mutation ($id: ID, $postId: ID!, $commentContent: String!) { CreateComment(id: $id, postId: $postId, content: $commentContent) { id content @@ -80,7 +80,7 @@ afterEach(async () => { describe('notifications', () => { const notificationQuery = gql` - query($read: Boolean) { + query ($read: Boolean) { notifications(read: $read, orderBy: updatedAt_desc) { read reason @@ -367,7 +367,7 @@ describe('notifications', () => { describe('if the notification was marked as read earlier', () => { const markAsReadAction = async () => { const mutation = gql` - mutation($id: ID!) { + mutation ($id: ID!) { markAsRead(id: $id) { read } diff --git a/backend/src/middleware/permissionsMiddleware.spec.js b/backend/src/middleware/permissionsMiddleware.spec.js index 8f311e8c2..5fa4a8f01 100644 --- a/backend/src/middleware/permissionsMiddleware.spec.js +++ b/backend/src/middleware/permissionsMiddleware.spec.js @@ -80,7 +80,7 @@ describe('authorization', () => { describe('access email address', () => { const userQuery = gql` - query($name: String) { + query ($name: String) { User(name: $name) { email } @@ -165,7 +165,7 @@ describe('authorization', () => { describe('access Signup', () => { const signupMutation = gql` - mutation($email: String!, $inviteCode: String) { + mutation ($email: String!, $inviteCode: String) { Signup(email: $email, inviteCode: $inviteCode) { email } diff --git a/backend/src/middleware/slugifyMiddleware.spec.js b/backend/src/middleware/slugifyMiddleware.spec.js index 97503851a..1f45c29df 100644 --- a/backend/src/middleware/slugifyMiddleware.spec.js +++ b/backend/src/middleware/slugifyMiddleware.spec.js @@ -54,7 +54,7 @@ describe('slugifyMiddleware', () => { describe('CreatePost', () => { const categoryIds = ['cat9'] const createPostMutation = gql` - mutation($title: String!, $content: String!, $categoryIds: [ID]!, $slug: String) { + mutation ($title: String!, $content: String!, $categoryIds: [ID]!, $slug: String) { CreatePost(title: $title, content: $content, categoryIds: $categoryIds, slug: $slug) { slug } @@ -164,7 +164,7 @@ describe('slugifyMiddleware', () => { describe('SignupVerification', () => { const mutation = gql` - mutation( + mutation ( $password: String! $email: String! $name: String! diff --git a/backend/src/middleware/userInteractions.spec.js b/backend/src/middleware/userInteractions.spec.js index 77c9fbd1d..27bee87c8 100644 --- a/backend/src/middleware/userInteractions.spec.js +++ b/backend/src/middleware/userInteractions.spec.js @@ -10,7 +10,7 @@ const driver = getDriver() const neode = getNeode() const postQuery = gql` - query($id: ID) { + query ($id: ID) { Post(id: $id) { clickedCount } diff --git a/backend/src/middleware/validation/validationMiddleware.spec.js b/backend/src/middleware/validation/validationMiddleware.spec.js index c3d518256..530a80b1e 100644 --- a/backend/src/middleware/validation/validationMiddleware.spec.js +++ b/backend/src/middleware/validation/validationMiddleware.spec.js @@ -17,14 +17,14 @@ let authenticatedUser, commentingUser const createCommentMutation = gql` - mutation($id: ID, $postId: ID!, $content: String!) { + mutation ($id: ID, $postId: ID!, $content: String!) { CreateComment(id: $id, postId: $postId, content: $content) { id } } ` const updateCommentMutation = gql` - mutation($content: String!, $id: ID!) { + mutation ($content: String!, $id: ID!) { UpdateComment(content: $content, id: $id) { id } @@ -32,7 +32,7 @@ const updateCommentMutation = gql` ` const reportMutation = gql` - mutation($resourceId: ID!, $reasonCategory: ReasonCategory!, $reasonDescription: String!) { + mutation ($resourceId: ID!, $reasonCategory: ReasonCategory!, $reasonDescription: String!) { fileReport( resourceId: $resourceId reasonCategory: $reasonCategory @@ -43,7 +43,7 @@ const reportMutation = gql` } ` const reviewMutation = gql` - mutation($resourceId: ID!, $disable: Boolean, $closed: Boolean) { + mutation ($resourceId: ID!, $disable: Boolean, $closed: Boolean) { review(resourceId: $resourceId, disable: $disable, closed: $closed) { createdAt updatedAt @@ -52,7 +52,7 @@ const reviewMutation = gql` ` const updateUserMutation = gql` - mutation($id: ID!, $name: String) { + mutation ($id: ID!, $name: String) { UpdateUser(id: $id, name: $name) { name } diff --git a/backend/src/schema/resolvers/comments.spec.js b/backend/src/schema/resolvers/comments.spec.js index 9f633c8b0..63a5538d0 100644 --- a/backend/src/schema/resolvers/comments.spec.js +++ b/backend/src/schema/resolvers/comments.spec.js @@ -36,7 +36,7 @@ afterEach(async () => { }) const createCommentMutation = gql` - mutation($id: ID, $postId: ID!, $content: String!) { + mutation ($id: ID, $postId: ID!, $content: String!) { CreateComment(id: $id, postId: $postId, content: $content) { id content @@ -128,7 +128,7 @@ describe('CreateComment', () => { describe('UpdateComment', () => { const updateCommentMutation = gql` - mutation($content: String!, $id: ID!) { + mutation ($content: String!, $id: ID!) { UpdateComment(content: $content, id: $id) { id content @@ -220,7 +220,7 @@ describe('UpdateComment', () => { describe('DeleteComment', () => { const deleteCommentMutation = gql` - mutation($id: ID!) { + mutation ($id: ID!) { DeleteComment(id: $id) { id content diff --git a/backend/src/schema/resolvers/donations.spec.js b/backend/src/schema/resolvers/donations.spec.js index ea5ee4e09..5bbbd60e0 100644 --- a/backend/src/schema/resolvers/donations.spec.js +++ b/backend/src/schema/resolvers/donations.spec.js @@ -9,7 +9,7 @@ const instance = getNeode() const driver = getDriver() const updateDonationsMutation = gql` - mutation($goal: Int, $progress: Int) { + mutation ($goal: Int, $progress: Int) { UpdateDonations(goal: $goal, progress: $progress) { id goal diff --git a/backend/src/schema/resolvers/emails.spec.js b/backend/src/schema/resolvers/emails.spec.js index 6b1e24d2b..c5596cc27 100644 --- a/backend/src/schema/resolvers/emails.spec.js +++ b/backend/src/schema/resolvers/emails.spec.js @@ -37,7 +37,7 @@ afterEach(async () => { describe('AddEmailAddress', () => { const mutation = gql` - mutation($email: String!) { + mutation ($email: String!) { AddEmailAddress(email: $email) { email verifiedAt @@ -142,7 +142,7 @@ describe('AddEmailAddress', () => { describe('VerifyEmailAddress', () => { const mutation = gql` - mutation($email: String!, $nonce: String!) { + mutation ($email: String!, $nonce: String!) { VerifyEmailAddress(email: $email, nonce: $nonce) { email createdAt @@ -309,7 +309,7 @@ describe('VerifyNonce', () => { }) const verifyNonceQuery = gql` - query($email: String!, $nonce: String!) { + query ($email: String!, $nonce: String!) { VerifyNonce(email: $email, nonce: $nonce) } ` diff --git a/backend/src/schema/resolvers/embeds.spec.js b/backend/src/schema/resolvers/embeds.spec.js index 6c034acf7..b7ce7ab63 100644 --- a/backend/src/schema/resolvers/embeds.spec.js +++ b/backend/src/schema/resolvers/embeds.spec.js @@ -37,8 +37,7 @@ const babyLovesCatEmbedResponse = new Response( thumbnail_height: 360, provider_url: 'https://www.youtube.com/', thumbnail_width: 480, - html: - '', + html: '', thumbnail_url: 'https://i.ytimg.com/vi/qkdXAtO40Fo/hqdefault.jpg', version: '1.0', author_name: 'Merkley Family', @@ -57,7 +56,7 @@ describe('Query', () => { }) const { query } = createTestClient(server) const embed = gql` - query($url: String!) { + query ($url: String!) { embed(url: $url) { type title @@ -204,8 +203,7 @@ Have all the information for the brand in separate config files. Set these defau video: null, lang: 'de', sources: ['resource', 'oembed'], - html: - '', + html: '', }, }, errors: undefined, diff --git a/backend/src/schema/resolvers/follow.spec.js b/backend/src/schema/resolvers/follow.spec.js index f35795991..6d8db982a 100644 --- a/backend/src/schema/resolvers/follow.spec.js +++ b/backend/src/schema/resolvers/follow.spec.js @@ -16,7 +16,7 @@ let user2 let variables const mutationFollowUser = gql` - mutation($id: ID!) { + mutation ($id: ID!) { followUser(id: $id) { name followedBy { @@ -29,7 +29,7 @@ const mutationFollowUser = gql` ` const mutationUnfollowUser = gql` - mutation($id: ID!) { + mutation ($id: ID!) { unfollowUser(id: $id) { name followedBy { @@ -42,7 +42,7 @@ const mutationUnfollowUser = gql` ` const userQuery = gql` - query($id: ID) { + query ($id: ID) { User(id: $id) { followedBy { id diff --git a/backend/src/schema/resolvers/inviteCodes.spec.js b/backend/src/schema/resolvers/inviteCodes.spec.js index 19f021437..940aa8403 100644 --- a/backend/src/schema/resolvers/inviteCodes.spec.js +++ b/backend/src/schema/resolvers/inviteCodes.spec.js @@ -11,7 +11,7 @@ let mutate const driver = getDriver() const generateInviteCodeMutation = gql` - mutation($expiresAt: String = null) { + mutation ($expiresAt: String = null) { GenerateInviteCode(expiresAt: $expiresAt) { code createdAt @@ -31,7 +31,7 @@ const myInviteCodesQuery = gql` ` const isValidInviteCodeQuery = gql` - query($code: ID!) { + query ($code: ID!) { isValidInviteCode(code: $code) } ` diff --git a/backend/src/schema/resolvers/locations.spec.js b/backend/src/schema/resolvers/locations.spec.js index 34d0f2e9d..fa562cbfd 100644 --- a/backend/src/schema/resolvers/locations.spec.js +++ b/backend/src/schema/resolvers/locations.spec.js @@ -31,7 +31,7 @@ describe('resolvers', () => { describe('custom mutation, not handled by neo4j-graphql-js', () => { let variables const updateUserMutation = gql` - mutation($id: ID!, $name: String) { + mutation ($id: ID!, $name: String) { UpdateUser(id: $id, name: $name) { name location { diff --git a/backend/src/schema/resolvers/moderation.spec.js b/backend/src/schema/resolvers/moderation.spec.js index b62d35ee8..a579c62da 100644 --- a/backend/src/schema/resolvers/moderation.spec.js +++ b/backend/src/schema/resolvers/moderation.spec.js @@ -16,7 +16,7 @@ let mutate, closeReportVariables const reviewMutation = gql` - mutation($resourceId: ID!, $disable: Boolean, $closed: Boolean) { + mutation ($resourceId: ID!, $disable: Boolean, $closed: Boolean) { review(resourceId: $resourceId, disable: $disable, closed: $closed) { createdAt updatedAt diff --git a/backend/src/schema/resolvers/notifications.spec.js b/backend/src/schema/resolvers/notifications.spec.js index 9d7795dd4..f600e7d1c 100644 --- a/backend/src/schema/resolvers/notifications.spec.js +++ b/backend/src/schema/resolvers/notifications.spec.js @@ -139,7 +139,7 @@ describe('given some notifications', () => { describe('notifications', () => { const notificationQuery = gql` - query($read: Boolean, $orderBy: NotificationOrdering) { + query ($read: Boolean, $orderBy: NotificationOrdering) { notifications(read: $read, orderBy: $orderBy) { from { __typename @@ -249,7 +249,7 @@ describe('given some notifications', () => { const deletePostAction = async () => { authenticatedUser = await author.toJson() const deletePostMutation = gql` - mutation($id: ID!) { + mutation ($id: ID!) { DeletePost(id: $id) { id deleted @@ -284,7 +284,7 @@ describe('given some notifications', () => { describe('markAsRead', () => { const markAsReadMutation = gql` - mutation($id: ID!) { + mutation ($id: ID!) { markAsRead(id: $id) { from { __typename diff --git a/backend/src/schema/resolvers/passwordReset.spec.js b/backend/src/schema/resolvers/passwordReset.spec.js index fd1395c57..40a18f5d9 100644 --- a/backend/src/schema/resolvers/passwordReset.spec.js +++ b/backend/src/schema/resolvers/passwordReset.spec.js @@ -55,7 +55,7 @@ describe('passwordReset', () => { describe('requestPasswordReset', () => { const mutation = gql` - mutation($email: String!) { + mutation ($email: String!) { requestPasswordReset(email: $email) } ` @@ -116,7 +116,7 @@ describe('resetPassword', () => { } const mutation = gql` - mutation($nonce: String!, $email: String!, $newPassword: String!) { + mutation ($nonce: String!, $email: String!, $newPassword: String!) { resetPassword(nonce: $nonce, email: $email, newPassword: $newPassword) } ` @@ -196,7 +196,7 @@ describe('resetPassword', () => { it('updates password of the user', async () => { await mutate({ mutation, variables }) const checkLoginMutation = gql` - mutation($email: String!, $password: String!) { + mutation ($email: String!, $password: String!) { login(email: $email, password: $password) } ` diff --git a/backend/src/schema/resolvers/posts.spec.js b/backend/src/schema/resolvers/posts.spec.js index 1317d7c22..20dbecfb6 100644 --- a/backend/src/schema/resolvers/posts.spec.js +++ b/backend/src/schema/resolvers/posts.spec.js @@ -16,7 +16,7 @@ const categoryIds = ['cat9', 'cat4', 'cat15'] let variables const createPostMutation = gql` - mutation($id: ID, $title: String!, $content: String!, $language: String, $categoryIds: [ID]) { + mutation ($id: ID, $title: String!, $content: String!, $language: String, $categoryIds: [ID]) { CreatePost( id: $id title: $title @@ -323,7 +323,7 @@ describe('CreatePost', () => { describe('UpdatePost', () => { let author, newlyCreatedPost const updatePostMutation = gql` - mutation($id: ID!, $title: String!, $content: String!, $image: ImageInput) { + mutation ($id: ID!, $title: String!, $content: String!, $image: ImageInput) { UpdatePost(id: $id, title: $title, content: $content, image: $image) { id title @@ -497,7 +497,7 @@ describe('UpdatePost', () => { describe('pin posts', () => { let author const pinPostMutation = gql` - mutation($id: ID!) { + mutation ($id: ID!) { pinPost(id: $id) { id title @@ -773,7 +773,7 @@ describe('pin posts', () => { it('pinned post appear first even when created before other posts', async () => { const postOrderingQuery = gql` - query($orderBy: [_PostOrdering]) { + query ($orderBy: [_PostOrdering]) { Post(orderBy: $orderBy) { id pinned @@ -816,7 +816,7 @@ describe('pin posts', () => { describe('unpin posts', () => { let pinnedPost const unpinPostMutation = gql` - mutation($id: ID!) { + mutation ($id: ID!) { unpinPost(id: $id) { id title @@ -928,7 +928,7 @@ describe('unpin posts', () => { describe('DeletePost', () => { let author const deletePostMutation = gql` - mutation($id: ID!) { + mutation ($id: ID!) { DeletePost(id: $id) { id deleted @@ -1052,14 +1052,14 @@ describe('DeletePost', () => { describe('emotions', () => { let author, postToEmote const PostsEmotionsCountQuery = gql` - query($id: ID!) { + query ($id: ID!) { Post(id: $id) { emotionsCount } } ` const PostsEmotionsQuery = gql` - query($id: ID!) { + query ($id: ID!) { Post(id: $id) { emotions { emotion @@ -1093,7 +1093,7 @@ describe('emotions', () => { describe('AddPostEmotions', () => { const addPostEmotionsMutation = gql` - mutation($to: _PostInput!, $data: _EMOTEDInput!) { + mutation ($to: _PostInput!, $data: _EMOTEDInput!) { AddPostEmotions(to: $to, data: $data) { from { id @@ -1210,7 +1210,7 @@ describe('emotions', () => { describe('RemovePostEmotions', () => { let removePostEmotionsVariables, postsEmotionsQueryVariables const removePostEmotionsMutation = gql` - mutation($to: _PostInput!, $data: _EMOTEDInput!) { + mutation ($to: _PostInput!, $data: _EMOTEDInput!) { RemovePostEmotions(to: $to, data: $data) { from { id @@ -1309,13 +1309,13 @@ describe('emotions', () => { let PostsEmotionsByCurrentUserVariables const PostsEmotionsCountByEmotionQuery = gql` - query($postId: ID!, $data: _EMOTEDInput!) { + query ($postId: ID!, $data: _EMOTEDInput!) { PostsEmotionsCountByEmotion(postId: $postId, data: $data) } ` const PostsEmotionsByCurrentUserQuery = gql` - query($postId: ID!) { + query ($postId: ID!) { PostsEmotionsByCurrentUser(postId: $postId) } ` diff --git a/backend/src/schema/resolvers/registration.spec.js b/backend/src/schema/resolvers/registration.spec.js index c8b71deb9..25e8fd1c8 100644 --- a/backend/src/schema/resolvers/registration.spec.js +++ b/backend/src/schema/resolvers/registration.spec.js @@ -36,7 +36,7 @@ afterEach(async () => { describe('Signup', () => { const mutation = gql` - mutation($email: String!, $inviteCode: String) { + mutation ($email: String!, $inviteCode: String) { Signup(email: $email, inviteCode: $inviteCode) { email } @@ -145,7 +145,7 @@ describe('Signup', () => { describe('SignupVerification', () => { const mutation = gql` - mutation( + mutation ( $name: String! $password: String! $email: String! diff --git a/backend/src/schema/resolvers/reports.spec.js b/backend/src/schema/resolvers/reports.spec.js index 2ecccfc23..1208db7fe 100644 --- a/backend/src/schema/resolvers/reports.spec.js +++ b/backend/src/schema/resolvers/reports.spec.js @@ -11,7 +11,7 @@ describe('file a report on a resource', () => { let authenticatedUser, currentUser, mutate, query, moderator, abusiveUser, otherReportingUser const categoryIds = ['cat9'] const fileReportMutation = gql` - mutation($resourceId: ID!, $reasonCategory: ReasonCategory!, $reasonDescription: String!) { + mutation ($resourceId: ID!, $reasonCategory: ReasonCategory!, $reasonDescription: String!) { fileReport( resourceId: $resourceId reasonCategory: $reasonCategory @@ -42,7 +42,7 @@ describe('file a report on a resource', () => { reasonDescription: 'Violates code of conduct !!!', } const reportsQuery = gql` - query($closed: Boolean) { + query ($closed: Boolean) { reports(orderBy: createdAt_desc, closed: $closed) { id createdAt @@ -74,7 +74,7 @@ describe('file a report on a resource', () => { } ` const reviewMutation = gql` - mutation($resourceId: ID!, $disable: Boolean, $closed: Boolean) { + mutation ($resourceId: ID!, $disable: Boolean, $closed: Boolean) { review(resourceId: $resourceId, disable: $disable, closed: $closed) { createdAt resource { diff --git a/backend/src/schema/resolvers/rewards.spec.js b/backend/src/schema/resolvers/rewards.spec.js index eaaa852ec..0f76e1ed1 100644 --- a/backend/src/schema/resolvers/rewards.spec.js +++ b/backend/src/schema/resolvers/rewards.spec.js @@ -76,7 +76,7 @@ describe('rewards', () => { describe('reward', () => { const rewardMutation = gql` - mutation($from: ID!, $to: ID!) { + mutation ($from: ID!, $to: ID!) { reward(badgeKey: $from, userId: $to) { id badges { @@ -266,7 +266,7 @@ describe('rewards', () => { } const unrewardMutation = gql` - mutation($from: ID!, $to: ID!) { + mutation ($from: ID!, $to: ID!) { unreward(badgeKey: $from, userId: $to) { id badges { diff --git a/backend/src/schema/resolvers/searches.spec.js b/backend/src/schema/resolvers/searches.spec.js index a859bf296..ceb63304e 100644 --- a/backend/src/schema/resolvers/searches.spec.js +++ b/backend/src/schema/resolvers/searches.spec.js @@ -28,7 +28,7 @@ afterAll(async () => { }) const searchQuery = gql` - query($query: String!) { + query ($query: String!) { searchResults(query: $query, limit: 5) { __typename ... on Post { @@ -49,7 +49,7 @@ const searchQuery = gql` ` const searchPostQuery = gql` - query($query: String!, $firstPosts: Int, $postsOffset: Int) { + query ($query: String!, $firstPosts: Int, $postsOffset: Int) { searchPosts(query: $query, firstPosts: $firstPosts, postsOffset: $postsOffset) { postCount posts { diff --git a/backend/src/schema/resolvers/shout.spec.js b/backend/src/schema/resolvers/shout.spec.js index 574907180..383bd83f0 100644 --- a/backend/src/schema/resolvers/shout.spec.js +++ b/backend/src/schema/resolvers/shout.spec.js @@ -9,17 +9,17 @@ const instance = getNeode() const driver = getDriver() const mutationShoutPost = gql` - mutation($id: ID!) { + mutation ($id: ID!) { shout(id: $id, type: Post) } ` const mutationUnshoutPost = gql` - mutation($id: ID!) { + mutation ($id: ID!) { unshout(id: $id, type: Post) } ` const queryPost = gql` - query($id: ID!) { + query ($id: ID!) { Post(id: $id) { id shoutedBy { diff --git a/backend/src/schema/resolvers/socialMedia.spec.js b/backend/src/schema/resolvers/socialMedia.spec.js index 898174199..cff20185b 100644 --- a/backend/src/schema/resolvers/socialMedia.spec.js +++ b/backend/src/schema/resolvers/socialMedia.spec.js @@ -70,7 +70,7 @@ describe('SocialMedia', () => { beforeEach(() => { mutation = gql` - mutation($url: String!) { + mutation ($url: String!) { CreateSocialMedia(url: $url) { id url @@ -131,7 +131,7 @@ describe('SocialMedia', () => { describe('ownedBy', () => { beforeEach(() => { mutation = gql` - mutation($url: String!) { + mutation ($url: String!) { CreateSocialMedia(url: $url) { url ownedBy { @@ -162,7 +162,7 @@ describe('SocialMedia', () => { const socialMedia = await setUpSocialMedia() mutation = gql` - mutation($id: ID!, $url: String!) { + mutation ($id: ID!, $url: String!) { UpdateSocialMedia(id: $id, url: $url) { id url @@ -225,7 +225,7 @@ describe('SocialMedia', () => { const socialMedia = await setUpSocialMedia() mutation = gql` - mutation($id: ID!) { + mutation ($id: ID!) { DeleteSocialMedia(id: $id) { id url diff --git a/backend/src/schema/resolvers/userData.spec.js b/backend/src/schema/resolvers/userData.spec.js index 972248d50..0a4e54295 100644 --- a/backend/src/schema/resolvers/userData.spec.js +++ b/backend/src/schema/resolvers/userData.spec.js @@ -39,7 +39,7 @@ afterAll(async () => { }) const userDataQuery = gql` - query($id: ID!) { + query ($id: ID!) { userData(id: $id) { user { id diff --git a/backend/src/schema/resolvers/user_management.spec.js b/backend/src/schema/resolvers/user_management.spec.js index b434ea628..57fe4a7f4 100644 --- a/backend/src/schema/resolvers/user_management.spec.js +++ b/backend/src/schema/resolvers/user_management.spec.js @@ -171,7 +171,7 @@ describe('currentUser', () => { describe('login', () => { const loginMutation = gql` - mutation($email: String!, $password: String!) { + mutation ($email: String!, $password: String!) { login(email: $email, password: $password) } ` @@ -287,7 +287,7 @@ describe('login', () => { describe('change password', () => { const changePasswordMutation = gql` - mutation($oldPassword: String!, $newPassword: String!) { + mutation ($oldPassword: String!, $newPassword: String!) { changePassword(oldPassword: $oldPassword, newPassword: $newPassword) } ` diff --git a/backend/src/schema/resolvers/users.spec.js b/backend/src/schema/resolvers/users.spec.js index e5e818040..6fd893240 100644 --- a/backend/src/schema/resolvers/users.spec.js +++ b/backend/src/schema/resolvers/users.spec.js @@ -17,7 +17,7 @@ const driver = getDriver() const neode = getNeode() const deleteUserMutation = gql` - mutation($id: ID!, $resource: [Deletable]) { + mutation ($id: ID!, $resource: [Deletable]) { DeleteUser(id: $id, resource: $resource) { id name @@ -46,7 +46,7 @@ const deleteUserMutation = gql` ` const switchUserRoleMutation = gql` - mutation($role: UserGroup!, $id: ID!) { + mutation ($role: UserGroup!, $id: ID!) { switchUserRole(role: $role, id: $id) { name role @@ -81,7 +81,7 @@ describe('User', () => { beforeEach(async () => { userQuery = gql` - query($email: String) { + query ($email: String) { User(email: $email) { name } @@ -144,7 +144,7 @@ describe('UpdateUser', () => { beforeEach(async () => { updateUserMutation = gql` - mutation( + mutation ( $id: ID! $name: String $termsAndConditionsAgreedVersion: String diff --git a/backend/src/schema/resolvers/users/location.spec.js b/backend/src/schema/resolvers/users/location.spec.js index 1ef427034..c966fe720 100644 --- a/backend/src/schema/resolvers/users/location.spec.js +++ b/backend/src/schema/resolvers/users/location.spec.js @@ -9,7 +9,7 @@ const driver = getDriver() let authenticatedUser, mutate, query, variables const updateUserMutation = gql` - mutation($id: ID!, $name: String!, $locationName: String) { + mutation ($id: ID!, $name: String!, $locationName: String) { UpdateUser(id: $id, name: $name, locationName: $locationName) { locationName } @@ -17,7 +17,7 @@ const updateUserMutation = gql` ` const queryLocations = gql` - query($place: String!, $lang: String!) { + query ($place: String!, $lang: String!) { queryLocations(place: $place, lang: $lang) { place_name id diff --git a/backend/src/schema/resolvers/users/mutedUsers.spec.js b/backend/src/schema/resolvers/users/mutedUsers.spec.js index 345b435f5..c86cf2eb1 100644 --- a/backend/src/schema/resolvers/users/mutedUsers.spec.js +++ b/backend/src/schema/resolvers/users/mutedUsers.spec.js @@ -93,7 +93,7 @@ describe('muteUser', () => { muteAction = (variables) => { const { mutate } = createTestClient(server) const muteUserMutation = gql` - mutation($id: ID!) { + mutation ($id: ID!) { muteUser(id: $id) { id name @@ -310,7 +310,7 @@ describe('unmuteUser', () => { unmuteAction = (variables) => { const { mutate } = createTestClient(server) const unmuteUserMutation = gql` - mutation($id: ID!) { + mutation ($id: ID!) { unmuteUser(id: $id) { id name diff --git a/backend/src/schema/resolvers/viewedTeaserCount.spec.js b/backend/src/schema/resolvers/viewedTeaserCount.spec.js index c81e272ec..ceb95c0ed 100644 --- a/backend/src/schema/resolvers/viewedTeaserCount.spec.js +++ b/backend/src/schema/resolvers/viewedTeaserCount.spec.js @@ -32,7 +32,7 @@ afterAll(async () => { describe('count post teaser views', () => { let aUser, bUser const markTeaserAsViewed = gql` - mutation($id: ID!) { + mutation ($id: ID!) { markTeaserAsViewed(id: $id) { id viewedTeaserCount diff --git a/backend/yarn.lock b/backend/yarn.lock index 7d6558da0..021738956 100644 --- a/backend/yarn.lock +++ b/backend/yarn.lock @@ -910,6 +910,13 @@ dependencies: regenerator-runtime "^0.13.4" +"@babel/runtime@^7.9.2": + version "7.12.5" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.12.5.tgz#410e7e487441e1b360c29be715d870d9b985882e" + integrity sha512-plcc+hbExy3McchJCEQG3knOsuh3HH+Prx1P6cLIkET/0dLuQDEnrT+s27Axgc9bqfsmNUNHfscgMUdBpC9xfg== + dependencies: + regenerator-runtime "^0.13.4" + "@babel/template@^7.7.4", "@babel/template@^7.8.3", "@babel/template@^7.8.6": version "7.8.6" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.8.6.tgz#86b22af15f828dfb086474f964dcc3e39c43ce2b" @@ -956,32 +963,32 @@ exec-sh "^0.3.2" minimist "^1.2.0" -"@graphql-toolkit/common@0.9.12": - version "0.9.12" - resolved "https://registry.yarnpkg.com/@graphql-toolkit/common/-/common-0.9.12.tgz#a3bf91d00130100cfa0a72be718b16cc1011ab45" - integrity sha512-NjBVxeM1GB0bldiBm4UQoxKtbu/hjRfcqDEt1JPia+uXgFde3qTxtF5IZkworRFNCp+8KPSVrwcreQHSfFW63w== +"@graphql-toolkit/common@0.10.4": + version "0.10.4" + resolved "https://registry.yarnpkg.com/@graphql-toolkit/common/-/common-0.10.4.tgz#7785f2a3f14559d0778859c49f4442078c196695" + integrity sha512-HQ3HaxCqX+UE8y/0h7LMDBBGSIKJxY/gaQesaksvE2Y+N4NpSWdiW6HpOcgXfC2HGf9yM0hEdsERzzL8z3mbHQ== dependencies: aggregate-error "3.0.1" camel-case "4.1.1" - graphql-tools-fork "9.0.1" + graphql-tools "5.0.0" lodash "4.17.15" -"@graphql-toolkit/file-loading@0.9.12": - version "0.9.12" - resolved "https://registry.yarnpkg.com/@graphql-toolkit/file-loading/-/file-loading-0.9.12.tgz#f7d5d7e042df59c4e6c8fe3417c67dd1cddf9043" - integrity sha512-xEmKkbWI5FXQARTN3dbPzshwcmduOJUvx1QGsfcuryVDdQJZynUEaPF7IxYaFpvQF7vwxGIRdff/jC/a5ypDrA== +"@graphql-toolkit/file-loading@0.10.4": + version "0.10.4" + resolved "https://registry.yarnpkg.com/@graphql-toolkit/file-loading/-/file-loading-0.10.4.tgz#50e8933e44b17853544c1fe63350df93f33a5e80" + integrity sha512-oUmy/sO3BJfax85pVKI7FZ6TWrViNuWXoJkRM293YV9bKGuYU9TgqZoHyM+oEqWO5ruXCL/nCdw3cIBau+rSNA== dependencies: globby "11.0.0" unixify "1.0.0" -"@graphql-toolkit/schema-merging@0.9.12": - version "0.9.12" - resolved "https://registry.yarnpkg.com/@graphql-toolkit/schema-merging/-/schema-merging-0.9.12.tgz#f058a7d256a4ed0e61e9874f90ae03326b81668e" - integrity sha512-ciqxLeMw7KPbJcq/xgnPbGyJGRO6bO1zQcdWCUSssyw8VDRHj5PFqEOAzT88eZQkEtg3qLN/wQEypeyFyNTHzw== +"@graphql-toolkit/schema-merging@0.10.4": + version "0.10.4" + resolved "https://registry.yarnpkg.com/@graphql-toolkit/schema-merging/-/schema-merging-0.10.4.tgz#2428590a531a33e9fe03be27cce9030f1c4c044b" + integrity sha512-naL6reYBuILLMrkMfKz0lOLL0kl6gGYnaaywnO/Dgp9F4NeAxDdAs5CV6Fy9NO5OzePFP58Dnc4sh2RyYrrFJg== dependencies: - "@graphql-toolkit/common" "0.9.12" + "@graphql-toolkit/common" "0.10.4" deepmerge "4.2.2" - graphql-tools-fork "9.0.1" + graphql-tools "5.0.0" tslib "1.11.1" "@hapi/address@2.x.x": @@ -2036,7 +2043,7 @@ apollo-link-context@~1.0.20: apollo-link "^1.2.14" tslib "^1.9.3" -apollo-link-http-common@^0.2.15, apollo-link-http-common@^0.2.16: +apollo-link-http-common@^0.2.14, apollo-link-http-common@^0.2.16: version "0.2.16" resolved "https://registry.yarnpkg.com/apollo-link-http-common/-/apollo-link-http-common-0.2.16.tgz#756749dafc732792c8ca0923f9a40564b7c59ecc" integrity sha512-2tIhOIrnaF4UbQHf7kjeQA/EmSorB7+HyJIIrUjJOKBgnXwuexi8aMecRlqTIDWcyVXCeqLhUnztMa6bOH/jTg== @@ -2054,7 +2061,7 @@ apollo-link-http@~1.5.17: apollo-link-http-common "^0.2.16" tslib "^1.9.3" -apollo-link@^1.0.0, apollo-link@^1.2.13, apollo-link@^1.2.14: +apollo-link@^1.0.0, apollo-link@^1.2.12, apollo-link@^1.2.14: version "1.2.14" resolved "https://registry.yarnpkg.com/apollo-link/-/apollo-link-1.2.14.tgz#3feda4b47f9ebba7f4160bef8b977ba725b684d9" integrity sha512-p67CMEFP7kOG1JZ0ZkYZwRDa369w5PIjtMjvrQd/HnIV8FRsHRqLqK+oAZQnFa1DDdZtOtHTi+aMIW6EatC2jg== @@ -2211,6 +2218,16 @@ apollo-tracing@^0.12.0: apollo-server-env "^2.4.5" apollo-server-plugin-base "^0.10.2" +apollo-upload-client@^13.0.0: + version "13.0.0" + resolved "https://registry.yarnpkg.com/apollo-upload-client/-/apollo-upload-client-13.0.0.tgz#146d1ddd85d711fcac8ca97a72d3ca6787f2b71b" + integrity sha512-lJ9/bk1BH1lD15WhWRha2J3+LrXrPIX5LP5EwiOUHv8PCORp4EUrcujrA3rI5hZeZygrTX8bshcuMdpqpSrvtA== + dependencies: + "@babel/runtime" "^7.9.2" + apollo-link "^1.2.12" + apollo-link-http-common "^0.2.14" + extract-files "^8.0.0" + apollo-utilities@1.3.3, apollo-utilities@^1.3.3: version "1.3.3" resolved "https://registry.yarnpkg.com/apollo-utilities/-/apollo-utilities-1.3.3.tgz#f1854715a7be80cd810bc3ac95df085815c0787c" @@ -3392,10 +3409,10 @@ data-urls@^1.1.0: whatwg-mimetype "^2.2.0" whatwg-url "^7.0.0" -date-fns@2.11.1: - version "2.11.1" - resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.11.1.tgz#197b8be1bbf5c5e6fe8bea817f0fe111820e7a12" - integrity sha512-3RdUoinZ43URd2MJcquzBbDQo+J87cSzB8NkXdZiN5ia1UNyep0oCyitfiL88+R7clGTeq/RniXAc16gWyAu1w== +date-fns@2.22.1: + version "2.22.1" + resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.22.1.tgz#1e5af959831ebb1d82992bf67b765052d8f0efc4" + integrity sha512-yUFPQjrxEmIsMqlHhAhmxkuH769baF21Kk+nZwZGyrMoyLA+LugaQtC0+Tqf9CBUUULWwUJt6Q5ySI3LJDDCGg== dateformat@^3.0.3: version "3.0.3" @@ -4299,10 +4316,10 @@ extglob@^2.0.4: snapdragon "^0.8.1" to-regex "^3.0.1" -extract-files@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/extract-files/-/extract-files-7.0.0.tgz#3dc7853320ff7876ec62d6e98f2f4e6f3e6282f6" - integrity sha512-3AUlT7TD+DbQXNe3t70QrgJU6Wgcp7rk1Zm0vqWz8OYnw4vxihgG0TgZ2SIGrVqScc4WfOu7B4a0BezGJ0YqvQ== +extract-files@^8.0.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/extract-files/-/extract-files-8.1.0.tgz#46a0690d0fe77411a2e3804852adeaa65cd59288" + integrity sha512-PTGtfthZK79WUMk+avLmwx3NGdU8+iVFXC2NMGxKsn0MnihOG2lvumj+AZo8CTwTrwjXDgZ5tztbRlEdRjBonQ== extsprintf@1.3.0: version "1.3.0" @@ -4849,19 +4866,19 @@ graphql-tag@^2.9.2, graphql-tag@~2.10.3: resolved "https://registry.yarnpkg.com/graphql-tag/-/graphql-tag-2.10.3.tgz#ea1baba5eb8fc6339e4c4cf049dabe522b0edf03" integrity sha512-4FOv3ZKfA4WdOKJeHdz6B3F/vxBLSgmBcGeAFPf4n1F64ltJUvOOerNj0rsJxONQGdhUMynQIvd6LzB+1J5oKA== -graphql-tools-fork@9.0.1: - version "9.0.1" - resolved "https://registry.yarnpkg.com/graphql-tools-fork/-/graphql-tools-fork-9.0.1.tgz#fc8df40c108bdba3268999dea355cc614c765038" - integrity sha512-kM6mUNVekgnWKtVqLGQ9HvQqQ3zZVPZRg1esltBoohsbUMaChl+9QkjBjoMxnZPnbTGOOGGagopNBQALIBysNg== +graphql-tools@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/graphql-tools/-/graphql-tools-5.0.0.tgz#67281c834a0e29f458adba8018f424816fa627e9" + integrity sha512-5zn3vtn//382b7G3Wzz3d5q/sh+f7tVrnxeuhTMTJ7pWJijNqLxH7VEzv8VwXCq19zAzHYEosFHfXiK7qzvk7w== dependencies: - apollo-link "^1.2.13" - apollo-link-http-common "^0.2.15" + apollo-link "^1.2.14" + apollo-upload-client "^13.0.0" deprecated-decorator "^0.1.6" - extract-files "^7.0.0" form-data "^3.0.0" iterall "^1.3.0" node-fetch "^2.6.0" - uuid "^7.0.2" + tslib "^1.11.1" + uuid "^7.0.3" graphql-tools@^4.0.0, graphql-tools@^4.0.4, graphql-tools@^4.0.5: version "4.0.8" @@ -6606,13 +6623,13 @@ merge-descriptors@1.0.1: resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= -merge-graphql-schemas@^1.7.7: - version "1.7.7" - resolved "https://registry.yarnpkg.com/merge-graphql-schemas/-/merge-graphql-schemas-1.7.7.tgz#673898f97c384d88fd66e49359b2f604e5864441" - integrity sha512-3mjFHXpsF+bnsnSy/FlZiWCcNo7AULuG8kEBE+YVX8qbzNrEPJVhSg7ANr5LjQZbGtSlTz7fa3Wqw0bfbQ5R5Q== +merge-graphql-schemas@^1.7.8: + version "1.7.8" + resolved "https://registry.yarnpkg.com/merge-graphql-schemas/-/merge-graphql-schemas-1.7.8.tgz#11a0a672a38a61d988c09ffdebe1bd4f8418de48" + integrity sha512-C3EJ1i86OjmbcCT524wVPRl17M5VZzgyh9kIGYAlYnAILX+7xfh8cCbMKfehh9n4opZg6CtcPogCiVZ6PB2NyQ== dependencies: - "@graphql-toolkit/file-loading" "0.9.12" - "@graphql-toolkit/schema-merging" "0.9.12" + "@graphql-toolkit/file-loading" "0.10.4" + "@graphql-toolkit/schema-merging" "0.10.4" tslib "1.11.1" merge-stream@^2.0.0: @@ -6942,10 +6959,10 @@ ms@^2.1.1: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== -mustache@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/mustache/-/mustache-4.0.1.tgz#d99beb031701ad433338e7ea65e0489416c854a2" - integrity sha512-yL5VE97+OXn4+Er3THSmTdCFCtx5hHWzrolvH+JObZnUYwuaG7XV+Ch4fR2cIrcYI0tFHxS7iyFYl14bW8y2sA== +mustache@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/mustache/-/mustache-4.2.0.tgz#e5892324d60a12ec9c2a73359edca52972bf6f64" + integrity sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ== mute-stream@0.0.8: version "0.0.8" @@ -7816,10 +7833,10 @@ prettier-linter-helpers@^1.0.0: dependencies: fast-diff "^1.1.2" -prettier@~2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.2.0.tgz#8a03c7777883b29b37fb2c4348c66a78e980418b" - integrity sha512-yYerpkvseM4iKD/BXLYUkQV5aKt4tQPqaGW6EsZjzyu0r7sVZZNPJW4Y8MyKmicp6t42XUPcBVA+H6sB3gqndw== +prettier@~2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.3.2.tgz#ef280a05ec253712e486233db5c6f23441e7342d" + integrity sha512-lnJzDfJ66zkMy58OL5/NY5zp70S7Nz6KqcKkXYzn2tMVrNxvbqaBpg7H3qHaLxCJ5lNMsGuM8+ohS7cZrthdLQ== pretty-format@^25.3.0: version "25.3.0" @@ -9406,15 +9423,15 @@ ts-invariant@^0.4.0: dependencies: tslib "^1.9.3" -tslib@1.11.1, tslib@^1.9.0: +tslib@1.11.1: version "1.11.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.11.1.tgz#eb15d128827fbee2841549e171f45ed338ac7e35" integrity sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA== -tslib@^1.10.0, tslib@^1.9.3: - version "1.13.0" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.13.0.tgz#c881e13cc7015894ed914862d276436fa9a47043" - integrity sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q== +tslib@^1.10.0, tslib@^1.11.1, tslib@^1.9.0, tslib@^1.9.3: + version "1.14.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== tunnel-agent@^0.6.0: version "0.6.0" @@ -9689,7 +9706,7 @@ uuid@^3.1.0, uuid@^3.3.2: resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== -uuid@^7.0.2: +uuid@^7.0.3: version "7.0.3" resolved "https://registry.yarnpkg.com/uuid/-/uuid-7.0.3.tgz#c5c9f2c8cf25dc0a372c4df1441c41f5bd0c680b" integrity sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg== @@ -9972,9 +9989,9 @@ xtend@^4.0.1: integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== y18n@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" - integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== + version "4.0.3" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf" + integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ== yallist@^2.1.2: version "2.1.2" @@ -9997,9 +10014,9 @@ yallist@^4.0.0: integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== yargs-parser@^18.1.1: - version "18.1.1" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.1.tgz#bf7407b915427fc760fcbbccc6c82b4f0ffcbd37" - integrity sha512-KRHEsOM16IX7XuLnMOqImcPNbLVXMNHYAoFc3BKR8Ortl5gzDbtXvvEoGx9imk5E+X1VeNKNlcHr8B8vi+7ipA== + version "18.1.3" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0" + integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ== dependencies: camelcase "^5.0.0" decamelize "^1.2.0" diff --git a/docker-compose.override.yml b/docker-compose.override.yml index 8d1bb96f2..5fceb2776 100644 --- a/docker-compose.override.yml +++ b/docker-compose.override.yml @@ -18,7 +18,6 @@ services: - webapp_node_modules:/app/node_modules # bind the local folder to the docker to allow live reload - ./webapp:/app - ######################################################## # BACKEND ############################################## ######################################################## @@ -35,7 +34,6 @@ services: - backend_node_modules:/app/node_modules # bind the local folder to the docker to allow live reload - ./backend:/app - ######################################################## # NEO4J ################################################ ######################################################## @@ -47,13 +45,11 @@ services: networks: # So we can access the neo4j query browser from our host machine - external-net - ######################################################## # MAINTENANCE ########################################## ######################################################## maintenance: image: ocelotsocialnetwork/maintenance:development - ######################################################## # MAILSERVER TO FAKE SMTP ############################## ######################################################## @@ -63,6 +59,7 @@ services: - 1080:80 networks: - external-net + volumes: webapp_node_modules: backend_node_modules: diff --git a/docker-compose.test.yml b/docker-compose.test.yml index eef71e67b..973cf87cf 100644 --- a/docker-compose.test.yml +++ b/docker-compose.test.yml @@ -12,7 +12,6 @@ services: - NODE_ENV="test" volumes: - ./coverage:/app/coverage - ######################################################## # BACKEND ############################################## ######################################################## @@ -24,7 +23,6 @@ services: - NODE_ENV="test" volumes: - ./coverage:/app/coverage - ######################################################## # NEO4J ################################################ ######################################################## @@ -41,13 +39,11 @@ services: networks: # So we can access the neo4j query browser from our host machine - external-net - ######################################################## # MAINTENANCE ########################################## ######################################################## maintenance: image: ocelotsocialnetwork/maintenance:test - ######################################################## # MAILSERVER TO FAKE SMTP ############################## ######################################################## @@ -57,6 +53,7 @@ services: - 1080:80 networks: - external-net + volumes: webapp_node_modules: backend_node_modules: diff --git a/docker-compose.yml b/docker-compose.yml index 392447f61..d20bb6aec 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -35,7 +35,6 @@ services: - GRAPHQL_URI=http://backend:4000 env_file: - ./webapp/.env - ######################################################## # BACKEND ############################################## ######################################################## @@ -68,7 +67,6 @@ services: - CLIENT_URI=http://webapp:3000 env_file: - ./backend/.env - ######################################################## # NEO4J ################################################ ######################################################## @@ -92,7 +90,6 @@ services: # TODO: clarify if that is the only thing needed to unlock the Enterprise version # - NEO4J_ACCEPT_LICENSE_AGREEMENT=yes # TODO: Remove the playground from production - ######################################################## # MAINTENANCE ########################################## ######################################################## diff --git a/package.json b/package.json index 8edeff972..077da6f36 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ocelot-social", - "version": "1.0.3", + "version": "1.0.4", "description": "Fullstack and API tests with cypress and cucumber for ocelot.social", "author": "ocelot.social Community", "license": "MIT", @@ -28,26 +28,27 @@ "auto-changelog": "^2.2.1", "bcryptjs": "^2.4.3", "codecov": "^3.7.1", - "cross-env": "^7.0.2", + "cross-env": "^7.0.3", "cucumber": "^6.0.5", "cypress": "^7.0.1", "cypress-cucumber-preprocessor": "^2.2.1", "cypress-file-upload": "^3.5.3", - "date-fns": "^2.12.0", + "date-fns": "^2.22.1", "dotenv": "^8.2.0", "expect": "^25.3.0", "faker": "Marak/faker.js#master", - "graphql-request": "^1.8.2", + "graphql-request": "^2.0.0", "import": "^0.0.6", "jsonwebtoken": "^8.5.1", "mock-socket": "^9.0.3", "neo4j-driver": "^4.0.2", - "neode": "^0.3.7", + "neode": "^0.4.7", "npm-run-all": "^4.1.5", "rosie": "^2.0.1", "slug": "^2.1.1" }, "resolutions": { "set-value": "^2.0.1" - } + }, + "dependencies": {} } diff --git a/webapp/Dockerfile b/webapp/Dockerfile index 75d43bf59..8d830a9d5 100644 --- a/webapp/Dockerfile +++ b/webapp/Dockerfile @@ -1,5 +1,5 @@ ################################################################################## -# BASE ########################################################################### +# BASE (Is pushed to DockerHub for rebranding) ################################### ################################################################################## FROM node:12.19.0-alpine3.10 as base @@ -59,12 +59,18 @@ FROM base as development CMD /bin/sh -c "yarn install && yarn run dev" ################################################################################## -# BUILD (Does contain all files and is therefore bloated) ######################## +# CODE (Does contain all code files and is pushed to DockerHub for rebranding) ### ################################################################################## -FROM base as build +FROM base as code -# Copy everything +# copy everything, but do not build. COPY . . + +################################################################################## +# BUILD (Does contain all files and the compilate and is therefore bloated) ###### +################################################################################## +FROM code as build + # yarn install RUN yarn install --production=false --frozen-lockfile --non-interactive # yarn build @@ -83,18 +89,13 @@ CMD /bin/sh -c "yarn run dev" ################################################################################## FROM base as production +# TODO - do all copying with one COPY command to have one layer # Copy "binary"-files from build image COPY --from=build ${DOCKER_WORKDIR}/.nuxt ./.nuxt COPY --from=build ${DOCKER_WORKDIR}/node_modules ./node_modules COPY --from=build ${DOCKER_WORKDIR}/nuxt.config.js ./nuxt.config.js -# Copy static files -# TODO - this should be one Folder containign all stuff needed to be copied -COPY --from=build ${DOCKER_WORKDIR}/config/ ./config/ -COPY --from=build ${DOCKER_WORKDIR}/constants ./constants -COPY --from=build ${DOCKER_WORKDIR}/static ./static -COPY --from=build ${DOCKER_WORKDIR}/locales ./locales # Copy package.json for script definitions (lock file should not be needed) COPY --from=build ${DOCKER_WORKDIR}/package.json ./package.json # Run command -CMD /bin/sh -c "yarn run start" \ No newline at end of file +CMD /bin/sh -c "yarn run start" diff --git a/webapp/Dockerfile.maintenance b/webapp/Dockerfile.maintenance index 0a7616240..dcc06ad61 100644 --- a/webapp/Dockerfile.maintenance +++ b/webapp/Dockerfile.maintenance @@ -48,11 +48,12 @@ WORKDIR ${DOCKER_WORKDIR} CMD ["yarn", "run", "start"] ################################################################################## -# BUILD ### TODO # TODO # TODO # TODO # TODO # TODO # TODO # TODO # TODO # TODO ## +# CODE (Does contain all code files and is pushed to DockerHub for rebranding) ### ################################################################################## -FROM base as build +FROM base as code COPY package.json yarn.lock ./ +# yarn install RUN yarn install --production=false --frozen-lockfile --non-interactive COPY assets assets @@ -67,10 +68,17 @@ COPY constants constants COPY nuxt.config.js nuxt.config.js COPY config/ config/ +# this is needed in rebranding +COPY maintenance/nginx maintenance/nginx # this will also ovewrite the existing package.json COPY maintenance/source ./ +################################################################################## +# BUILD ### TODO # TODO # TODO # TODO # TODO # TODO # TODO # TODO # TODO # TODO ## +################################################################################## +FROM code as build +# yarn generate RUN yarn run generate ################################################################################## diff --git a/webapp/components/Editor/MenuBar.vue b/webapp/components/Editor/MenuBar.vue index 3756e1ae2..b64cf779e 100644 --- a/webapp/components/Editor/MenuBar.vue +++ b/webapp/components/Editor/MenuBar.vue @@ -59,6 +59,8 @@ :onClick="commands.horizontal_rule" icon="minus" /> + + @@ -66,11 +68,13 @@ + + diff --git a/webapp/components/Editor/MenuBarButton.vue b/webapp/components/Editor/MenuBarButton.vue index 2543352ca..e4f11e46d 100644 --- a/webapp/components/Editor/MenuBarButton.vue +++ b/webapp/components/Editor/MenuBarButton.vue @@ -10,7 +10,7 @@ export default { isActive: Boolean, icon: String, label: String, - onClick: Function, + onClick: { type: Function, default: () => {} }, }, } diff --git a/webapp/components/Editor/MenuLegend.vue b/webapp/components/Editor/MenuLegend.vue new file mode 100644 index 000000000..afc137b1f --- /dev/null +++ b/webapp/components/Editor/MenuLegend.vue @@ -0,0 +1,115 @@ + + + + + diff --git a/webapp/components/PageFooter/PageFooter.spec.js b/webapp/components/PageFooter/PageFooter.spec.js index 0edc0fed2..53aaaa073 100644 --- a/webapp/components/PageFooter/PageFooter.spec.js +++ b/webapp/components/PageFooter/PageFooter.spec.js @@ -1,6 +1,6 @@ import { config, mount } from '@vue/test-utils' import PageFooter from './PageFooter.vue' -import links from '~/constants/links.js' +import linksDefault from '~/constants/links.js' const localVue = global.localVue @@ -8,6 +8,7 @@ config.stubs['nuxt-link'] = '' describe('PageFooter.vue', () => { let mocks + let wrapper beforeEach(() => { mocks = { @@ -15,30 +16,118 @@ describe('PageFooter.vue', () => { $env: { VERSION: 'v1.0.0', }, - links, } }) describe('mount', () => { - let wrapper const Wrapper = () => { return mount(PageFooter, { mocks, localVue }) } - beforeEach(() => { - wrapper = Wrapper() + describe('links.js', () => { + beforeEach(() => { + wrapper = Wrapper() + }) + + it('renders four links', () => { + expect(wrapper.findAll('a')).toHaveLength(4) + }) + + it('renders three nuxt-links', () => { + expect(wrapper.findAll('.nuxt-link')).toHaveLength(3) + }) + + it('renders version', () => { + expect(wrapper.find('.ds-footer').text()).toContain('v1.0.0') + }) }) - it('renders three links', () => { - expect(wrapper.findAll('a')).toHaveLength(3) + describe('inflexible links', () => { + beforeEach(() => { + wrapper = Wrapper() + }) + + it('renders ORGANIZATION', () => { + expect(wrapper.find('a[data-test="organization-link"]').exists()).toBe(true) + }) + + it('renders version', () => { + expect(wrapper.find('a[data-test="version-link"]').exists()).toBe(true) + }) }) - it('renders four nuxt-links', () => { - expect(wrapper.findAll('.nuxt-link')).toHaveLength(4) + describe('flexible links not set', () => { + beforeEach(async () => { + const links = { + ...linksDefault, + IMPRINT: null, + TERMS_AND_CONDITIONS: null, + CODE_OF_CONDUCT: null, + DATA_PRIVACY: null, + FAQ: null, + } + wrapper = Wrapper() + wrapper.setData({ links }) + await wrapper.vm.$nextTick() + }) + + it('renders IMPRINT as nuxt-link', () => { + expect(wrapper.find('span[data-test="imprint-nuxt-link"]').exists()).toBe(true) + }) + + it('renders TERMS_AND_CONDITIONS as nuxt-link', () => { + expect(wrapper.find('span[data-test="terms-nuxt-link"]').exists()).toBe(true) + }) + + it('renders CODE_OF_CONDUCT as nuxt-link', () => { + expect(wrapper.find('span[data-test="code-nuxt-link"]').exists()).toBe(true) + }) + + it('renders DATA_PRIVACY as nuxt-link', () => { + expect(wrapper.find('span[data-test="data-nuxt-link"]').exists()).toBe(true) + }) + + it('renders FAQ as nuxt-link', () => { + expect(wrapper.find('span[data-test="faq-nuxt-link"]').exists()).toBe(true) + }) }) - it('renders version', () => { - expect(wrapper.find('.ds-footer').text()).toContain('v1.0.0') + describe('flexible links set', () => { + beforeEach(async () => { + const links = { + ...linksDefault, + IMPRINT: 'https://ocelot.social/IMPRINT', + TERMS_AND_CONDITIONS: 'https://ocelot.social/TERMS_AND_CONDITIONS', + CODE_OF_CONDUCT: 'https://ocelot.social/CODE_OF_CONDUCT', + DATA_PRIVACY: 'https://ocelot.social/DATA_PRIVACY', + FAQ: 'https://ocelot.social/FAQ', + } + wrapper = Wrapper() + wrapper.setData({ links }) + await wrapper.vm.$nextTick() + }) + + it('renders IMPRINT as "a" tag link', () => { + expect(wrapper.find(`a[href="https://ocelot.social/IMPRINT"]`).exists()).toBe(true) + }) + + it('renders TERMS_AND_CONDITIONS as "a" tag link', () => { + expect(wrapper.find(`a[href="https://ocelot.social/TERMS_AND_CONDITIONS"]`).exists()).toBe( + true, + ) + }) + + it('renders CODE_OF_CONDUCT as "a" tag link', () => { + expect(wrapper.find(`a[href="https://ocelot.social/CODE_OF_CONDUCT"]`).exists()).toBe(true) + }) + + it('renders DATA_PRIVACY as "a" tag link', () => { + expect(wrapper.find(`a[href="https://ocelot.social/DATA_PRIVACY"]`).exists()).toBe(true) + }) + + it('renders FAQ as "a" tag link', () => { + expect(wrapper.find(`a[href="https://ocelot.social/FAQ"]`).exists()).toBe(true) + }) }) }) }) diff --git a/webapp/components/PageFooter/PageFooter.vue b/webapp/components/PageFooter/PageFooter.vue index ace0514e1..e31bc3e2a 100644 --- a/webapp/components/PageFooter/PageFooter.vue +++ b/webapp/components/PageFooter/PageFooter.vue @@ -1,26 +1,67 @@