Compare commits
No commits in common. "master" and "1.0.3" have entirely different histories.
157
.codecov.yml
Normal file
@ -0,0 +1,157 @@
|
|||||||
|
codecov:
|
||||||
|
#token: uuid # Your private repository token
|
||||||
|
#url: "http" # for Codecov Enterprise customers
|
||||||
|
#slug: "owner/repo" # for Codecov Enterprise customers
|
||||||
|
#branch: master # override the default branch
|
||||||
|
#bot: username # set user whom will be the consumer of oauth requests
|
||||||
|
#ci: # Custom CI domains if Codecov does not identify them automatically
|
||||||
|
# - ci.domain.com
|
||||||
|
# - !provider # ignore these providers when checking if CI passed
|
||||||
|
# # ex. You may test on Travis, Circle, and AppVeyor, but only need
|
||||||
|
# # to check if Travis passes. Therefore add: !circle and !appveyor
|
||||||
|
notify:
|
||||||
|
#after_n_builds: null # number of expected builds to recieve before sending notifications
|
||||||
|
# # after: check ci status unless disabled via require_ci_to_pass
|
||||||
|
require_ci_to_pass: yes # yes: will delay sending notifications until all ci is finished
|
||||||
|
# no: will send notifications without checking ci status and wait till "after_n_builds" are uploaded
|
||||||
|
#countdown: null # number of seconds to wait before first ci build check
|
||||||
|
#delay: null # number of seconds to wait between ci build checks
|
||||||
|
|
||||||
|
coverage:
|
||||||
|
precision: 2 # 2 = xx.xx%, 0 = xx%
|
||||||
|
round: nearest # down|up|nearest - default down
|
||||||
|
# range: 50...60 # default 70...90. red...green
|
||||||
|
|
||||||
|
#notify:
|
||||||
|
# irc:
|
||||||
|
# default:
|
||||||
|
# server: "chat.freenode.net"|encrypted
|
||||||
|
# branches: null # all branches by default
|
||||||
|
# threshold: 1%
|
||||||
|
# message: "Coverage {{changed}} for {{owner}}/{{repo}}" # customize the message
|
||||||
|
# flags: null
|
||||||
|
# paths: null
|
||||||
|
#
|
||||||
|
# slack:
|
||||||
|
# default:
|
||||||
|
# url: "http"|encrypted
|
||||||
|
# threshold: 1%
|
||||||
|
# branches: null # all branches by default
|
||||||
|
# message: "Coverage {{changed}} for {{owner}}/{{repo}}" # customize the message
|
||||||
|
# attachments: "sunburst, diff"
|
||||||
|
# only_pulls: false
|
||||||
|
# flags: null
|
||||||
|
# paths: null
|
||||||
|
#
|
||||||
|
# email:
|
||||||
|
# default:
|
||||||
|
# to:
|
||||||
|
# - example@domain.com
|
||||||
|
# - &author
|
||||||
|
# threshold: 1%
|
||||||
|
# only_pulls: false
|
||||||
|
# layout: header, diff, trends
|
||||||
|
# flags: null
|
||||||
|
# paths: null
|
||||||
|
#
|
||||||
|
# hipchat:
|
||||||
|
# default:
|
||||||
|
# url: "http"|encrypted
|
||||||
|
# room: name|id
|
||||||
|
# threshold: 1%
|
||||||
|
# token: encrypted
|
||||||
|
# branches: null # all branches by default
|
||||||
|
# notify: false # if the hipchat message is silent or loud (default false)
|
||||||
|
# message: "Coverage {{changed}} for {{owner}}/{{repo}}" # customize the message
|
||||||
|
# flags: null
|
||||||
|
# paths: null
|
||||||
|
#
|
||||||
|
# gitter:
|
||||||
|
# url: "http"|encrypted
|
||||||
|
# threshold: 1%
|
||||||
|
# branches: null # all branches by default
|
||||||
|
# message: "Coverage {{changed}} for {{owner}}/{{repo}}" # customize the message
|
||||||
|
#
|
||||||
|
# webhooks:
|
||||||
|
# _name_:
|
||||||
|
# url: "http"|encrypted
|
||||||
|
# threshold: 1%
|
||||||
|
# branches: null # all branches by default
|
||||||
|
|
||||||
|
status:
|
||||||
|
project:
|
||||||
|
default: false # disable the default status that measures entire project
|
||||||
|
backend: # declare a new status context "backend"
|
||||||
|
against: parent
|
||||||
|
target: auto
|
||||||
|
threshold: null
|
||||||
|
#threshold: 1%
|
||||||
|
base: auto
|
||||||
|
if_no_uploads: error
|
||||||
|
if_not_found: success
|
||||||
|
if_ci_failed: error
|
||||||
|
only_pulls: false
|
||||||
|
#branches:
|
||||||
|
# - master
|
||||||
|
#flags:
|
||||||
|
# - integration
|
||||||
|
paths:
|
||||||
|
- backend/ # only include coverage in "backend/" folder
|
||||||
|
webapp: # declare a new status context "frontend"
|
||||||
|
against: parent
|
||||||
|
target: auto
|
||||||
|
threshold: null
|
||||||
|
#threshold: 1%
|
||||||
|
base: auto
|
||||||
|
if_no_uploads: error
|
||||||
|
if_not_found: success
|
||||||
|
if_ci_failed: error
|
||||||
|
only_pulls: false
|
||||||
|
#branches:
|
||||||
|
# - master
|
||||||
|
#flags:
|
||||||
|
# - integration
|
||||||
|
paths:
|
||||||
|
- webapp/ # only include coverage in "webapp/" folder
|
||||||
|
|
||||||
|
patch:
|
||||||
|
default: false
|
||||||
|
# against: parent
|
||||||
|
# target: 80%
|
||||||
|
# branches: null
|
||||||
|
# if_no_uploads: success
|
||||||
|
# if_not_found: success
|
||||||
|
# if_ci_failed: error
|
||||||
|
# only_pulls: false
|
||||||
|
# flags:
|
||||||
|
# - integration
|
||||||
|
# paths:
|
||||||
|
# - folder
|
||||||
|
|
||||||
|
#changes:
|
||||||
|
# default:
|
||||||
|
# against: parent
|
||||||
|
# branches: null
|
||||||
|
# if_no_uploads: error
|
||||||
|
# if_not_found: success
|
||||||
|
# if_ci_failed: error
|
||||||
|
# only_pulls: false
|
||||||
|
# flags:
|
||||||
|
# - integration
|
||||||
|
# paths:
|
||||||
|
# - folder
|
||||||
|
|
||||||
|
#flags:
|
||||||
|
# integration:
|
||||||
|
# branches:
|
||||||
|
# - master
|
||||||
|
# ignore:
|
||||||
|
# - app/ui
|
||||||
|
|
||||||
|
#ignore: # files and folders for processing
|
||||||
|
# - tests/*
|
||||||
|
|
||||||
|
#fixes:
|
||||||
|
# - "old_path::new_path"
|
||||||
|
|
||||||
|
comment: off
|
||||||
@ -1,99 +0,0 @@
|
|||||||
# CodeRabbit Configuration
|
|
||||||
# https://docs.coderabbit.ai/guides/configure-coderabbit
|
|
||||||
|
|
||||||
language: de
|
|
||||||
|
|
||||||
reviews:
|
|
||||||
# Automatisches Review für alle PRs
|
|
||||||
auto_review:
|
|
||||||
enabled: true
|
|
||||||
drafts: false
|
|
||||||
base_branches:
|
|
||||||
- master
|
|
||||||
- main
|
|
||||||
|
|
||||||
auto_approve:
|
|
||||||
enabled: true
|
|
||||||
|
|
||||||
# Review-Einstellungen
|
|
||||||
request_changes_workflow: true
|
|
||||||
high_level_summary: true
|
|
||||||
poem: false
|
|
||||||
review_status: true
|
|
||||||
collapse_walkthrough: false
|
|
||||||
changed_files_summary: true
|
|
||||||
|
|
||||||
# Pfad-Filter (Dateien die ignoriert werden)
|
|
||||||
path_filters:
|
|
||||||
- "!**/*.lock"
|
|
||||||
- "!**/package-lock.json"
|
|
||||||
- "!**/yarn.lock"
|
|
||||||
- "!**/*.snap"
|
|
||||||
- "!**/coverage/**"
|
|
||||||
- "!**/dist/**"
|
|
||||||
- "!**/node_modules/**"
|
|
||||||
- "!**/*.min.js"
|
|
||||||
- "!**/*.min.css"
|
|
||||||
- "!**/.git/**"
|
|
||||||
- "!**/storybook-static/**"
|
|
||||||
|
|
||||||
# Instruktionen für spezifische Pfade
|
|
||||||
path_instructions:
|
|
||||||
- path: "webapp/**/*.vue"
|
|
||||||
instructions: |
|
|
||||||
Prüfe Vue.js Best Practices:
|
|
||||||
- Composition API Verwendung
|
|
||||||
- Props Validierung
|
|
||||||
- Event-Handling
|
|
||||||
- Reaktivität
|
|
||||||
|
|
||||||
- path: "webapp/**/*.spec.js"
|
|
||||||
instructions: |
|
|
||||||
Prüfe Test-Qualität:
|
|
||||||
- Aussagekräftige Test-Namen
|
|
||||||
- Edge Cases abgedeckt
|
|
||||||
- Mocking korrekt verwendet
|
|
||||||
|
|
||||||
- path: "backend/**/*.js"
|
|
||||||
instructions: |
|
|
||||||
Prüfe Backend Best Practices:
|
|
||||||
- Error Handling
|
|
||||||
- Input Validierung
|
|
||||||
- SQL Injection Prevention
|
|
||||||
- Performance (N+1 Queries)
|
|
||||||
|
|
||||||
- path: "packages/ui/**/*.ts"
|
|
||||||
instructions: |
|
|
||||||
Prüfe UI Library Standards:
|
|
||||||
- TypeScript Typisierung
|
|
||||||
- Vue 2/3 Kompatibilität (vue-demi)
|
|
||||||
- Accessibility (WCAG 2.1)
|
|
||||||
- CVA Varianten-Pattern
|
|
||||||
|
|
||||||
- path: "packages/ui/**/*.vue"
|
|
||||||
instructions: |
|
|
||||||
Prüfe UI Komponenten:
|
|
||||||
- Render-Funktion Pattern für vue-demi
|
|
||||||
- Props mit korrekten Types
|
|
||||||
- Slots dokumentiert
|
|
||||||
- Keine Template-Syntax (nur h() für Vue 2/3 Kompatibilität)
|
|
||||||
|
|
||||||
# Chat-Befehle
|
|
||||||
chat:
|
|
||||||
auto_reply: true
|
|
||||||
|
|
||||||
# Ton und Stil
|
|
||||||
tone_instructions: |
|
|
||||||
Sei konstruktiv und freundlich.
|
|
||||||
Erkläre das "Warum" hinter Vorschlägen.
|
|
||||||
Priorisiere Sicherheit > Korrektheit > Performance > Lesbarkeit.
|
|
||||||
Schlage konkrete Code-Änderungen vor wenn möglich.
|
|
||||||
|
|
||||||
# Knowledge Base (Repository-spezifisches Wissen)
|
|
||||||
knowledge_base:
|
|
||||||
learnings:
|
|
||||||
scope: auto
|
|
||||||
issues:
|
|
||||||
scope: auto
|
|
||||||
pull_requests:
|
|
||||||
scope: auto
|
|
||||||
2
.github/ISSUE_TEMPLATE.md
vendored
@ -1,5 +1,3 @@
|
|||||||
<!-- You can find the latest issue templates here https://github.com/ulfgebhardt/issue-templates -->
|
|
||||||
|
|
||||||
<!--
|
<!--
|
||||||
Please take a look at the issue templates at https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/new/choose
|
Please take a look at the issue templates at https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/new/choose
|
||||||
before submitting a new issue. Following one of the issue templates will ensure maintainers can route your request efficiently.
|
before submitting a new issue. Following one of the issue templates will ensure maintainers can route your request efficiently.
|
||||||
|
|||||||
19
.github/ISSUE_TEMPLATE/bug_report.md
vendored
@ -4,7 +4,22 @@ about: Create a report to help us improve
|
|||||||
labels: bug
|
labels: bug
|
||||||
title: 🐛 [Bug]
|
title: 🐛 [Bug]
|
||||||
---
|
---
|
||||||
<!-- You can find the latest issue templates here https://github.com/ulfgebhardt/issue-templates -->
|
|
||||||
|
|
||||||
## 🐛 Bugreport
|
## :bug: Bugreport
|
||||||
<!-- Describe your issue in detail. Include screenshots if needed. Give us as much information as possible. Use a clear and concise description of what the bug is.-->
|
<!-- Describe your issue in detail. Include screenshots if needed. Give us as much information as possible. Use a clear and concise description of what the bug is.-->
|
||||||
|
|
||||||
|
### Steps to reproduce the behavior
|
||||||
|
1.
|
||||||
|
2.
|
||||||
|
3.
|
||||||
|
4. ...
|
||||||
|
5. Profit
|
||||||
|
|
||||||
|
### Expected behavior
|
||||||
|
<!-- A clear and concise description of what you expected to happen. -->
|
||||||
|
|
||||||
|
### Version & Environment
|
||||||
|
<!-- Add context about your environment and used version here. -->
|
||||||
|
|
||||||
|
### Additional context
|
||||||
|
<!-- Add any other context about the problem here. -->
|
||||||
|
|||||||
18
.github/ISSUE_TEMPLATE/devops_ticket.md
vendored
@ -1,10 +1,24 @@
|
|||||||
---
|
---
|
||||||
name: 💥 DevOps ticket
|
name: 💥 DevOps ticket
|
||||||
about: Help us manage our deployed Software.
|
about: Help us manage our deployed App.
|
||||||
labels: devops
|
labels: devops
|
||||||
title: 💥 [DevOps]
|
title: 💥 [DevOps]
|
||||||
---
|
---
|
||||||
<!-- You can find the latest issue templates here https://github.com/ulfgebhardt/issue-templates -->
|
|
||||||
|
|
||||||
## 💥 DevOps ticket
|
## 💥 DevOps ticket
|
||||||
<!-- Describe your issue in detail. Include screenshots if needed. Give us as much information as possible. Use a clear and concise description of what the problem is.-->
|
<!-- Describe your issue in detail. Include screenshots if needed. Give us as much information as possible. Use a clear and concise description of what the problem is.-->
|
||||||
|
|
||||||
|
### Motive
|
||||||
|
<!-- Why does this task need to be done? What can we benefit from this? -->
|
||||||
|
|
||||||
|
### Related issues
|
||||||
|
<!-- Are there any related issues to link to? Please paste them below for reference. -->
|
||||||
|
|
||||||
|
### Implementation
|
||||||
|
<!-- Please, document any ideas of how the task can be performed. -->
|
||||||
|
|
||||||
|
### Validation
|
||||||
|
<!-- How can we make sure that this task was successful? -->
|
||||||
|
|
||||||
|
### Additional context
|
||||||
|
<!-- Add other context or background about the feature request here.-->
|
||||||
|
|||||||
13
.github/ISSUE_TEMPLATE/epic.md
vendored
@ -1,13 +0,0 @@
|
|||||||
---
|
|
||||||
name: 🌟 Epic
|
|
||||||
about: Define a big development Step
|
|
||||||
labels: epic
|
|
||||||
title: 🌟 [EPIC]
|
|
||||||
---
|
|
||||||
<!-- You can find the latest issue templates here https://github.com/ulfgebhardt/issue-templates -->
|
|
||||||
|
|
||||||
<!-- THIS ISSUE-TYPE IS NOT FOR YOU! -->
|
|
||||||
<!-- Proceed only if you know what you are doing - have a chat with Project's Team first -->
|
|
||||||
|
|
||||||
## 🌟 EPIC
|
|
||||||
<!-- Describe your Epic in detail. Include screenshots and drawings -->
|
|
||||||
18
.github/ISSUE_TEMPLATE/feature_request.md
vendored
@ -4,7 +4,21 @@ about: Suggest an idea for this project
|
|||||||
labels: feature
|
labels: feature
|
||||||
title: 🚀 [Feature]
|
title: 🚀 [Feature]
|
||||||
---
|
---
|
||||||
<!-- You can find the latest issue templates here https://github.com/ulfgebhardt/issue-templates -->
|
|
||||||
|
|
||||||
## 🚀 Feature
|
## :rocket: Feature
|
||||||
<!-- Give a short summary of the Feature. Use Screenshots if you want. -->
|
<!-- Give a short summary of the Feature. Use Screenshots if you want. -->
|
||||||
|
|
||||||
|
### User Problem
|
||||||
|
<!-- Which problem is this solving? Why do you think this is important? Who will benefit from it and how? -->
|
||||||
|
|
||||||
|
### Implementation
|
||||||
|
<!-- How do you think this feature should be implemented? How will it be used? Where in the network should it be located? Which steps and screens are involved? -->
|
||||||
|
|
||||||
|
### Design & Layout
|
||||||
|
<!-- Attach Screenshots and Sketches to illustrate your idea. -->
|
||||||
|
|
||||||
|
### Validation
|
||||||
|
<!-- How can we make sure that this feature indeed solves the above problem? How do we know if it has been accepted by the users of the network, once released? -->
|
||||||
|
|
||||||
|
### Additional context
|
||||||
|
<!-- Add other context or background about the feature request here.-->
|
||||||
|
|||||||
11
.github/ISSUE_TEMPLATE/question.md
vendored
@ -1,13 +1,12 @@
|
|||||||
---
|
---
|
||||||
name: 💬 Question
|
name: 💬 Question
|
||||||
about: If you need help understanding our Software.
|
about: If you need help understanding HumanConnection.
|
||||||
labels: question
|
labels: question
|
||||||
title: 💬 [Question]
|
title: 💬 [Question]
|
||||||
---
|
---
|
||||||
<!-- You can find the latest issue templates here https://github.com/ulfgebhardt/issue-templates -->
|
<!-- Chat with Team HumanConnection -->
|
||||||
|
<!-- If you need an answer right away, visit the HumanConnection Discord:
|
||||||
|
https://discord.gg/Q3mpcgr -->
|
||||||
|
|
||||||
<!-- Question the project's team -->
|
## :speech_balloon: Question
|
||||||
<!-- If you need an answer right away, consider to take other means of communication with the project's team -->
|
|
||||||
|
|
||||||
## 💬 Question
|
|
||||||
<!-- Describe your Question in detail. Include screenshots and drawings if needed. -->
|
<!-- Describe your Question in detail. Include screenshots and drawings if needed. -->
|
||||||
|
|||||||
10
.github/ISSUE_TEMPLATE/refactor_ticket.md
vendored
@ -1,10 +0,0 @@
|
|||||||
---
|
|
||||||
name: 🔧 Refactor ticket
|
|
||||||
about: Help us improve our code by refactoring it.
|
|
||||||
labels: refactor
|
|
||||||
title: 🔧 [Refactor]
|
|
||||||
---
|
|
||||||
<!-- You can find the latest issue templates here https://github.com/ulfgebhardt/issue-templates -->
|
|
||||||
|
|
||||||
## 🔧 Refactor ticket
|
|
||||||
<!-- Describe your issue in detail. Include screenshots if needed. Give us as much information as possible. Use a clear and concise description of what the problem is.-->
|
|
||||||
21
.github/ISSUE_TEMPLATE/refactor_tickets.md
vendored
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
---
|
||||||
|
name: 🔧 Refactor ticket
|
||||||
|
about: Help us improve our code by refactoring it.
|
||||||
|
labels: refactor
|
||||||
|
title: 🔧 [Refactor]
|
||||||
|
---
|
||||||
|
|
||||||
|
## :zap: Refactor ticket
|
||||||
|
<!-- Describe your issue in detail. Include screenshots if needed. Give us as much information as possible. Use a clear and concise description of what the problem is.-->
|
||||||
|
|
||||||
|
### Motive
|
||||||
|
<!-- What is the purpose of this refactoring? If it's removing depcrecated code, please link to the deprecation notice. -->
|
||||||
|
|
||||||
|
### Related issues
|
||||||
|
<!-- Are there any related issues to link to? Please paste them below for reference. -->
|
||||||
|
|
||||||
|
### Implementation
|
||||||
|
<!-- Please, document any ideas of how the code should be refactored. -->
|
||||||
|
|
||||||
|
### Additional context
|
||||||
|
<!-- Add other context or background about the feature request here.-->
|
||||||
13
.github/ISSUE_TEMPLATE/release.md
vendored
@ -1,13 +0,0 @@
|
|||||||
---
|
|
||||||
name: 🎂 Release
|
|
||||||
about: Define a Release
|
|
||||||
labels: release
|
|
||||||
title: 🎂 [RELEASE]
|
|
||||||
---
|
|
||||||
<!-- You can find the latest issue templates here https://github.com/ulfgebhardt/issue-templates -->
|
|
||||||
|
|
||||||
<!-- THIS ISSUE-TYPE IS NOT FOR YOU! -->
|
|
||||||
<!-- Proceed only if you know what you are doing - have a chat with Project's Team first -->
|
|
||||||
|
|
||||||
## 🎂 RELEASE
|
|
||||||
<!-- Describe your Release in detail. Include screenshots and drawings -->
|
|
||||||
2
.github/PULL_REQUEST_TEMPLATE.md
vendored
@ -1,5 +1,3 @@
|
|||||||
<!-- You can find the latest issue templates here https://github.com/ulfgebhardt/issue-templates -->
|
|
||||||
|
|
||||||
## 🍰 Pullrequest
|
## 🍰 Pullrequest
|
||||||
<!-- Describe the Pullrequest. Use Screenshots if possible. -->
|
<!-- Describe the Pullrequest. Use Screenshots if possible. -->
|
||||||
|
|
||||||
|
|||||||
196
.github/dependabot.yml
vendored
@ -1,196 +0,0 @@
|
|||||||
version: 2
|
|
||||||
updates:
|
|
||||||
- package-ecosystem: "github-actions"
|
|
||||||
open-pull-requests-limit: 99
|
|
||||||
directory: "/"
|
|
||||||
rebase-strategy: "disabled"
|
|
||||||
schedule:
|
|
||||||
interval: weekly
|
|
||||||
day: "saturday"
|
|
||||||
timezone: "Europe/Berlin"
|
|
||||||
time: "03:00"
|
|
||||||
- package-ecosystem: npm
|
|
||||||
open-pull-requests-limit: 99
|
|
||||||
directory: "/"
|
|
||||||
rebase-strategy: "disabled"
|
|
||||||
schedule:
|
|
||||||
interval: weekly
|
|
||||||
day: "saturday"
|
|
||||||
timezone: "Europe/Berlin"
|
|
||||||
time: "03:00"
|
|
||||||
groups:
|
|
||||||
babel:
|
|
||||||
applies-to: version-updates
|
|
||||||
patterns:
|
|
||||||
- "@babel*"
|
|
||||||
cypress:
|
|
||||||
applies-to: version-updates
|
|
||||||
patterns:
|
|
||||||
- "*cypress*"
|
|
||||||
- "*cucumber*"
|
|
||||||
vuepress:
|
|
||||||
applies-to: version-updates
|
|
||||||
patterns:
|
|
||||||
- "*vuepress*"
|
|
||||||
|
|
||||||
# backend
|
|
||||||
- package-ecosystem: docker
|
|
||||||
open-pull-requests-limit: 99
|
|
||||||
directory: "/backend"
|
|
||||||
rebase-strategy: "disabled"
|
|
||||||
schedule:
|
|
||||||
interval: weekly
|
|
||||||
day: "saturday"
|
|
||||||
timezone: "Europe/Berlin"
|
|
||||||
time: "03:00"
|
|
||||||
- package-ecosystem: npm
|
|
||||||
open-pull-requests-limit: 99
|
|
||||||
directory: "/backend"
|
|
||||||
rebase-strategy: "disabled"
|
|
||||||
schedule:
|
|
||||||
interval: weekly
|
|
||||||
day: "saturday"
|
|
||||||
timezone: "Europe/Berlin"
|
|
||||||
time: "03:00"
|
|
||||||
groups:
|
|
||||||
apollo-server:
|
|
||||||
applies-to: version-updates
|
|
||||||
patterns:
|
|
||||||
- "*apollo-server*"
|
|
||||||
metascraper:
|
|
||||||
applies-to: version-updates
|
|
||||||
patterns:
|
|
||||||
- "metascraper*"
|
|
||||||
|
|
||||||
# webapp
|
|
||||||
- package-ecosystem: docker
|
|
||||||
open-pull-requests-limit: 99
|
|
||||||
directory: "/webapp"
|
|
||||||
rebase-strategy: "disabled"
|
|
||||||
schedule:
|
|
||||||
interval: weekly
|
|
||||||
day: "saturday"
|
|
||||||
timezone: "Europe/Berlin"
|
|
||||||
time: "03:00"
|
|
||||||
- package-ecosystem: npm
|
|
||||||
open-pull-requests-limit: 99
|
|
||||||
directory: "/webapp"
|
|
||||||
rebase-strategy: "disabled"
|
|
||||||
schedule:
|
|
||||||
interval: weekly
|
|
||||||
day: "saturday"
|
|
||||||
timezone: "Europe/Berlin"
|
|
||||||
time: "03:00"
|
|
||||||
groups:
|
|
||||||
apollo:
|
|
||||||
applies-to: version-updates
|
|
||||||
patterns:
|
|
||||||
- "apollo*"
|
|
||||||
babel:
|
|
||||||
applies-to: version-updates
|
|
||||||
patterns:
|
|
||||||
- "@babel*"
|
|
||||||
jest:
|
|
||||||
applies-to: version-updates
|
|
||||||
patterns:
|
|
||||||
- "jest*"
|
|
||||||
mapbox:
|
|
||||||
applies-to: version-updates
|
|
||||||
patterns:
|
|
||||||
- "*mapbox*"
|
|
||||||
storybook:
|
|
||||||
applies-to: version-updates
|
|
||||||
patterns:
|
|
||||||
- "*storybook*"
|
|
||||||
vue:
|
|
||||||
applies-to: version-updates
|
|
||||||
patterns:
|
|
||||||
- "@vue*"
|
|
||||||
|
|
||||||
- package-ecosystem: docker
|
|
||||||
open-pull-requests-limit: 99
|
|
||||||
directory: "/neo4j"
|
|
||||||
rebase-strategy: "disabled"
|
|
||||||
schedule:
|
|
||||||
interval: weekly
|
|
||||||
day: "saturday"
|
|
||||||
timezone: "Europe/Berlin"
|
|
||||||
time: "03:00"
|
|
||||||
|
|
||||||
- package-ecosystem: docker
|
|
||||||
open-pull-requests-limit: 99
|
|
||||||
directory: "/deployment/src/docker"
|
|
||||||
rebase-strategy: "disabled"
|
|
||||||
schedule:
|
|
||||||
interval: weekly
|
|
||||||
day: "saturday"
|
|
||||||
timezone: "Europe/Berlin"
|
|
||||||
time: "03:00"
|
|
||||||
|
|
||||||
# ui library
|
|
||||||
- package-ecosystem: npm
|
|
||||||
open-pull-requests-limit: 99
|
|
||||||
directory: "/packages/ui"
|
|
||||||
rebase-strategy: "disabled"
|
|
||||||
schedule:
|
|
||||||
interval: weekly
|
|
||||||
day: "saturday"
|
|
||||||
timezone: "Europe/Berlin"
|
|
||||||
time: "03:00"
|
|
||||||
groups:
|
|
||||||
vue:
|
|
||||||
applies-to: version-updates
|
|
||||||
patterns:
|
|
||||||
- "vue*"
|
|
||||||
- "@vue*"
|
|
||||||
vite:
|
|
||||||
applies-to: version-updates
|
|
||||||
patterns:
|
|
||||||
- "vite*"
|
|
||||||
- "@vitejs*"
|
|
||||||
vitest:
|
|
||||||
applies-to: version-updates
|
|
||||||
patterns:
|
|
||||||
- "vitest*"
|
|
||||||
- "@vitest*"
|
|
||||||
|
|
||||||
# ui examples
|
|
||||||
- package-ecosystem: npm
|
|
||||||
open-pull-requests-limit: 99
|
|
||||||
directory: "/packages/ui/examples/vue3-tailwind"
|
|
||||||
rebase-strategy: "disabled"
|
|
||||||
schedule:
|
|
||||||
interval: weekly
|
|
||||||
day: "saturday"
|
|
||||||
timezone: "Europe/Berlin"
|
|
||||||
time: "03:00"
|
|
||||||
|
|
||||||
- package-ecosystem: npm
|
|
||||||
open-pull-requests-limit: 99
|
|
||||||
directory: "/packages/ui/examples/vue3-css"
|
|
||||||
rebase-strategy: "disabled"
|
|
||||||
schedule:
|
|
||||||
interval: weekly
|
|
||||||
day: "saturday"
|
|
||||||
timezone: "Europe/Berlin"
|
|
||||||
time: "03:00"
|
|
||||||
|
|
||||||
- package-ecosystem: npm
|
|
||||||
open-pull-requests-limit: 99
|
|
||||||
directory: "/packages/ui/examples/vue2-tailwind"
|
|
||||||
rebase-strategy: "disabled"
|
|
||||||
schedule:
|
|
||||||
interval: weekly
|
|
||||||
day: "saturday"
|
|
||||||
timezone: "Europe/Berlin"
|
|
||||||
time: "03:00"
|
|
||||||
|
|
||||||
- package-ecosystem: npm
|
|
||||||
open-pull-requests-limit: 99
|
|
||||||
directory: "/packages/ui/examples/vue2-css"
|
|
||||||
rebase-strategy: "disabled"
|
|
||||||
schedule:
|
|
||||||
interval: weekly
|
|
||||||
day: "saturday"
|
|
||||||
timezone: "Europe/Berlin"
|
|
||||||
time: "03:00"
|
|
||||||
39
.github/file-filters.yml
vendored
@ -1,39 +0,0 @@
|
|||||||
# These file filter patterns are used by the action https://github.com/dorny/paths-filter
|
|
||||||
|
|
||||||
ui: &ui
|
|
||||||
- '.github/workflows/ui-*.yml'
|
|
||||||
- 'packages/ui/**/*'
|
|
||||||
|
|
||||||
backend: &backend
|
|
||||||
- '.github/workflows/test-backend.yml'
|
|
||||||
- 'backend/**/*'
|
|
||||||
- 'neo4j/**/*'
|
|
||||||
- 'package.json'
|
|
||||||
|
|
||||||
docker: &docker
|
|
||||||
- 'docker-compose.*'
|
|
||||||
|
|
||||||
webapp: &webapp
|
|
||||||
- '.github/workflows/test-webapp.yml'
|
|
||||||
- 'webapp/**/*'
|
|
||||||
- 'styleguide/**/*'
|
|
||||||
- 'package.json'
|
|
||||||
- *ui
|
|
||||||
|
|
||||||
docs-check: &docs-check
|
|
||||||
- '.github/workflows/check-documentation.yml'
|
|
||||||
|
|
||||||
markdown: &markdown
|
|
||||||
- *docs-check
|
|
||||||
- '**/*.md'
|
|
||||||
- '.github/workflows/mlc_config.json'
|
|
||||||
|
|
||||||
vuepress: &vuepress
|
|
||||||
- *docs-check
|
|
||||||
- '.github/workflows/deploy-documentation.yml'
|
|
||||||
- '.vuepress/**/*'
|
|
||||||
- 'package.json'
|
|
||||||
|
|
||||||
documentation: &documentation
|
|
||||||
- *vuepress
|
|
||||||
- *markdown
|
|
||||||
65
.github/workflows/check-documentation.yml
vendored
@ -1,65 +0,0 @@
|
|||||||
name: ocelot.social check documentation
|
|
||||||
|
|
||||||
on: push
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
files-changed:
|
|
||||||
name: Detect File Changes - Markdown files
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
outputs:
|
|
||||||
markdown: ${{ steps.changes.outputs.markdown }}
|
|
||||||
documentation: ${{ steps.changes.outputs.documentation }}
|
|
||||||
steps:
|
|
||||||
- name: Checkout code
|
|
||||||
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v4.1.7
|
|
||||||
|
|
||||||
- name: Check for markdown file changes
|
|
||||||
uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2
|
|
||||||
id: changes
|
|
||||||
with:
|
|
||||||
token: ${{ github.token }}
|
|
||||||
filters: .github/file-filters.yml
|
|
||||||
list-files: shell
|
|
||||||
|
|
||||||
check-markdown-links:
|
|
||||||
name: Check Markdown links
|
|
||||||
needs: files-changed
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
if: needs.files-changed.outputs.markdown == 'true'
|
|
||||||
steps:
|
|
||||||
- name: Checkout code
|
|
||||||
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v4.1.7
|
|
||||||
|
|
||||||
- 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
|
|
||||||
|
|
||||||
- name: Check Markdown Links
|
|
||||||
uses: gaurav-nelson/github-action-markdown-link-check@3c3b66f1f7d0900e37b71eca45b63ea9eedfce31 # 1.0.15
|
|
||||||
with:
|
|
||||||
use-quiet-mode: 'yes'
|
|
||||||
use-verbose-mode: 'no'
|
|
||||||
# at any .md file change take the chance to check the links in all .md files
|
|
||||||
check-modified-files-only: 'no'
|
|
||||||
config-file: '.github/workflows/mlc_config.json'
|
|
||||||
base-branch: 'master'
|
|
||||||
folder-path: '.'
|
|
||||||
|
|
||||||
test-vuepress-build:
|
|
||||||
name: Test Vuepress build
|
|
||||||
needs: files-changed
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
if: needs.files-changed.outputs.documentation == 'true'
|
|
||||||
steps:
|
|
||||||
- name: Checkout code
|
|
||||||
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v4.1.7
|
|
||||||
|
|
||||||
- name: Setup Node 20
|
|
||||||
uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v4.0.3
|
|
||||||
with:
|
|
||||||
node-version: '20'
|
|
||||||
|
|
||||||
- name: npm-install
|
|
||||||
run: npm install
|
|
||||||
|
|
||||||
- name: npm-docs:build
|
|
||||||
run: npm run docs:build
|
|
||||||
48
.github/workflows/deploy-documentation.yml
vendored
@ -1,48 +0,0 @@
|
|||||||
name: ocelot.social deploy documentation
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
branches:
|
|
||||||
- master
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
files-changed:
|
|
||||||
name: Detect File Changes - Markdown and Vuepress files
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
outputs:
|
|
||||||
documentation: ${{ steps.changes.outputs.documentation }}
|
|
||||||
steps:
|
|
||||||
- name: Checkout code
|
|
||||||
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v4.1.7
|
|
||||||
|
|
||||||
- name: Check for 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-and-deploy:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- name: Checkout
|
|
||||||
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v4.1.7
|
|
||||||
|
|
||||||
- name: Setup Node 20
|
|
||||||
uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v4.0.3
|
|
||||||
with:
|
|
||||||
node-version: 20
|
|
||||||
|
|
||||||
- name: Build Vuepress Pages
|
|
||||||
run: npm install && npm run docs:build
|
|
||||||
|
|
||||||
- name: Deploy Vuepress to Github Pages
|
|
||||||
uses: crazy-max/ghaction-github-pages@df5cc2bfa78282ded844b354faee141f06b41865 # v4.0.0
|
|
||||||
with:
|
|
||||||
target_branch: gh-pages
|
|
||||||
build_dir: .vuepress/dist
|
|
||||||
author: Wolfgang Huß <vorstand@busfaktor.org>
|
|
||||||
fqdn: docs.ocelot.social
|
|
||||||
env:
|
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
91
.github/workflows/docker-push.yml
vendored
@ -1,91 +0,0 @@
|
|||||||
name: docker-push
|
|
||||||
|
|
||||||
on: push
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
build-and-push-images:
|
|
||||||
strategy:
|
|
||||||
matrix:
|
|
||||||
app:
|
|
||||||
- name: neo4j
|
|
||||||
context: neo4j
|
|
||||||
file: neo4j/Dockerfile
|
|
||||||
target: community
|
|
||||||
- name: backend-base
|
|
||||||
context: backend
|
|
||||||
file: backend/Dockerfile
|
|
||||||
target: base
|
|
||||||
- name: backend-build
|
|
||||||
context: backend
|
|
||||||
file: backend/Dockerfile
|
|
||||||
target: build
|
|
||||||
- name: backend
|
|
||||||
context: backend
|
|
||||||
file: backend/Dockerfile
|
|
||||||
target: production
|
|
||||||
- name: webapp-base
|
|
||||||
context: .
|
|
||||||
file: webapp/Dockerfile
|
|
||||||
target: base
|
|
||||||
- name: webapp-build
|
|
||||||
context: .
|
|
||||||
file: webapp/Dockerfile
|
|
||||||
target: build
|
|
||||||
- name: webapp
|
|
||||||
context: .
|
|
||||||
file: webapp/Dockerfile
|
|
||||||
target: production
|
|
||||||
- name: maintenance-base
|
|
||||||
context: .
|
|
||||||
file: webapp/Dockerfile.maintenance
|
|
||||||
target: base
|
|
||||||
- name: maintenance-build
|
|
||||||
context: .
|
|
||||||
file: webapp/Dockerfile.maintenance
|
|
||||||
target: build
|
|
||||||
- name: maintenance
|
|
||||||
context: .
|
|
||||||
file: webapp/Dockerfile.maintenance
|
|
||||||
target: production
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
env:
|
|
||||||
REGISTRY: ghcr.io
|
|
||||||
IMAGE_NAME: ${{ github.repository }}/${{ matrix.app.name }}
|
|
||||||
permissions:
|
|
||||||
contents: read
|
|
||||||
packages: write
|
|
||||||
attestations: write
|
|
||||||
id-token: write
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: Checkout repository
|
|
||||||
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v4.1.7
|
|
||||||
- name: Log in to the Container registry
|
|
||||||
uses: docker/login-action@c94ce9fb468520275223c153574b00df6fe4bcc9
|
|
||||||
with:
|
|
||||||
registry: ${{ env.REGISTRY }}
|
|
||||||
username: ${{ github.actor }}
|
|
||||||
password: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
- name: Extract metadata (tags, labels) for Docker
|
|
||||||
id: meta
|
|
||||||
uses: docker/metadata-action@c299e40c65443455700f0fdfc63efafe5b349051
|
|
||||||
with:
|
|
||||||
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
|
|
||||||
tags: |
|
|
||||||
type=schedule
|
|
||||||
type=semver,pattern={{version}}
|
|
||||||
type=semver,pattern={{major}}.{{minor}}
|
|
||||||
type=semver,pattern={{major}}
|
|
||||||
type=ref,event=branch
|
|
||||||
type=ref,event=pr
|
|
||||||
type=sha
|
|
||||||
- name: Build and push Docker images
|
|
||||||
id: push
|
|
||||||
uses: docker/build-push-action@263435318d21b8e681c14492fe198d362a7d2c83
|
|
||||||
with:
|
|
||||||
context: ${{ matrix.app.context }}
|
|
||||||
target: ${{ matrix.app.target }}
|
|
||||||
file: ${{ matrix.app.file }}
|
|
||||||
push: true
|
|
||||||
tags: ${{ steps.meta.outputs.tags }}
|
|
||||||
labels: ${{ steps.meta.outputs.labels }}
|
|
||||||
12
.github/workflows/mlc_config.json
vendored
@ -1,12 +0,0 @@
|
|||||||
{
|
|
||||||
"timeout": "20s",
|
|
||||||
"retryOn429": true,
|
|
||||||
"retryCount": 2,
|
|
||||||
"fallbackRetryDelay": "30s",
|
|
||||||
"aliveStatusCodes": [200, 206, 303, 403],
|
|
||||||
"ignorePatterns": [
|
|
||||||
{
|
|
||||||
"pattern": "^(https:\/\/github.com\/Ocelot-Social-Community\/Ocelot-Social\/(pull|deployment\/src\/old)\/|http:\/\/localhost)"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
332
.github/workflows/publish.yml
vendored
@ -1,4 +1,4 @@
|
|||||||
name: publish
|
name: ocelot.social publish CI
|
||||||
|
|
||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
@ -6,43 +6,296 @@ on:
|
|||||||
- master
|
- master
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
|
##############################################################################
|
||||||
|
# JOB: PREPARE ###############################################################
|
||||||
|
##############################################################################
|
||||||
|
prepare:
|
||||||
|
name: Prepare
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
# needs: [nothing]
|
||||||
|
steps:
|
||||||
|
##########################################################################
|
||||||
|
# CHECKOUT CODE ##########################################################
|
||||||
|
##########################################################################
|
||||||
|
- name: Checkout code
|
||||||
|
uses: actions/checkout@v2
|
||||||
|
##########################################################################
|
||||||
|
# TODO: DO STUFF ??? #####################################################
|
||||||
|
##########################################################################
|
||||||
|
- name: Check translation files
|
||||||
|
run: |
|
||||||
|
scripts/translations/sort.sh
|
||||||
|
scripts/translations/missing-keys.sh
|
||||||
|
|
||||||
|
##############################################################################
|
||||||
|
# JOB: DOCKER BUILD COMMUNITY NEO4J ##########################################
|
||||||
|
##############################################################################
|
||||||
|
build_production_neo4j:
|
||||||
|
name: Docker Build Production - Neo4J
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
needs: [prepare]
|
||||||
|
steps:
|
||||||
|
##########################################################################
|
||||||
|
# CHECKOUT CODE ##########################################################
|
||||||
|
##########################################################################
|
||||||
|
- name: Checkout code
|
||||||
|
uses: actions/checkout@v2
|
||||||
|
##########################################################################
|
||||||
|
# SET ENVS ###############################################################
|
||||||
|
##########################################################################
|
||||||
|
- name: ENV - VERSION
|
||||||
|
run: echo "VERSION=$(node -p -e "require('./package.json').version")" >> $GITHUB_ENV
|
||||||
|
- name: ENV - BUILD_DATE
|
||||||
|
run: echo "BUILD_DATE=$(date -u +'%Y-%m-%dT%H:%M:%SZ')" >> $GITHUB_ENV
|
||||||
|
- name: ENV - BUILD_VERSION
|
||||||
|
run: echo "BUILD_VERSION=${VERSION}-${GITHUB_RUN_NUMBER}" >> $GITHUB_ENV
|
||||||
|
- name: ENV - BUILD_COMMIT
|
||||||
|
run: echo "BUILD_COMMIT=${GITHUB_SHA}" >> $GITHUB_ENV
|
||||||
|
##########################################################################
|
||||||
|
# NEO4J ##################################################################
|
||||||
|
##########################################################################
|
||||||
|
- name: Neo4J | Build `community` image
|
||||||
|
run: docker build --target community -t "ocelotsocialnetwork/neo4j:latest" -t "ocelotsocialnetwork/neo4j:community" -t "ocelotsocialnetwork/neo4j:${VERSION}" -t "ocelotsocialnetwork/neo4j:${BUILD_VERSION}" --build-arg BBUILD_DATE=$BUILD_DATE --build-arg BBUILD_VERSION=$BUILD_VERSION --build-arg BBUILD_COMMIT=$BUILD_COMMIT neo4j/
|
||||||
|
- name: Neo4J | Save docker image
|
||||||
|
run: docker save "ocelotsocialnetwork/neo4j" > /tmp/neo4j.tar
|
||||||
|
- name: Upload Artifact
|
||||||
|
uses: actions/upload-artifact@v2
|
||||||
|
with:
|
||||||
|
name: docker-neo4j-community
|
||||||
|
path: /tmp/neo4j.tar
|
||||||
|
|
||||||
|
##############################################################################
|
||||||
|
# JOB: DOCKER BUILD PRODUCTION BACKEND #######################################
|
||||||
|
##############################################################################
|
||||||
|
build_production_backend:
|
||||||
|
name: Docker Build Production - Backend
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
needs: [prepare]
|
||||||
|
steps:
|
||||||
|
##########################################################################
|
||||||
|
# CHECKOUT CODE ##########################################################
|
||||||
|
##########################################################################
|
||||||
|
- name: Checkout code
|
||||||
|
uses: actions/checkout@v2
|
||||||
|
##########################################################################
|
||||||
|
# SET ENVS ###############################################################
|
||||||
|
##########################################################################
|
||||||
|
- name: ENV - VERSION
|
||||||
|
run: echo "VERSION=$(node -p -e "require('./package.json').version")" >> $GITHUB_ENV
|
||||||
|
- name: ENV - BUILD_DATE
|
||||||
|
run: echo "BUILD_DATE=$(date -u +'%Y-%m-%dT%H:%M:%SZ')" >> $GITHUB_ENV
|
||||||
|
- name: ENV - BUILD_VERSION
|
||||||
|
run: echo "BUILD_VERSION=${VERSION}-${GITHUB_RUN_NUMBER}" >> $GITHUB_ENV
|
||||||
|
- name: ENV - BUILD_COMMIT
|
||||||
|
run: echo "BUILD_COMMIT=${GITHUB_SHA}" >> $GITHUB_ENV
|
||||||
|
##########################################################################
|
||||||
|
# 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/
|
||||||
|
- name: Backend | Save docker image
|
||||||
|
run: docker save "ocelotsocialnetwork/backend" > /tmp/backend.tar
|
||||||
|
- name: Upload Artifact
|
||||||
|
uses: actions/upload-artifact@v2
|
||||||
|
with:
|
||||||
|
name: docker-backend-production
|
||||||
|
path: /tmp/backend.tar
|
||||||
|
|
||||||
|
##############################################################################
|
||||||
|
# JOB: DOCKER BUILD PRODUCTION WEBAPP ########################################
|
||||||
|
##############################################################################
|
||||||
|
build_production_webapp:
|
||||||
|
name: Docker Build Production - WebApp
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
needs: [prepare]
|
||||||
|
steps:
|
||||||
|
##########################################################################
|
||||||
|
# CHECKOUT CODE ##########################################################
|
||||||
|
##########################################################################
|
||||||
|
- name: Checkout code
|
||||||
|
uses: actions/checkout@v2
|
||||||
|
##########################################################################
|
||||||
|
# SET ENVS ###############################################################
|
||||||
|
##########################################################################
|
||||||
|
- name: ENV - VERSION
|
||||||
|
run: echo "VERSION=$(node -p -e "require('./package.json').version")" >> $GITHUB_ENV
|
||||||
|
- name: ENV - BUILD_DATE
|
||||||
|
run: echo "BUILD_DATE=$(date -u +'%Y-%m-%dT%H:%M:%SZ')" >> $GITHUB_ENV
|
||||||
|
- name: ENV - BUILD_VERSION
|
||||||
|
run: echo "BUILD_VERSION=${VERSION}-${GITHUB_RUN_NUMBER}" >> $GITHUB_ENV
|
||||||
|
- name: ENV - BUILD_COMMIT
|
||||||
|
run: echo "BUILD_COMMIT=${GITHUB_SHA}" >> $GITHUB_ENV
|
||||||
|
##########################################################################
|
||||||
|
# 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/
|
||||||
|
- name: Webapp | Save docker image
|
||||||
|
run: docker save "ocelotsocialnetwork/webapp" > /tmp/webapp.tar
|
||||||
|
- name: Upload Artifact
|
||||||
|
uses: actions/upload-artifact@v2
|
||||||
|
with:
|
||||||
|
name: docker-webapp-production
|
||||||
|
path: /tmp/webapp.tar
|
||||||
|
|
||||||
|
##############################################################################
|
||||||
|
# JOB: DOCKER BUILD PRODUCTION MAINTENANCE ###################################
|
||||||
|
##############################################################################
|
||||||
|
build_production_maintenance:
|
||||||
|
name: Docker Build Production - Maintenance
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
needs: [prepare]
|
||||||
|
steps:
|
||||||
|
##########################################################################
|
||||||
|
# CHECKOUT CODE ##########################################################
|
||||||
|
##########################################################################
|
||||||
|
- name: Checkout code
|
||||||
|
uses: actions/checkout@v2
|
||||||
|
##########################################################################
|
||||||
|
# SET ENVS ###############################################################
|
||||||
|
##########################################################################
|
||||||
|
- name: ENV - VERSION
|
||||||
|
run: echo "VERSION=$(node -p -e "require('./package.json').version")" >> $GITHUB_ENV
|
||||||
|
- name: ENV - BUILD_DATE
|
||||||
|
run: echo "BUILD_DATE=$(date -u +'%Y-%m-%dT%H:%M:%SZ')" >> $GITHUB_ENV
|
||||||
|
- name: ENV - BUILD_VERSION
|
||||||
|
run: echo "BUILD_VERSION=${VERSION}-${GITHUB_RUN_NUMBER}" >> $GITHUB_ENV
|
||||||
|
- name: ENV - BUILD_COMMIT
|
||||||
|
run: echo "BUILD_COMMIT=${GITHUB_SHA}" >> $GITHUB_ENV
|
||||||
|
##########################################################################
|
||||||
|
# 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
|
||||||
|
- name: Maintenance | Save docker image
|
||||||
|
run: docker save "ocelotsocialnetwork/maintenance" > /tmp/maintenance.tar
|
||||||
|
- name: Upload Artifact
|
||||||
|
uses: actions/upload-artifact@v2
|
||||||
|
with:
|
||||||
|
name: docker-maintenance-production
|
||||||
|
path: /tmp/maintenance.tar
|
||||||
|
|
||||||
|
##############################################################################
|
||||||
|
# JOB: UPLOAD TO DOCKERHUB ###################################################
|
||||||
|
##############################################################################
|
||||||
|
upload_to_dockerhub:
|
||||||
|
name: Upload to Dockerhub
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
needs: [build_production_neo4j,build_production_backend,build_production_webapp,build_production_maintenance]
|
||||||
|
env:
|
||||||
|
DOCKERHUB_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||||
|
DOCKERHUB_TOKEN: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||||
|
steps:
|
||||||
|
##########################################################################
|
||||||
|
# CHECKOUT CODE ##########################################################
|
||||||
|
##########################################################################
|
||||||
|
- name: Checkout code
|
||||||
|
uses: actions/checkout@v2
|
||||||
|
##########################################################################
|
||||||
|
# DOWNLOAD DOCKER IMAGES #################################################
|
||||||
|
##########################################################################
|
||||||
|
- name: Download Docker Image (Neo4J)
|
||||||
|
uses: actions/download-artifact@v2
|
||||||
|
with:
|
||||||
|
name: docker-neo4j-community
|
||||||
|
path: /tmp
|
||||||
|
- name: Load Docker Image
|
||||||
|
run: docker load < /tmp/neo4j.tar
|
||||||
|
- name: Download Docker Image (Backend)
|
||||||
|
uses: actions/download-artifact@v2
|
||||||
|
with:
|
||||||
|
name: docker-backend-production
|
||||||
|
path: /tmp
|
||||||
|
- name: Load Docker Image
|
||||||
|
run: docker load < /tmp/backend.tar
|
||||||
|
- name: Download Docker Image (WebApp)
|
||||||
|
uses: actions/download-artifact@v2
|
||||||
|
with:
|
||||||
|
name: docker-webapp-production
|
||||||
|
path: /tmp
|
||||||
|
- name: Load Docker Image
|
||||||
|
run: docker load < /tmp/webapp.tar
|
||||||
|
- name: Download Docker Image (Maintenance)
|
||||||
|
uses: actions/download-artifact@v2
|
||||||
|
with:
|
||||||
|
name: docker-maintenance-production
|
||||||
|
path: /tmp
|
||||||
|
- name: Load Docker Image
|
||||||
|
run: docker load < /tmp/maintenance.tar
|
||||||
|
##########################################################################
|
||||||
|
# Upload #################################################################
|
||||||
|
##########################################################################
|
||||||
|
- name: login to dockerhub
|
||||||
|
run: echo "${DOCKERHUB_TOKEN}" | docker login -u "${DOCKERHUB_USERNAME}" --password-stdin
|
||||||
|
- name: Push neo4j
|
||||||
|
run: docker push --all-tags ocelotsocialnetwork/neo4j
|
||||||
|
- name: Push backend
|
||||||
|
run: docker push --all-tags ocelotsocialnetwork/backend
|
||||||
|
- name: Push webapp
|
||||||
|
run: docker push --all-tags ocelotsocialnetwork/webapp
|
||||||
|
- name: Push maintenance
|
||||||
|
run: docker push --all-tags ocelotsocialnetwork/maintenance
|
||||||
|
|
||||||
##############################################################################
|
##############################################################################
|
||||||
# JOB: GITHUB TAG LATEST VERSION #############################################
|
# JOB: GITHUB TAG LATEST VERSION #############################################
|
||||||
##############################################################################
|
##############################################################################
|
||||||
github_tag:
|
github_tag:
|
||||||
name: Tag latest version on Github
|
name: Tag latest version on Github
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
needs: [upload_to_dockerhub]
|
||||||
steps:
|
steps:
|
||||||
|
##########################################################################
|
||||||
|
# CHECKOUT CODE ##########################################################
|
||||||
|
##########################################################################
|
||||||
- name: Checkout code
|
- name: Checkout code
|
||||||
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v4.1.7
|
uses: actions/checkout@v2
|
||||||
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
|
# SET ENVS ###############################################################
|
||||||
with:
|
##########################################################################
|
||||||
node-version-file: '.nvmrc'
|
- name: ENV - VERSION
|
||||||
- name: Setup env
|
run: echo "VERSION=$(node -p -e "require('./package.json').version")" >> $GITHUB_ENV
|
||||||
run: |
|
- name: ENV - BUILD_DATE
|
||||||
echo "VERSION=$(node -p -e "require('./package.json').version")" >> $GITHUB_ENV
|
run: echo "BUILD_DATE=$(date -u +'%Y-%m-%dT%H:%M:%SZ')" >> $GITHUB_ENV
|
||||||
echo "BUILD_DATE=$(date -u +'%Y-%m-%dT%H:%M:%SZ')" >> $GITHUB_ENV
|
- name: ENV - BUILD_VERSION
|
||||||
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: ENV - BUILD_COMMIT
|
||||||
|
run: echo "BUILD_COMMIT=${GITHUB_SHA}" >> $GITHUB_ENV
|
||||||
|
##########################################################################
|
||||||
|
# Push version tag to GitHub #############################################
|
||||||
|
##########################################################################
|
||||||
|
# TODO: this will error on duplicate
|
||||||
|
#- name: package-version-to-git-tag
|
||||||
|
# uses: pkgdeps/git-tag-action@v2
|
||||||
|
# with:
|
||||||
|
# github_token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
# github_repo: ${{ github.repository }}
|
||||||
|
# version: ${{ env.VERSION }}
|
||||||
|
# git_commit_sha: ${{ github.sha }}
|
||||||
|
# git_tag_prefix: "v"
|
||||||
|
##########################################################################
|
||||||
|
# Push build tag to GitHub ###############################################
|
||||||
|
##########################################################################
|
||||||
- name: package-version-to-git-tag + build number
|
- name: package-version-to-git-tag + build number
|
||||||
uses: pkgdeps/git-tag-action@v3.0.0 # v3.0.0
|
uses: pkgdeps/git-tag-action@v2
|
||||||
with:
|
with:
|
||||||
github_token: ${{ secrets.GITHUB_TOKEN }}
|
github_token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
github_repo: ${{ github.repository }}
|
github_repo: ${{ github.repository }}
|
||||||
version: ${{ env.BUILD_VERSION }}
|
version: ${{ env.BUILD_VERSION }}
|
||||||
git_commit_sha: ${{ github.sha }}
|
git_commit_sha: ${{ github.sha }}
|
||||||
git_tag_prefix: "b"
|
git_tag_prefix: "b"
|
||||||
- name: Generate changelog
|
##########################################################################
|
||||||
run: |
|
# Push release tag to GitHub #############################################
|
||||||
yarn install
|
##########################################################################
|
||||||
yarn auto-changelog --latest-version ${{ env.VERSION }} --unreleased-only
|
- name: yarn install
|
||||||
|
run: yarn install
|
||||||
|
- name: generate changelog
|
||||||
|
run: yarn auto-changelog --latest-version ${{ env.VERSION }} --unreleased-only
|
||||||
- name: package-version-to-git-release
|
- name: package-version-to-git-release
|
||||||
continue-on-error: true # Will fail if tag exists
|
continue-on-error: true # Will fail if tag exists
|
||||||
id: create_release
|
id: create_release
|
||||||
uses: actions/create-release@4c11c9fe1dcd9636620a16455165783b20fc7ea0 # v1.1.4
|
uses: actions/create-release@v1
|
||||||
env:
|
env:
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # This token is provided by Actions, you do not need to create your own token
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # This token is provided by Actions, you do not need to create your own token
|
||||||
with:
|
with:
|
||||||
@ -51,46 +304,3 @@ jobs:
|
|||||||
body_path: ./CHANGELOG.md
|
body_path: ./CHANGELOG.md
|
||||||
draft: false
|
draft: false
|
||||||
prerelease: false
|
prerelease: false
|
||||||
|
|
||||||
build_trigger:
|
|
||||||
name: Trigger successful build
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
needs: [github_tag]
|
|
||||||
steps:
|
|
||||||
- name: Checkout code
|
|
||||||
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v4.1.7
|
|
||||||
with:
|
|
||||||
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
|
|
||||||
run: |
|
|
||||||
echo "VERSION=$(node -p -e "require('./package.json').version")" >> $GITHUB_ENV
|
|
||||||
echo "BUILD_DATE=$(date -u +'%Y-%m-%dT%H:%M:%SZ')" >> $GITHUB_ENV
|
|
||||||
echo "BUILD_COMMIT=${GITHUB_SHA}" >> $GITHUB_ENV
|
|
||||||
- run: echo "BUILD_VERSION=${VERSION}-${GITHUB_RUN_NUMBER}" >> $GITHUB_ENV
|
|
||||||
#- name: Repository Dispatch
|
|
||||||
# uses: peter-evans/repository-dispatch@f49a8ac5751834a0666df77deb0289abbe2b3a78 # v3.0.0
|
|
||||||
# with:
|
|
||||||
# token: ${{ github.token }}
|
|
||||||
# event-type: trigger-ocelot-build-success
|
|
||||||
# repository: ${{ github.repository }}
|
|
||||||
# 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
|
|
||||||
uses: peter-evans/repository-dispatch@f49a8ac5751834a0666df77deb0289abbe2b3a78 # v3.0.0
|
|
||||||
with:
|
|
||||||
token: ${{ secrets.OCELOT_PUBLISH_EVENT_PAT }} # this token is required to access the other repository
|
|
||||||
event-type: trigger-ocelot-build-success
|
|
||||||
repository: 'Ocelot-Social-Community/stage.ocelot.social'
|
|
||||||
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
|
|
||||||
uses: peter-evans/repository-dispatch@f49a8ac5751834a0666df77deb0289abbe2b3a78 # v3.0.0
|
|
||||||
with:
|
|
||||||
token: ${{ secrets.OCELOT_PUBLISH_EVENT_PAT }} # this token is required to access the other repository
|
|
||||||
event-type: trigger-ocelot-build-success
|
|
||||||
repository: 'Yunite-Net/stage.yunite.me'
|
|
||||||
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}"}'
|
|
||||||
|
|||||||
129
.github/workflows/test-backend.yml
vendored
@ -1,129 +0,0 @@
|
|||||||
name: ocelot.social backend test CI
|
|
||||||
|
|
||||||
|
|
||||||
on: push
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
files-changed:
|
|
||||||
name: Detect File Changes - Backend
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
outputs:
|
|
||||||
backend: ${{ steps.changes.outputs.backend }}
|
|
||||||
docker: ${{ steps.changes.outputs.docker }}
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v4.1.7
|
|
||||||
|
|
||||||
- name: Check for backend 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_test_neo4j:
|
|
||||||
name: Docker Build Test - Neo4J
|
|
||||||
if: needs.files-changed.outputs.backend == 'true' || needs.files-changed.outputs.docker == 'true'
|
|
||||||
needs: files-changed
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- name: Checkout code
|
|
||||||
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v4.1.7
|
|
||||||
|
|
||||||
- name: Neo4J | Build 'community' image
|
|
||||||
run: |
|
|
||||||
docker compose -f docker-compose.yml -f docker-compose.test.yml build neo4j
|
|
||||||
docker save "ghcr.io/ocelot-social-community/ocelot-social/neo4j:community" > /tmp/neo4j.tar
|
|
||||||
|
|
||||||
- name: Cache docker images
|
|
||||||
id: cache-neo4j
|
|
||||||
uses: actions/cache@cdf6c1fa76f9f475f3d7449005a359c84ca0f306 # v4.0.2
|
|
||||||
with:
|
|
||||||
path: /tmp/neo4j.tar
|
|
||||||
key: ${{ github.run_id }}-backend-neo4j-cache
|
|
||||||
|
|
||||||
build_test_backend:
|
|
||||||
name: Docker Build Test - Backend
|
|
||||||
if: needs.files-changed.outputs.backend == 'true' || needs.files-changed.outputs.docker == 'true'
|
|
||||||
needs: files-changed
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- name: Checkout code
|
|
||||||
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v4.1.7
|
|
||||||
|
|
||||||
- name: backend | Build 'test' image
|
|
||||||
run: |
|
|
||||||
docker compose -f docker-compose.yml -f docker-compose.test.yml build backend
|
|
||||||
docker save "ghcr.io/ocelot-social-community/ocelot-social/backend:test" > /tmp/backend.tar
|
|
||||||
|
|
||||||
- name: Cache docker images
|
|
||||||
id: cache-backend
|
|
||||||
uses: actions/cache@cdf6c1fa76f9f475f3d7449005a359c84ca0f306 # v4.0.2
|
|
||||||
with:
|
|
||||||
path: /tmp/backend.tar
|
|
||||||
key: ${{ github.run_id }}-backend-cache
|
|
||||||
|
|
||||||
lint_backend:
|
|
||||||
name: Lint Backend
|
|
||||||
if: needs.files-changed.outputs.backend == 'true'
|
|
||||||
needs: files-changed
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- name: Checkout code
|
|
||||||
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
|
|
||||||
run: cd backend && yarn && yarn run lint
|
|
||||||
|
|
||||||
unit_test_backend:
|
|
||||||
name: Unit tests - Backend
|
|
||||||
if: needs.files-changed.outputs.backend == 'true' || needs.files-changed.outputs.docker == 'true'
|
|
||||||
needs: [files-changed, build_test_neo4j, build_test_backend]
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
permissions:
|
|
||||||
checks: write
|
|
||||||
steps:
|
|
||||||
- name: Checkout code
|
|
||||||
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v4.1.7
|
|
||||||
|
|
||||||
- name: Restore Neo4J cache
|
|
||||||
uses: actions/cache@cdf6c1fa76f9f475f3d7449005a359c84ca0f306 # v4.0.2
|
|
||||||
with:
|
|
||||||
path: /tmp/neo4j.tar
|
|
||||||
key: ${{ github.run_id }}-backend-neo4j-cache
|
|
||||||
fail-on-cache-miss: true
|
|
||||||
|
|
||||||
- name: Restore Backend cache
|
|
||||||
uses: actions/cache@cdf6c1fa76f9f475f3d7449005a359c84ca0f306 # v4.0.2
|
|
||||||
with:
|
|
||||||
path: /tmp/backend.tar
|
|
||||||
key: ${{ github.run_id }}-backend-cache
|
|
||||||
fail-on-cache-miss: true
|
|
||||||
|
|
||||||
- name: Load Docker Images
|
|
||||||
run: |
|
|
||||||
docker load < /tmp/neo4j.tar
|
|
||||||
docker load < /tmp/backend.tar
|
|
||||||
|
|
||||||
- name: backend | copy env files
|
|
||||||
run: |
|
|
||||||
cp webapp/.env.template webapp/.env
|
|
||||||
cp backend/.env.template backend/.env
|
|
||||||
|
|
||||||
- name: backend | docker compose
|
|
||||||
run: docker compose -f docker-compose.yml -f docker-compose.test.yml up --detach backend
|
|
||||||
|
|
||||||
- name: backend | Initialize Database
|
|
||||||
run: docker compose exec -T backend yarn db:migrate init
|
|
||||||
|
|
||||||
- name: backend | Migrate Database Up
|
|
||||||
run: docker compose exec -T backend yarn db:migrate up
|
|
||||||
|
|
||||||
- name: backend | Unit test incl. coverage check
|
|
||||||
run: docker compose exec -T backend yarn test
|
|
||||||
|
|
||||||
215
.github/workflows/test-e2e.yml
vendored
@ -1,215 +0,0 @@
|
|||||||
name: ocelot.social end-to-end test CI
|
|
||||||
|
|
||||||
on: push
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
prepare_backend_environment:
|
|
||||||
name: Fullstack | prepare backend environment
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- name: Checkout code
|
|
||||||
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v4.2.2
|
|
||||||
|
|
||||||
- name: Copy backend env file
|
|
||||||
run: |
|
|
||||||
cp backend/.env.test_e2e backend/.env
|
|
||||||
cp webapp/.env.template webapp/.env
|
|
||||||
|
|
||||||
- name: Build backend and dependencies
|
|
||||||
run: |
|
|
||||||
# Build and start all required images for backend
|
|
||||||
docker compose -f docker-compose.yml -f docker-compose.test.yml up --detach neo4j backend --build
|
|
||||||
|
|
||||||
# Save the build images
|
|
||||||
docker save "ghcr.io/ocelot-social-community/ocelot-social/backend:test" > /tmp/backend.tar
|
|
||||||
docker save "ghcr.io/ocelot-social-community/ocelot-social/neo4j:community" > /tmp/neo4j.tar
|
|
||||||
docker save "quay.io/minio/minio:latest" > /tmp/minio.tar
|
|
||||||
docker save "quay.io/minio/mc:latest" > /tmp/minio-mc.tar
|
|
||||||
docker save "maildev/maildev:latest" > /tmp/mailserver.tar
|
|
||||||
|
|
||||||
# Stop the containers
|
|
||||||
docker compose -f docker-compose.yml -f docker-compose.test.yml down
|
|
||||||
|
|
||||||
- name: Cache docker images
|
|
||||||
uses: actions/cache@cdf6c1fa76f9f475f3d7449005a359c84ca0f306 # v4.0.2
|
|
||||||
with:
|
|
||||||
path: |
|
|
||||||
/tmp/backend.tar
|
|
||||||
/tmp/neo4j.tar
|
|
||||||
/tmp/minio.tar
|
|
||||||
/tmp/minio-mc.tar
|
|
||||||
/tmp/mailserver.tar
|
|
||||||
key: ${{ github.run_id }}-e2e-backend-environment-cache
|
|
||||||
|
|
||||||
prepare_webapp_image:
|
|
||||||
name: Fullstack | prepare webapp image
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- name: Checkout code
|
|
||||||
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v4.2.2
|
|
||||||
|
|
||||||
- name: Copy backend env file
|
|
||||||
run: |
|
|
||||||
cp backend/.env.test_e2e backend/.env
|
|
||||||
cp webapp/.env.template webapp/.env
|
|
||||||
|
|
||||||
- name: Build docker image
|
|
||||||
run: |
|
|
||||||
docker compose -f docker-compose.yml -f docker-compose.test.yml up --detach webapp --build --no-deps
|
|
||||||
docker save "ghcr.io/ocelot-social-community/ocelot-social/webapp:test" > /tmp/webapp.tar
|
|
||||||
|
|
||||||
- name: Cache docker image
|
|
||||||
uses: actions/cache@cdf6c1fa76f9f475f3d7449005a359c84ca0f306 # v4.0.2
|
|
||||||
with:
|
|
||||||
path: /tmp/webapp.tar
|
|
||||||
key: ${{ github.run_id }}-e2e-webapp-cache
|
|
||||||
|
|
||||||
prepare_cypress:
|
|
||||||
name: Fullstack | prepare cypress
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- name: Delete huge unnecessary tools folder
|
|
||||||
run: rm -rf /opt/hostedtoolcache
|
|
||||||
|
|
||||||
- name: Checkout code
|
|
||||||
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v4.2.2
|
|
||||||
|
|
||||||
- name: Setup Node.js
|
|
||||||
uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v4.4.0
|
|
||||||
with:
|
|
||||||
node-version-file: 'backend/.nvmrc'
|
|
||||||
cache: 'yarn'
|
|
||||||
|
|
||||||
- name: Copy env files
|
|
||||||
run: |
|
|
||||||
cp webapp/.env.template webapp/.env
|
|
||||||
cp backend/.env.test_e2e backend/.env
|
|
||||||
|
|
||||||
- name: Install cypress requirements
|
|
||||||
run: |
|
|
||||||
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
|
|
||||||
yarn install
|
|
||||||
yarn build
|
|
||||||
cd ..
|
|
||||||
yarn install
|
|
||||||
|
|
||||||
- name: Cache docker image
|
|
||||||
|
|
||||||
uses: actions/cache@cdf6c1fa76f9f475f3d7449005a359c84ca0f306 # v4.0.2
|
|
||||||
with:
|
|
||||||
path: |
|
|
||||||
/opt/cucumber-json-formatter
|
|
||||||
/home/runner/.cache/Cypress
|
|
||||||
/home/runner/work/Ocelot-Social/Ocelot-Social
|
|
||||||
key: ${{ github.run_id }}-e2e-cypress
|
|
||||||
|
|
||||||
list_features:
|
|
||||||
name: List Feature Files
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
outputs:
|
|
||||||
features: ${{ steps.list.outputs.features }}
|
|
||||||
steps:
|
|
||||||
- name: Checkout code
|
|
||||||
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v4.2.2
|
|
||||||
|
|
||||||
- name: List feature files
|
|
||||||
id: list
|
|
||||||
run: |
|
|
||||||
FEATURES=$(find cypress/e2e/ -maxdepth 1 -name "*.feature" -printf '%f\n' | sort | jq -R -s -c 'split("\n") | map(select(length > 0))')
|
|
||||||
echo "features=$FEATURES" >> $GITHUB_OUTPUT
|
|
||||||
|
|
||||||
fullstack_tests:
|
|
||||||
name: E2E | ${{ matrix.feature }}
|
|
||||||
if: success()
|
|
||||||
needs: [prepare_backend_environment, prepare_webapp_image, prepare_cypress, list_features]
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
strategy:
|
|
||||||
fail-fast: false
|
|
||||||
matrix:
|
|
||||||
feature: ${{ fromJson(needs.list_features.outputs.features) }}
|
|
||||||
steps:
|
|
||||||
- name: Delete huge unnecessary tools folder
|
|
||||||
run: rm -rf /opt/hostedtoolcache
|
|
||||||
|
|
||||||
- name: Checkout code
|
|
||||||
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v4.2.2
|
|
||||||
|
|
||||||
- name: Setup Node.js
|
|
||||||
uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v4.4.0
|
|
||||||
with:
|
|
||||||
node-version-file: 'backend/.nvmrc'
|
|
||||||
cache: 'yarn'
|
|
||||||
|
|
||||||
- name: Restore cypress cache
|
|
||||||
uses: actions/cache@cdf6c1fa76f9f475f3d7449005a359c84ca0f306 # v4.0.2
|
|
||||||
with:
|
|
||||||
path: |
|
|
||||||
/opt/cucumber-json-formatter
|
|
||||||
/home/runner/.cache/Cypress
|
|
||||||
/home/runner/work/Ocelot-Social/Ocelot-Social
|
|
||||||
key: ${{ github.run_id }}-e2e-cypress
|
|
||||||
restore-keys: ${{ github.run_id }}-e2e-cypress
|
|
||||||
|
|
||||||
- name: Restore backend environment cache
|
|
||||||
uses: actions/cache@cdf6c1fa76f9f475f3d7449005a359c84ca0f306 # v4.0.2
|
|
||||||
with:
|
|
||||||
path: |
|
|
||||||
/tmp/backend.tar
|
|
||||||
/tmp/neo4j.tar
|
|
||||||
/tmp/minio.tar
|
|
||||||
/tmp/minio-mc.tar
|
|
||||||
/tmp/mailserver.tar
|
|
||||||
key: ${{ github.run_id }}-e2e-backend-environment-cache
|
|
||||||
|
|
||||||
- name: Restore webapp cache
|
|
||||||
uses: actions/cache@cdf6c1fa76f9f475f3d7449005a359c84ca0f306 # v4.0.2
|
|
||||||
with:
|
|
||||||
path: /tmp/webapp.tar
|
|
||||||
key: ${{ github.run_id }}-e2e-webapp-cache
|
|
||||||
|
|
||||||
- name: Boot up test system | docker compose
|
|
||||||
run: |
|
|
||||||
chmod +x /opt/cucumber-json-formatter
|
|
||||||
sudo ln -fs /opt/cucumber-json-formatter /usr/bin/cucumber-json-formatter
|
|
||||||
docker load < /tmp/neo4j.tar
|
|
||||||
docker load < /tmp/backend.tar
|
|
||||||
docker load < /tmp/minio.tar
|
|
||||||
docker load < /tmp/minio-mc.tar
|
|
||||||
docker load < /tmp/mailserver.tar
|
|
||||||
docker load < /tmp/webapp.tar
|
|
||||||
docker compose -f docker-compose.yml -f docker-compose.test.yml up --detach backend mailserver webapp
|
|
||||||
sleep 90s
|
|
||||||
|
|
||||||
- name: Full stack tests | run tests
|
|
||||||
id: e2e-tests
|
|
||||||
run: yarn run cypress:run --spec "cypress/e2e/${{ matrix.feature }}"
|
|
||||||
|
|
||||||
- name: Full stack tests | if tests failed, compile html report
|
|
||||||
if: ${{ failure() && steps.e2e-tests.conclusion == 'failure' }}
|
|
||||||
run: |
|
|
||||||
cd cypress/
|
|
||||||
node create-cucumber-html-report.js
|
|
||||||
|
|
||||||
- name: Full stack tests | if tests failed, upload report
|
|
||||||
id: e2e-report
|
|
||||||
if: ${{ failure() && steps.e2e-tests.conclusion == 'failure' }}
|
|
||||||
uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0
|
|
||||||
with:
|
|
||||||
name: e2e-report-${{ matrix.feature }}
|
|
||||||
path: /home/runner/work/Ocelot-Social/Ocelot-Social/cypress/reports/cucumber_html_report
|
|
||||||
|
|
||||||
e2e_status:
|
|
||||||
name: E2E | Status
|
|
||||||
if: always()
|
|
||||||
needs: [fullstack_tests]
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- name: Check E2E results
|
|
||||||
run: |
|
|
||||||
if [ "${{ needs.fullstack_tests.result }}" != "success" ]; then
|
|
||||||
echo "E2E tests failed or were cancelled (result: ${{ needs.fullstack_tests.result }})"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
109
.github/workflows/test-webapp.yml
vendored
@ -1,109 +0,0 @@
|
|||||||
name: ocelot.social webapp test CI
|
|
||||||
|
|
||||||
|
|
||||||
on: push
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
files-changed:
|
|
||||||
name: Detect File Changes - Webapp
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
outputs:
|
|
||||||
docker: ${{ steps.changes.outputs.docker }}
|
|
||||||
webapp: ${{ steps.changes.outputs.webapp }}
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # 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
|
|
||||||
|
|
||||||
prepare:
|
|
||||||
name: Prepare
|
|
||||||
if: needs.files-changed.outputs.webapp == 'true'
|
|
||||||
needs: files-changed
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- name: Checkout code
|
|
||||||
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
|
|
||||||
run: |
|
|
||||||
scripts/translations/sort.sh
|
|
||||||
scripts/translations/missing-keys.sh
|
|
||||||
|
|
||||||
build_test_webapp:
|
|
||||||
name: Docker Build Test - Webapp
|
|
||||||
if: needs.files-changed.outputs.docker == 'true' || needs.files-changed.outputs.webapp == 'true'
|
|
||||||
needs: [files-changed, prepare]
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- name: Checkout code
|
|
||||||
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v4.1.7
|
|
||||||
|
|
||||||
- name: Webapp | Build 'test' image
|
|
||||||
run: |
|
|
||||||
docker build --target test -f webapp/Dockerfile -t "ghcr.io/ocelot-social-community/ocelot-social/webapp:test" .
|
|
||||||
docker save "ghcr.io/ocelot-social-community/ocelot-social/webapp:test" > /tmp/webapp.tar
|
|
||||||
|
|
||||||
- name: Cache docker image
|
|
||||||
uses: actions/cache@cdf6c1fa76f9f475f3d7449005a359c84ca0f306 # v4.0.2
|
|
||||||
with:
|
|
||||||
path: /tmp/webapp.tar
|
|
||||||
key: ${{ github.run_id }}-webapp-cache
|
|
||||||
|
|
||||||
lint_webapp:
|
|
||||||
name: Lint Webapp
|
|
||||||
if: needs.files-changed.outputs.webapp == 'true'
|
|
||||||
needs: files-changed
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- name: Checkout code
|
|
||||||
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
|
|
||||||
run: cd webapp && yarn && yarn run lint
|
|
||||||
|
|
||||||
unit_test_webapp:
|
|
||||||
name: Unit Tests - Webapp
|
|
||||||
if: needs.files-changed.outputs.docker == 'true' || needs.files-changed.outputs.webapp == 'true'
|
|
||||||
needs: [files-changed, build_test_webapp]
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
permissions:
|
|
||||||
checks: write
|
|
||||||
steps:
|
|
||||||
- name: Checkout code
|
|
||||||
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v4.1.7
|
|
||||||
|
|
||||||
- name: Restore webapp cache
|
|
||||||
uses: actions/cache@cdf6c1fa76f9f475f3d7449005a359c84ca0f306 # v4.0.2
|
|
||||||
with:
|
|
||||||
path: /tmp/webapp.tar
|
|
||||||
key: ${{ github.run_id }}-webapp-cache
|
|
||||||
|
|
||||||
- name: Load Docker Image
|
|
||||||
run: docker load < /tmp/webapp.tar
|
|
||||||
|
|
||||||
- name: Copy env files
|
|
||||||
run: |
|
|
||||||
cp webapp/.env.template webapp/.env
|
|
||||||
cp backend/.env.template backend/.env
|
|
||||||
|
|
||||||
- name: Start webapp container
|
|
||||||
run: docker compose -f docker-compose.yml -f docker-compose.test.yml up --detach --no-deps webapp
|
|
||||||
|
|
||||||
- name: webapp | Unit tests incl. coverage check
|
|
||||||
run: docker compose exec -T webapp yarn test
|
|
||||||
81
.github/workflows/test.lint_pr.yml
vendored
@ -1,81 +0,0 @@
|
|||||||
name: "test:lint pull request CI"
|
|
||||||
|
|
||||||
on:
|
|
||||||
pull_request_target:
|
|
||||||
types:
|
|
||||||
- opened
|
|
||||||
- edited
|
|
||||||
- synchronize
|
|
||||||
|
|
||||||
permissions:
|
|
||||||
pull-requests: write
|
|
||||||
statuses: write
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
main:
|
|
||||||
name: Validate PR title
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
if: ${{ github.actor != 'dependabot[bot]' }}
|
|
||||||
steps:
|
|
||||||
- uses: amannn/action-semantic-pull-request@069817c298f23fab00a8f29a2e556a5eac0f6390 # v5.5.3
|
|
||||||
env:
|
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
with:
|
|
||||||
# Configure which types are allowed (newline delimited).
|
|
||||||
# Default: https://github.com/commitizen/conventional-commit-types
|
|
||||||
#types: |
|
|
||||||
# fix
|
|
||||||
# feat
|
|
||||||
# Configure which scopes are allowed (newline delimited).
|
|
||||||
scopes: |
|
|
||||||
backend
|
|
||||||
package/ui
|
|
||||||
webapp
|
|
||||||
maintenance
|
|
||||||
database
|
|
||||||
e2e
|
|
||||||
docu
|
|
||||||
docker
|
|
||||||
release
|
|
||||||
workflow
|
|
||||||
other
|
|
||||||
# Configure that a scope must always be provided.
|
|
||||||
requireScope: true
|
|
||||||
# Configure which scopes (newline delimited) are disallowed in PR
|
|
||||||
# titles. For instance by setting # the value below, `chore(release):
|
|
||||||
# ...` and `ci(e2e,release): ...` will be rejected.
|
|
||||||
#disallowScopes: |
|
|
||||||
# release
|
|
||||||
# Configure additional validation for the subject based on a regex.
|
|
||||||
# This example ensures the subject doesn't start with an uppercase character.
|
|
||||||
subjectPattern: ^(?![A-Z]).+$
|
|
||||||
# If `subjectPattern` is configured, you can use this property to override
|
|
||||||
# the default error message that is shown when the pattern doesn't match.
|
|
||||||
# The variables `subject` and `title` can be used within the message.
|
|
||||||
subjectPatternError: |
|
|
||||||
The subject "{subject}" found in the pull request title "{title}"
|
|
||||||
didn't match the configured pattern. Please ensure that the subject
|
|
||||||
doesn't start with an uppercase character.
|
|
||||||
# If you use GitHub Enterprise, you can set this to the URL of your server
|
|
||||||
#githubBaseUrl: https://github.myorg.com/api/v3
|
|
||||||
# If the PR contains one of these labels (newline delimited), the
|
|
||||||
# validation is skipped.
|
|
||||||
# If you want to rerun the validation when labels change, you might want
|
|
||||||
# to use the `labeled` and `unlabeled` event triggers in your workflow.
|
|
||||||
#ignoreLabels: |
|
|
||||||
# bot
|
|
||||||
# ignore-semantic-pull-request
|
|
||||||
# If you're using a format for the PR title that differs from the traditional Conventional
|
|
||||||
# Commits spec, you can use these options to customize the parsing of the type, scope and
|
|
||||||
# subject. The `headerPattern` should contain a regex where the capturing groups in parentheses
|
|
||||||
# correspond to the parts listed in `headerPatternCorrespondence`.
|
|
||||||
# See: https://github.com/conventional-changelog/conventional-changelog/tree/master/packages/conventional-commits-parser#headerpattern
|
|
||||||
headerPattern: '^(\w*)(?:\(([\w$.\-*/ ]*)\))?: (.*)$'
|
|
||||||
headerPatternCorrespondence: type, scope, subject
|
|
||||||
# For work-in-progress PRs you can typically use draft pull requests
|
|
||||||
# from GitHub. However, private repositories on the free plan don't have
|
|
||||||
# this option and therefore this action allows you to opt-in to using the
|
|
||||||
# special "[WIP]" prefix to indicate this state. This will avoid the
|
|
||||||
# validation of the PR title and the pull request checks remain pending.
|
|
||||||
# Note that a second check will be reported if this is enabled.
|
|
||||||
wip: true
|
|
||||||
341
.github/workflows/test.yml
vendored
Normal file
@ -0,0 +1,341 @@
|
|||||||
|
name: ocelot.social test CI
|
||||||
|
|
||||||
|
|
||||||
|
on: [push]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
##############################################################################
|
||||||
|
# JOB: PREPARE #####################################################
|
||||||
|
##############################################################################
|
||||||
|
prepare:
|
||||||
|
name: Prepare
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
# needs: [nothing]
|
||||||
|
steps:
|
||||||
|
##########################################################################
|
||||||
|
# CHECKOUT CODE ##########################################################
|
||||||
|
##########################################################################
|
||||||
|
- name: Checkout code
|
||||||
|
uses: actions/checkout@v2
|
||||||
|
##########################################################################
|
||||||
|
# TODO: DO STUFF ??? #####################################################
|
||||||
|
##########################################################################
|
||||||
|
- name: Check translation files
|
||||||
|
run: |
|
||||||
|
scripts/translations/sort.sh
|
||||||
|
scripts/translations/missing-keys.sh
|
||||||
|
|
||||||
|
##############################################################################
|
||||||
|
# JOB: DOCKER BUILD TEST NEO4J ###############################################
|
||||||
|
##############################################################################
|
||||||
|
build_test_neo4j:
|
||||||
|
name: Docker Build Test - Neo4J
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
needs: [prepare]
|
||||||
|
steps:
|
||||||
|
##########################################################################
|
||||||
|
# CHECKOUT CODE ##########################################################
|
||||||
|
##########################################################################
|
||||||
|
- name: Checkout code
|
||||||
|
uses: actions/checkout@v2
|
||||||
|
##########################################################################
|
||||||
|
# NEO4J ##################################################################
|
||||||
|
##########################################################################
|
||||||
|
- name: Neo4J | Build `community` image
|
||||||
|
run: |
|
||||||
|
docker build --target community -t "ocelotsocialnetwork/neo4j:community" neo4j/
|
||||||
|
docker save "ocelotsocialnetwork/neo4j:community" > /tmp/neo4j.tar
|
||||||
|
- name: Upload Artifact
|
||||||
|
uses: actions/upload-artifact@v2
|
||||||
|
with:
|
||||||
|
name: docker-neo4j-image
|
||||||
|
path: /tmp/neo4j.tar
|
||||||
|
|
||||||
|
##############################################################################
|
||||||
|
# JOB: DOCKER BUILD TEST BACKEND #############################################
|
||||||
|
##############################################################################
|
||||||
|
build_test_backend:
|
||||||
|
name: Docker Build Test - Backend
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
needs: [prepare]
|
||||||
|
steps:
|
||||||
|
##########################################################################
|
||||||
|
# CHECKOUT CODE ##########################################################
|
||||||
|
##########################################################################
|
||||||
|
- name: Checkout code
|
||||||
|
uses: actions/checkout@v2
|
||||||
|
##########################################################################
|
||||||
|
# BUILD BACKEND DOCKER IMAGE (build) #####################################
|
||||||
|
##########################################################################
|
||||||
|
- name: backend | Build `test` image
|
||||||
|
run: |
|
||||||
|
docker build --target test -t "ocelotsocialnetwork/backend:test" backend/
|
||||||
|
docker save "ocelotsocialnetwork/backend:test" > /tmp/backend.tar
|
||||||
|
- name: Upload Artifact
|
||||||
|
uses: actions/upload-artifact@v2
|
||||||
|
with:
|
||||||
|
name: docker-backend-test
|
||||||
|
path: /tmp/backend.tar
|
||||||
|
|
||||||
|
##############################################################################
|
||||||
|
# JOB: DOCKER BUILD TEST WEBAPP ##############################################
|
||||||
|
##############################################################################
|
||||||
|
build_test_webapp:
|
||||||
|
name: Docker Build Test - WebApp
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
needs: [prepare]
|
||||||
|
steps:
|
||||||
|
##########################################################################
|
||||||
|
# CHECKOUT CODE ##########################################################
|
||||||
|
##########################################################################
|
||||||
|
- name: Checkout code
|
||||||
|
uses: actions/checkout@v2
|
||||||
|
##########################################################################
|
||||||
|
# BUILD WEBAPP DOCKER IMAGE (build) ######################################
|
||||||
|
##########################################################################
|
||||||
|
- name: webapp | Build `test` image
|
||||||
|
run: |
|
||||||
|
docker build --target test -t "ocelotsocialnetwork/webapp:test" webapp/
|
||||||
|
docker save "ocelotsocialnetwork/webapp:test" > /tmp/webapp.tar
|
||||||
|
- name: Upload Artifact
|
||||||
|
uses: actions/upload-artifact@v2
|
||||||
|
with:
|
||||||
|
name: docker-webapp-test
|
||||||
|
path: /tmp/webapp.tar
|
||||||
|
|
||||||
|
##############################################################################
|
||||||
|
# JOB: LINT BACKEND ##########################################################
|
||||||
|
##############################################################################
|
||||||
|
lint_backend:
|
||||||
|
name: Lint backend
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
needs: [build_test_backend]
|
||||||
|
steps:
|
||||||
|
##########################################################################
|
||||||
|
# CHECKOUT CODE ##########################################################
|
||||||
|
##########################################################################
|
||||||
|
- name: Checkout code
|
||||||
|
uses: actions/checkout@v2
|
||||||
|
##########################################################################
|
||||||
|
# DOWNLOAD DOCKER IMAGE ##################################################
|
||||||
|
##########################################################################
|
||||||
|
- name: Download Docker Image (Backend)
|
||||||
|
uses: actions/download-artifact@v2
|
||||||
|
with:
|
||||||
|
name: docker-backend-test
|
||||||
|
path: /tmp
|
||||||
|
- name: Load Docker Image
|
||||||
|
run: docker load < /tmp/backend.tar
|
||||||
|
##########################################################################
|
||||||
|
# LINT BACKEND ###########################################################
|
||||||
|
##########################################################################
|
||||||
|
- name: backend | Lint
|
||||||
|
run: docker run --rm ocelotsocialnetwork/backend:test yarn run lint
|
||||||
|
|
||||||
|
##############################################################################
|
||||||
|
# JOB: LINT WEBAPP ###########################################################
|
||||||
|
##############################################################################
|
||||||
|
lint_webapp:
|
||||||
|
name: Lint webapp
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
needs: [build_test_webapp]
|
||||||
|
steps:
|
||||||
|
##########################################################################
|
||||||
|
# CHECKOUT CODE ##########################################################
|
||||||
|
##########################################################################
|
||||||
|
- name: Checkout code
|
||||||
|
uses: actions/checkout@v2
|
||||||
|
##########################################################################
|
||||||
|
# DOWNLOAD DOCKER IMAGE ##################################################
|
||||||
|
##########################################################################
|
||||||
|
- name: Download Docker Image (Webapp)
|
||||||
|
uses: actions/download-artifact@v2
|
||||||
|
with:
|
||||||
|
name: docker-webapp-test
|
||||||
|
path: /tmp
|
||||||
|
- name: Load Docker Image
|
||||||
|
run: docker load < /tmp/webapp.tar
|
||||||
|
##########################################################################
|
||||||
|
# LINT WEBAPP ############################################################
|
||||||
|
##########################################################################
|
||||||
|
- name: webapp | Lint
|
||||||
|
run: docker run --rm ocelotsocialnetwork/webapp:test yarn run lint
|
||||||
|
|
||||||
|
##############################################################################
|
||||||
|
# JOB: UNIT TEST BACKEND #####################################################
|
||||||
|
##############################################################################
|
||||||
|
unit_test_backend:
|
||||||
|
name: Unit tests - backend
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
needs: [build_test_neo4j,build_test_backend]
|
||||||
|
steps:
|
||||||
|
##########################################################################
|
||||||
|
# CHECKOUT CODE ##########################################################
|
||||||
|
##########################################################################
|
||||||
|
- name: Checkout code
|
||||||
|
uses: actions/checkout@v2
|
||||||
|
##########################################################################
|
||||||
|
# DOWNLOAD DOCKER IMAGES #################################################
|
||||||
|
##########################################################################
|
||||||
|
- name: Download Docker Image (Neo4J)
|
||||||
|
uses: actions/download-artifact@v2
|
||||||
|
with:
|
||||||
|
name: docker-neo4j-image
|
||||||
|
path: /tmp
|
||||||
|
- name: Load Docker Image
|
||||||
|
run: docker load < /tmp/neo4j.tar
|
||||||
|
- name: Download Docker Image (Backend)
|
||||||
|
uses: actions/download-artifact@v2
|
||||||
|
with:
|
||||||
|
name: docker-backend-test
|
||||||
|
path: /tmp
|
||||||
|
- name: Load Docker Image
|
||||||
|
run: docker load < /tmp/backend.tar
|
||||||
|
##########################################################################
|
||||||
|
# UNIT TESTS BACKEND #####################################################
|
||||||
|
##########################################################################
|
||||||
|
- name: backend | copy env files webapp
|
||||||
|
run: cp webapp/.env.template webapp/.env
|
||||||
|
- name: backend | copy env files backend
|
||||||
|
run: cp backend/.env.template backend/.env
|
||||||
|
- name: backend | docker-compose
|
||||||
|
run: docker-compose -f docker-compose.yml -f docker-compose.test.yml up --detach --no-deps neo4j backend
|
||||||
|
- name: backend | Initialize Database
|
||||||
|
run: docker-compose exec -T backend yarn db:migrate init
|
||||||
|
- name: backend | Unit test
|
||||||
|
run: docker-compose exec -T backend yarn test
|
||||||
|
##########################################################################
|
||||||
|
# COVERAGE CHECK BACKEND #################################################
|
||||||
|
##########################################################################
|
||||||
|
- name: backend | Coverage check
|
||||||
|
uses: webcraftmedia/coverage-check-action@master
|
||||||
|
with:
|
||||||
|
report_name: Coverage Backend
|
||||||
|
type: lcov
|
||||||
|
result_path: ./coverage/lcov.info
|
||||||
|
min_coverage: 58
|
||||||
|
token: ${{ github.token }}
|
||||||
|
|
||||||
|
##############################################################################
|
||||||
|
# JOB: UNIT TEST WEBAPP ######################################################
|
||||||
|
##############################################################################
|
||||||
|
unit_test_webapp:
|
||||||
|
name: Unit tests - webapp
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
needs: [build_test_webapp]
|
||||||
|
steps:
|
||||||
|
##########################################################################
|
||||||
|
# CHECKOUT CODE ##########################################################
|
||||||
|
##########################################################################
|
||||||
|
- name: Checkout code
|
||||||
|
uses: actions/checkout@v2
|
||||||
|
##########################################################################
|
||||||
|
# DOWNLOAD DOCKER IMAGES #################################################
|
||||||
|
##########################################################################
|
||||||
|
- name: Download Docker Image (Webapp)
|
||||||
|
uses: actions/download-artifact@v2
|
||||||
|
with:
|
||||||
|
name: docker-webapp-test
|
||||||
|
path: /tmp
|
||||||
|
- name: Load Docker Image
|
||||||
|
run: docker load < /tmp/webapp.tar
|
||||||
|
##########################################################################
|
||||||
|
# UNIT TESTS WEBAPP ######################################################
|
||||||
|
##########################################################################
|
||||||
|
- name: backend | copy env files webapp
|
||||||
|
run: cp webapp/.env.template webapp/.env
|
||||||
|
- name: backend | copy env files backend
|
||||||
|
run: cp backend/.env.template backend/.env
|
||||||
|
- name: backend | docker-compose
|
||||||
|
run: docker-compose -f docker-compose.yml -f docker-compose.test.yml up --detach --no-deps webapp
|
||||||
|
- name: webapp | Unit tests
|
||||||
|
run: docker-compose exec -T webapp yarn test
|
||||||
|
##########################################################################
|
||||||
|
# COVERAGE REPORT FRONTEND ################################################
|
||||||
|
##########################################################################
|
||||||
|
#- name: frontend | Coverage report
|
||||||
|
# uses: romeovs/lcov-reporter-action@v0.2.21
|
||||||
|
# with:
|
||||||
|
# github-token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
# lcov-file: ./coverage/lcov.info
|
||||||
|
##########################################################################
|
||||||
|
# COVERAGE CHECK WEBAPP ##################################################
|
||||||
|
##########################################################################
|
||||||
|
- name: webapp | Coverage check
|
||||||
|
uses: webcraftmedia/coverage-check-action@master
|
||||||
|
with:
|
||||||
|
report_name: Coverage Webapp
|
||||||
|
type: lcov
|
||||||
|
result_path: ./coverage/lcov.info
|
||||||
|
min_coverage: 65
|
||||||
|
token: ${{ github.token }}
|
||||||
|
|
||||||
|
##############################################################################
|
||||||
|
# JOB: FULLSTACK TESTS #######################################################
|
||||||
|
##############################################################################
|
||||||
|
fullstack_tests:
|
||||||
|
name: Fullstack tests
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
needs: [build_test_webapp, build_test_backend, build_test_neo4j]
|
||||||
|
env:
|
||||||
|
jobs: 8
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
# run copies of the current job in parallel
|
||||||
|
job: [1, 2, 3, 4, 5, 6, 7, 8]
|
||||||
|
steps:
|
||||||
|
##########################################################################
|
||||||
|
# CHECKOUT CODE ##########################################################
|
||||||
|
##########################################################################
|
||||||
|
- name: Checkout code
|
||||||
|
uses: actions/checkout@v2
|
||||||
|
##########################################################################
|
||||||
|
# DOWNLOAD DOCKER IMAGES #################################################
|
||||||
|
##########################################################################
|
||||||
|
- name: Download Docker Image (Neo4J)
|
||||||
|
uses: actions/download-artifact@v2
|
||||||
|
with:
|
||||||
|
name: docker-neo4j-image
|
||||||
|
path: /tmp
|
||||||
|
- name: Load Docker Image
|
||||||
|
run: docker load < /tmp/neo4j.tar
|
||||||
|
- name: Download Docker Image (Backend)
|
||||||
|
uses: actions/download-artifact@v2
|
||||||
|
with:
|
||||||
|
name: docker-backend-test
|
||||||
|
path: /tmp
|
||||||
|
- name: Load Docker Image
|
||||||
|
run: docker load < /tmp/backend.tar
|
||||||
|
- name: Download Docker Image (Webapp)
|
||||||
|
uses: actions/download-artifact@v2
|
||||||
|
with:
|
||||||
|
name: docker-webapp-test
|
||||||
|
path: /tmp
|
||||||
|
- name: Load Docker Image
|
||||||
|
run: docker load < /tmp/webapp.tar
|
||||||
|
##########################################################################
|
||||||
|
# FULLSTACK TESTS CYPRESS ################################################
|
||||||
|
##########################################################################
|
||||||
|
- name: webapp | copy env files webapp
|
||||||
|
run: cp webapp/.env.template webapp/.env
|
||||||
|
- name: backend | copy env files backend
|
||||||
|
run: cp backend/.env.template backend/.env
|
||||||
|
- name: backend | docker-compose
|
||||||
|
run: docker-compose -f docker-compose.yml -f docker-compose.test.yml up --detach --no-deps webapp neo4j backend
|
||||||
|
- name: cypress | Fullstack tests
|
||||||
|
run: |
|
||||||
|
yarn install
|
||||||
|
yarn run cypress:run --spec $(cypress/parallel-features.sh ${{ matrix.job }} ${{ env.jobs }} )
|
||||||
|
##########################################################################
|
||||||
|
# UPLOAD SCREENSHOTS & VIDEO #############################################
|
||||||
|
##########################################################################
|
||||||
|
- name: Upload Artifact
|
||||||
|
uses: actions/upload-artifact@v2
|
||||||
|
with:
|
||||||
|
name: cypress-screenshots
|
||||||
|
path: cypress/screenshots/
|
||||||
|
- name: Upload Artifact
|
||||||
|
uses: actions/upload-artifact@v2
|
||||||
|
with:
|
||||||
|
name: cypress-videos
|
||||||
|
path: cypress/videos/
|
||||||
95
.github/workflows/ui-build.yml
vendored
@ -1,95 +0,0 @@
|
|||||||
name: UI Build
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
branches: [master]
|
|
||||||
pull_request:
|
|
||||||
branches: [master]
|
|
||||||
|
|
||||||
defaults:
|
|
||||||
run:
|
|
||||||
working-directory: packages/ui
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
files-changed:
|
|
||||||
name: Detect File Changes
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
outputs:
|
|
||||||
ui: ${{ steps.changes.outputs.ui }}
|
|
||||||
steps:
|
|
||||||
- name: Checkout
|
|
||||||
uses: actions/checkout@v6
|
|
||||||
|
|
||||||
- name: Check for file changes
|
|
||||||
uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2
|
|
||||||
id: changes
|
|
||||||
with:
|
|
||||||
token: ${{ github.token }}
|
|
||||||
filters: .github/file-filters.yml
|
|
||||||
|
|
||||||
build:
|
|
||||||
name: Build
|
|
||||||
if: needs.files-changed.outputs.ui == 'true'
|
|
||||||
needs: files-changed
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: Checkout
|
|
||||||
uses: actions/checkout@v6
|
|
||||||
|
|
||||||
- name: Setup Node.js
|
|
||||||
uses: actions/setup-node@v6
|
|
||||||
with:
|
|
||||||
node-version-file: 'packages/ui/.tool-versions'
|
|
||||||
cache: 'npm'
|
|
||||||
cache-dependency-path: packages/ui/package-lock.json
|
|
||||||
|
|
||||||
- name: Install dependencies
|
|
||||||
run: npm ci
|
|
||||||
|
|
||||||
- name: Build library
|
|
||||||
run: npm run build
|
|
||||||
|
|
||||||
- name: Verify build output
|
|
||||||
run: |
|
|
||||||
echo "Checking build output..."
|
|
||||||
|
|
||||||
# Check that dist directory exists
|
|
||||||
if [ ! -d "dist" ]; then
|
|
||||||
echo "::error::dist directory not found"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Check required files exist
|
|
||||||
FILES=(
|
|
||||||
"dist/index.mjs"
|
|
||||||
"dist/index.cjs"
|
|
||||||
"dist/index.d.ts"
|
|
||||||
"dist/index.d.cts"
|
|
||||||
"dist/tailwind.preset.mjs"
|
|
||||||
"dist/tailwind.preset.cjs"
|
|
||||||
"dist/tailwind.preset.d.ts"
|
|
||||||
"dist/tailwind.preset.d.cts"
|
|
||||||
"dist/style.css"
|
|
||||||
)
|
|
||||||
|
|
||||||
for file in "${FILES[@]}"; do
|
|
||||||
if [ ! -f "$file" ]; then
|
|
||||||
echo "::error::Missing required file: $file"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
echo "✓ $file"
|
|
||||||
done
|
|
||||||
|
|
||||||
echo ""
|
|
||||||
echo "All build outputs verified!"
|
|
||||||
|
|
||||||
- name: Validate package
|
|
||||||
run: npm run validate
|
|
||||||
|
|
||||||
- name: Upload build artifacts
|
|
||||||
uses: actions/upload-artifact@v6
|
|
||||||
with:
|
|
||||||
name: dist
|
|
||||||
path: packages/ui/dist/
|
|
||||||
retention-days: 7
|
|
||||||
121
.github/workflows/ui-compatibility.yml
vendored
@ -1,121 +0,0 @@
|
|||||||
name: UI Compatibility
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
branches: [master]
|
|
||||||
pull_request:
|
|
||||||
branches: [master]
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
files-changed:
|
|
||||||
name: Detect File Changes
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
outputs:
|
|
||||||
ui: ${{ steps.changes.outputs.ui }}
|
|
||||||
steps:
|
|
||||||
- name: Checkout
|
|
||||||
uses: actions/checkout@v6
|
|
||||||
|
|
||||||
- name: Check for file changes
|
|
||||||
uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2
|
|
||||||
id: changes
|
|
||||||
with:
|
|
||||||
token: ${{ github.token }}
|
|
||||||
filters: .github/file-filters.yml
|
|
||||||
|
|
||||||
build-library:
|
|
||||||
name: Build Library
|
|
||||||
if: needs.files-changed.outputs.ui == 'true'
|
|
||||||
needs: files-changed
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
defaults:
|
|
||||||
run:
|
|
||||||
working-directory: packages/ui
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: Checkout
|
|
||||||
uses: actions/checkout@v6
|
|
||||||
|
|
||||||
- name: Setup Node.js
|
|
||||||
uses: actions/setup-node@v6
|
|
||||||
with:
|
|
||||||
node-version-file: 'packages/ui/.tool-versions'
|
|
||||||
cache: 'npm'
|
|
||||||
cache-dependency-path: packages/ui/package-lock.json
|
|
||||||
|
|
||||||
- name: Install dependencies
|
|
||||||
run: npm ci
|
|
||||||
|
|
||||||
- name: Build library
|
|
||||||
run: npm run build
|
|
||||||
|
|
||||||
- name: Upload build artifacts
|
|
||||||
uses: actions/upload-artifact@v6
|
|
||||||
with:
|
|
||||||
name: ui-dist
|
|
||||||
path: packages/ui/dist/
|
|
||||||
retention-days: 1
|
|
||||||
|
|
||||||
test-compatibility:
|
|
||||||
name: Test Compatibility
|
|
||||||
if: needs.files-changed.outputs.ui == 'true'
|
|
||||||
needs: [files-changed, build-library]
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
strategy:
|
|
||||||
fail-fast: false
|
|
||||||
matrix:
|
|
||||||
example:
|
|
||||||
- vue3-tailwind
|
|
||||||
- vue3-css
|
|
||||||
- vue2-tailwind
|
|
||||||
- vue2-css
|
|
||||||
defaults:
|
|
||||||
run:
|
|
||||||
working-directory: packages/ui/examples/${{ matrix.example }}
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: Checkout
|
|
||||||
uses: actions/checkout@v6
|
|
||||||
|
|
||||||
- name: Download build artifacts
|
|
||||||
uses: actions/download-artifact@v4
|
|
||||||
with:
|
|
||||||
name: ui-dist
|
|
||||||
path: packages/ui/dist/
|
|
||||||
|
|
||||||
- name: Setup Node.js
|
|
||||||
uses: actions/setup-node@v6
|
|
||||||
with:
|
|
||||||
node-version-file: 'packages/ui/.tool-versions'
|
|
||||||
cache: 'npm'
|
|
||||||
cache-dependency-path: packages/ui/examples/${{ matrix.example }}/package-lock.json
|
|
||||||
|
|
||||||
- name: Install dependencies
|
|
||||||
run: npm install
|
|
||||||
|
|
||||||
- name: Lint
|
|
||||||
run: npm run lint
|
|
||||||
|
|
||||||
- name: Run tests
|
|
||||||
run: npm test
|
|
||||||
|
|
||||||
- name: Build example app
|
|
||||||
run: npm run build
|
|
||||||
|
|
||||||
compatibility-result:
|
|
||||||
name: Compatibility Result
|
|
||||||
if: always()
|
|
||||||
needs: [files-changed, test-compatibility]
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- name: Skip if no UI changes
|
|
||||||
if: needs.files-changed.outputs.ui != 'true'
|
|
||||||
run: echo "No UI changes detected, skipping."
|
|
||||||
|
|
||||||
- name: Check matrix results
|
|
||||||
if: needs.files-changed.outputs.ui == 'true'
|
|
||||||
run: |
|
|
||||||
if [ "${{ needs.test-compatibility.result }}" != "success" ]; then
|
|
||||||
echo "Compatibility tests failed"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
59
.github/workflows/ui-docker.yml
vendored
@ -1,59 +0,0 @@
|
|||||||
name: UI Docker
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
branches: [master]
|
|
||||||
pull_request:
|
|
||||||
branches: [master]
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
files-changed:
|
|
||||||
name: Detect File Changes
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
outputs:
|
|
||||||
ui: ${{ steps.changes.outputs.ui }}
|
|
||||||
steps:
|
|
||||||
- name: Checkout
|
|
||||||
uses: actions/checkout@v6
|
|
||||||
|
|
||||||
- name: Check for file changes
|
|
||||||
uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2
|
|
||||||
id: changes
|
|
||||||
with:
|
|
||||||
token: ${{ github.token }}
|
|
||||||
filters: .github/file-filters.yml
|
|
||||||
|
|
||||||
build:
|
|
||||||
name: Build Docker Image
|
|
||||||
if: needs.files-changed.outputs.ui == 'true'
|
|
||||||
needs: files-changed
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: Checkout
|
|
||||||
uses: actions/checkout@v6
|
|
||||||
|
|
||||||
- name: Set up Docker Buildx
|
|
||||||
uses: docker/setup-buildx-action@v3
|
|
||||||
|
|
||||||
- name: Build development image
|
|
||||||
uses: docker/build-push-action@v6
|
|
||||||
with:
|
|
||||||
context: ./packages/ui
|
|
||||||
file: ./packages/ui/Dockerfile
|
|
||||||
target: development
|
|
||||||
push: false
|
|
||||||
tags: ocelot-social/ui:development
|
|
||||||
cache-from: type=gha
|
|
||||||
cache-to: type=gha,mode=max
|
|
||||||
|
|
||||||
- name: Build production image
|
|
||||||
uses: docker/build-push-action@v6
|
|
||||||
with:
|
|
||||||
context: ./packages/ui
|
|
||||||
file: ./packages/ui/Dockerfile
|
|
||||||
target: production
|
|
||||||
push: false
|
|
||||||
tags: ocelot-social/ui:latest
|
|
||||||
cache-from: type=gha
|
|
||||||
cache-to: type=gha,mode=max
|
|
||||||
54
.github/workflows/ui-lint.yml
vendored
@ -1,54 +0,0 @@
|
|||||||
name: UI Lint
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
branches: [master]
|
|
||||||
pull_request:
|
|
||||||
branches: [master]
|
|
||||||
|
|
||||||
defaults:
|
|
||||||
run:
|
|
||||||
working-directory: packages/ui
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
files-changed:
|
|
||||||
name: Detect File Changes
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
outputs:
|
|
||||||
ui: ${{ steps.changes.outputs.ui }}
|
|
||||||
steps:
|
|
||||||
- name: Checkout
|
|
||||||
uses: actions/checkout@v6
|
|
||||||
|
|
||||||
- name: Check for file changes
|
|
||||||
uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2
|
|
||||||
id: changes
|
|
||||||
with:
|
|
||||||
token: ${{ github.token }}
|
|
||||||
filters: .github/file-filters.yml
|
|
||||||
|
|
||||||
lint:
|
|
||||||
name: ESLint
|
|
||||||
if: needs.files-changed.outputs.ui == 'true'
|
|
||||||
needs: files-changed
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: Checkout
|
|
||||||
uses: actions/checkout@v6
|
|
||||||
|
|
||||||
- name: Setup Node.js
|
|
||||||
uses: actions/setup-node@v6
|
|
||||||
with:
|
|
||||||
node-version-file: 'packages/ui/.tool-versions'
|
|
||||||
cache: 'npm'
|
|
||||||
cache-dependency-path: packages/ui/package-lock.json
|
|
||||||
|
|
||||||
- name: Install dependencies
|
|
||||||
run: npm ci
|
|
||||||
|
|
||||||
- name: Run ESLint
|
|
||||||
run: npm run lint
|
|
||||||
|
|
||||||
- name: Run TypeScript type check
|
|
||||||
run: npm run typecheck
|
|
||||||
65
.github/workflows/ui-release.yml
vendored
@ -1,65 +0,0 @@
|
|||||||
name: UI Release
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
branches: [master]
|
|
||||||
paths:
|
|
||||||
- 'packages/ui/**'
|
|
||||||
- 'release-please-config.json'
|
|
||||||
- '.release-please-manifest.json'
|
|
||||||
|
|
||||||
permissions:
|
|
||||||
contents: write
|
|
||||||
pull-requests: write
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
release-please:
|
|
||||||
name: Release Please
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
outputs:
|
|
||||||
release_created: ${{ steps.release.outputs['packages/ui--release_created'] }}
|
|
||||||
tag_name: ${{ steps.release.outputs['packages/ui--tag_name'] }}
|
|
||||||
version: ${{ steps.release.outputs['packages/ui--version'] }}
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: Release Please
|
|
||||||
id: release
|
|
||||||
uses: googleapis/release-please-action@v4
|
|
||||||
with:
|
|
||||||
config-file: release-please-config.json
|
|
||||||
manifest-file: .release-please-manifest.json
|
|
||||||
|
|
||||||
publish:
|
|
||||||
name: Publish to npm
|
|
||||||
needs: release-please
|
|
||||||
if: ${{ needs.release-please.outputs.release_created == 'true' }}
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
defaults:
|
|
||||||
run:
|
|
||||||
working-directory: packages/ui
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: Checkout
|
|
||||||
uses: actions/checkout@v6
|
|
||||||
|
|
||||||
- name: Setup Node.js
|
|
||||||
uses: actions/setup-node@v6
|
|
||||||
with:
|
|
||||||
node-version-file: 'packages/ui/.tool-versions'
|
|
||||||
registry-url: 'https://registry.npmjs.org'
|
|
||||||
cache: 'npm'
|
|
||||||
cache-dependency-path: packages/ui/package-lock.json
|
|
||||||
|
|
||||||
- name: Install dependencies
|
|
||||||
run: npm ci
|
|
||||||
|
|
||||||
- name: Build
|
|
||||||
run: npm run build
|
|
||||||
|
|
||||||
- name: Validate package
|
|
||||||
run: npm run validate
|
|
||||||
|
|
||||||
- name: Publish to npm
|
|
||||||
run: npm publish --access public
|
|
||||||
env:
|
|
||||||
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
|
|
||||||
54
.github/workflows/ui-size.yml
vendored
@ -1,54 +0,0 @@
|
|||||||
name: UI Size
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
branches: [master]
|
|
||||||
pull_request:
|
|
||||||
branches: [master]
|
|
||||||
|
|
||||||
defaults:
|
|
||||||
run:
|
|
||||||
working-directory: packages/ui
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
files-changed:
|
|
||||||
name: Detect File Changes
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
outputs:
|
|
||||||
ui: ${{ steps.changes.outputs.ui }}
|
|
||||||
steps:
|
|
||||||
- name: Checkout
|
|
||||||
uses: actions/checkout@v6
|
|
||||||
|
|
||||||
- name: Check for file changes
|
|
||||||
uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2
|
|
||||||
id: changes
|
|
||||||
with:
|
|
||||||
token: ${{ github.token }}
|
|
||||||
filters: .github/file-filters.yml
|
|
||||||
|
|
||||||
size:
|
|
||||||
name: Bundle Size Check
|
|
||||||
if: needs.files-changed.outputs.ui == 'true'
|
|
||||||
needs: files-changed
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: Checkout
|
|
||||||
uses: actions/checkout@v6
|
|
||||||
|
|
||||||
- name: Setup Node.js
|
|
||||||
uses: actions/setup-node@v6
|
|
||||||
with:
|
|
||||||
node-version-file: 'packages/ui/.tool-versions'
|
|
||||||
cache: 'npm'
|
|
||||||
cache-dependency-path: packages/ui/package-lock.json
|
|
||||||
|
|
||||||
- name: Install dependencies
|
|
||||||
run: npm ci
|
|
||||||
|
|
||||||
- name: Build
|
|
||||||
run: npm run build
|
|
||||||
|
|
||||||
- name: Check bundle size
|
|
||||||
run: npm run size
|
|
||||||
74
.github/workflows/ui-storybook.yml
vendored
@ -1,74 +0,0 @@
|
|||||||
name: UI Storybook
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
branches: [master]
|
|
||||||
pull_request:
|
|
||||||
branches: [master]
|
|
||||||
|
|
||||||
defaults:
|
|
||||||
run:
|
|
||||||
working-directory: packages/ui
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
files-changed:
|
|
||||||
name: Detect File Changes
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
outputs:
|
|
||||||
ui: ${{ steps.changes.outputs.ui }}
|
|
||||||
steps:
|
|
||||||
- name: Checkout
|
|
||||||
uses: actions/checkout@v6
|
|
||||||
|
|
||||||
- name: Check for file changes
|
|
||||||
uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2
|
|
||||||
id: changes
|
|
||||||
with:
|
|
||||||
token: ${{ github.token }}
|
|
||||||
filters: .github/file-filters.yml
|
|
||||||
|
|
||||||
build:
|
|
||||||
name: Build Storybook
|
|
||||||
if: needs.files-changed.outputs.ui == 'true'
|
|
||||||
needs: files-changed
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: Checkout
|
|
||||||
uses: actions/checkout@v6
|
|
||||||
|
|
||||||
- name: Setup Node.js
|
|
||||||
uses: actions/setup-node@v6
|
|
||||||
with:
|
|
||||||
node-version-file: 'packages/ui/.tool-versions'
|
|
||||||
cache: 'npm'
|
|
||||||
cache-dependency-path: packages/ui/package-lock.json
|
|
||||||
|
|
||||||
- name: Install dependencies
|
|
||||||
run: npm ci
|
|
||||||
|
|
||||||
- name: Build Storybook
|
|
||||||
run: npm run storybook:build
|
|
||||||
|
|
||||||
- name: Verify build output
|
|
||||||
run: |
|
|
||||||
echo "Checking Storybook build output..."
|
|
||||||
|
|
||||||
if [ ! -d "storybook-static" ]; then
|
|
||||||
echo "::error::storybook-static directory not found"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ ! -f "storybook-static/index.html" ]; then
|
|
||||||
echo "::error::index.html not found in storybook-static"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo "✓ Storybook build verified!"
|
|
||||||
|
|
||||||
- name: Upload Storybook artifacts
|
|
||||||
uses: actions/upload-artifact@v6
|
|
||||||
with:
|
|
||||||
name: storybook-static
|
|
||||||
path: packages/ui/storybook-static/
|
|
||||||
retention-days: 7
|
|
||||||
59
.github/workflows/ui-test.yml
vendored
@ -1,59 +0,0 @@
|
|||||||
name: UI Test
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
branches: [master]
|
|
||||||
pull_request:
|
|
||||||
branches: [master]
|
|
||||||
|
|
||||||
defaults:
|
|
||||||
run:
|
|
||||||
working-directory: packages/ui
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
files-changed:
|
|
||||||
name: Detect File Changes
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
outputs:
|
|
||||||
ui: ${{ steps.changes.outputs.ui }}
|
|
||||||
steps:
|
|
||||||
- name: Checkout
|
|
||||||
uses: actions/checkout@v6
|
|
||||||
|
|
||||||
- name: Check for file changes
|
|
||||||
uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2
|
|
||||||
id: changes
|
|
||||||
with:
|
|
||||||
token: ${{ github.token }}
|
|
||||||
filters: .github/file-filters.yml
|
|
||||||
|
|
||||||
test:
|
|
||||||
name: Unit Tests
|
|
||||||
if: needs.files-changed.outputs.ui == 'true'
|
|
||||||
needs: files-changed
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: Checkout
|
|
||||||
uses: actions/checkout@v6
|
|
||||||
|
|
||||||
- name: Setup Node.js
|
|
||||||
uses: actions/setup-node@v6
|
|
||||||
with:
|
|
||||||
node-version-file: 'packages/ui/.tool-versions'
|
|
||||||
cache: 'npm'
|
|
||||||
cache-dependency-path: packages/ui/package-lock.json
|
|
||||||
|
|
||||||
- name: Install dependencies
|
|
||||||
run: npm ci
|
|
||||||
|
|
||||||
- name: Run tests with coverage
|
|
||||||
run: npm run test:coverage
|
|
||||||
|
|
||||||
- name: Upload coverage report
|
|
||||||
uses: actions/upload-artifact@v6
|
|
||||||
if: always()
|
|
||||||
with:
|
|
||||||
name: coverage-report
|
|
||||||
path: packages/ui/coverage/
|
|
||||||
retention-days: 7
|
|
||||||
51
.github/workflows/ui-verify.yml
vendored
@ -1,51 +0,0 @@
|
|||||||
name: UI Verify
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
branches: [master]
|
|
||||||
pull_request:
|
|
||||||
branches: [master]
|
|
||||||
|
|
||||||
defaults:
|
|
||||||
run:
|
|
||||||
working-directory: packages/ui
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
files-changed:
|
|
||||||
name: Detect File Changes
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
outputs:
|
|
||||||
ui: ${{ steps.changes.outputs.ui }}
|
|
||||||
steps:
|
|
||||||
- name: Checkout
|
|
||||||
uses: actions/checkout@v6
|
|
||||||
|
|
||||||
- name: Check for file changes
|
|
||||||
uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2
|
|
||||||
id: changes
|
|
||||||
with:
|
|
||||||
token: ${{ github.token }}
|
|
||||||
filters: .github/file-filters.yml
|
|
||||||
|
|
||||||
verify:
|
|
||||||
name: Completeness Check
|
|
||||||
if: needs.files-changed.outputs.ui == 'true'
|
|
||||||
needs: files-changed
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: Checkout
|
|
||||||
uses: actions/checkout@v6
|
|
||||||
|
|
||||||
- name: Setup Node.js
|
|
||||||
uses: actions/setup-node@v6
|
|
||||||
with:
|
|
||||||
node-version-file: 'packages/ui/.tool-versions'
|
|
||||||
cache: 'npm'
|
|
||||||
cache-dependency-path: packages/ui/package-lock.json
|
|
||||||
|
|
||||||
- name: Install dependencies
|
|
||||||
run: npm ci
|
|
||||||
|
|
||||||
- name: Check component completeness
|
|
||||||
run: npm run verify
|
|
||||||
64
.github/workflows/ui-visual.yml
vendored
@ -1,64 +0,0 @@
|
|||||||
name: UI Visual
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
branches: [master]
|
|
||||||
pull_request:
|
|
||||||
branches: [master]
|
|
||||||
|
|
||||||
defaults:
|
|
||||||
run:
|
|
||||||
working-directory: packages/ui
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
files-changed:
|
|
||||||
name: Detect File Changes
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
outputs:
|
|
||||||
ui: ${{ steps.changes.outputs.ui }}
|
|
||||||
steps:
|
|
||||||
- name: Checkout
|
|
||||||
uses: actions/checkout@v6
|
|
||||||
|
|
||||||
- name: Check for file changes
|
|
||||||
uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2
|
|
||||||
id: changes
|
|
||||||
with:
|
|
||||||
token: ${{ github.token }}
|
|
||||||
filters: .github/file-filters.yml
|
|
||||||
|
|
||||||
visual:
|
|
||||||
name: Visual Regression
|
|
||||||
if: needs.files-changed.outputs.ui == 'true'
|
|
||||||
needs: files-changed
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: Checkout
|
|
||||||
uses: actions/checkout@v6
|
|
||||||
|
|
||||||
- name: Setup Node.js
|
|
||||||
uses: actions/setup-node@v6
|
|
||||||
with:
|
|
||||||
node-version-file: 'packages/ui/.tool-versions'
|
|
||||||
cache: 'npm'
|
|
||||||
cache-dependency-path: packages/ui/package-lock.json
|
|
||||||
|
|
||||||
- name: Install dependencies
|
|
||||||
run: npm ci
|
|
||||||
|
|
||||||
- name: Install Playwright browsers
|
|
||||||
run: npx playwright install chromium --with-deps
|
|
||||||
|
|
||||||
- name: Run visual tests
|
|
||||||
run: npm run test:visual
|
|
||||||
|
|
||||||
- name: Upload test results
|
|
||||||
uses: actions/upload-artifact@v6
|
|
||||||
if: failure()
|
|
||||||
with:
|
|
||||||
name: visual-test-results
|
|
||||||
path: |
|
|
||||||
packages/ui/test-results/
|
|
||||||
packages/ui/playwright-report/
|
|
||||||
retention-days: 7
|
|
||||||
9
.gitignore
vendored
@ -8,20 +8,11 @@ yarn-error.log*
|
|||||||
.yarn-integrity
|
.yarn-integrity
|
||||||
.eslintcache
|
.eslintcache
|
||||||
kubeconfig.yaml
|
kubeconfig.yaml
|
||||||
backup-cron-job.log
|
|
||||||
.vscode
|
|
||||||
.nuxt
|
|
||||||
|
|
||||||
node_modules/
|
node_modules/
|
||||||
cypress/videos
|
cypress/videos
|
||||||
cypress/screenshots/
|
cypress/screenshots/
|
||||||
cypress.env.json
|
cypress.env.json
|
||||||
deployment/configurations/
|
|
||||||
|
|
||||||
.vuepress/.cache/
|
|
||||||
.vuepress/.temp/
|
|
||||||
.vuepress/dist/
|
|
||||||
|
|
||||||
|
|
||||||
!.gitkeep
|
!.gitkeep
|
||||||
**/coverage
|
**/coverage
|
||||||
|
|||||||
6
.gitmodules
vendored
@ -1,3 +1,3 @@
|
|||||||
[submodule "deployment/configurations/stage.ocelot.social"]
|
[submodule "styleguide"]
|
||||||
path = deployment/configurations/stage.ocelot.social
|
path = styleguide
|
||||||
url = git@github.com:Ocelot-Social-Community/stage.ocelot.social.git
|
url = https://github.com/Human-Connection/Nitro-Styleguide.git
|
||||||
|
|||||||
@ -1,3 +0,0 @@
|
|||||||
{
|
|
||||||
"packages/ui": "0.0.1"
|
|
||||||
}
|
|
||||||
84
.travis.yml
Normal file
@ -0,0 +1,84 @@
|
|||||||
|
dist: xenial
|
||||||
|
language: node_js
|
||||||
|
node_js: lts/*
|
||||||
|
cache:
|
||||||
|
yarn: false
|
||||||
|
npm: false
|
||||||
|
|
||||||
|
addons:
|
||||||
|
apt:
|
||||||
|
packages:
|
||||||
|
- libgconf-2-4
|
||||||
|
snaps:
|
||||||
|
- docker
|
||||||
|
firefox: "latest-esr"
|
||||||
|
|
||||||
|
install:
|
||||||
|
- yarn global add wait-on
|
||||||
|
# Install Codecov
|
||||||
|
- yarn install --frozen-lockfile
|
||||||
|
- cp backend/.env.template backend/.env
|
||||||
|
|
||||||
|
before_script:
|
||||||
|
- docker-compose -f docker-compose.yml build --parallel
|
||||||
|
- docker-compose -f docker-compose.yml -f docker-compose.build-and-test.yml build # just tagging, just be quite fast
|
||||||
|
- docker-compose -f docker-compose.yml -f docker-compose.build-and-test.yml up -d
|
||||||
|
- wait-on http://localhost:7474
|
||||||
|
- docker-compose -f docker-compose.yml -f docker-compose.build-and-test.yml exec backend yarn run db:migrate init
|
||||||
|
|
||||||
|
script:
|
||||||
|
- export CYPRESS_RETRIES=1
|
||||||
|
- export BRANCH=$(if [ "$TRAVIS_PULL_REQUEST" == "false" ]; then echo $TRAVIS_BRANCH; else echo $TRAVIS_PULL_REQUEST_BRANCH; fi)
|
||||||
|
- echo "TRAVIS_BRANCH=$TRAVIS_BRANCH, PR=$PR, BRANCH=$BRANCH"
|
||||||
|
# Miscellaneous
|
||||||
|
- ./scripts/translations/sort.sh
|
||||||
|
- ./scripts/translations/missing-keys.sh
|
||||||
|
# Backend
|
||||||
|
- docker-compose exec backend yarn run lint
|
||||||
|
- docker-compose exec backend yarn run test --ci --verbose=false --coverage
|
||||||
|
- docker-compose exec backend yarn run db:seed
|
||||||
|
- docker-compose exec backend yarn run db:reset
|
||||||
|
# Frontend
|
||||||
|
- docker-compose exec webapp yarn run lint
|
||||||
|
- docker-compose exec webapp yarn run test --ci --verbose=false --coverage
|
||||||
|
# Fullstack
|
||||||
|
- docker-compose down
|
||||||
|
- docker-compose -f docker-compose.yml up -d
|
||||||
|
- wait-on http://localhost:7474
|
||||||
|
# disable for last deploy, because of flakiness!
|
||||||
|
# - yarn run cypress:run --record
|
||||||
|
# - yarn run cucumber
|
||||||
|
# Coverage
|
||||||
|
# disable this uneffective thing for last deploy, because of easyness!
|
||||||
|
# - yarn run codecov
|
||||||
|
|
||||||
|
after_success:
|
||||||
|
- wget https://raw.githubusercontent.com/DiscordHooks/travis-ci-discord-webhook/master/send.sh
|
||||||
|
- chmod +x send.sh
|
||||||
|
- ./send.sh success $WEBHOOK_URL
|
||||||
|
- if [ $TRAVIS_BRANCH == "master" ] && [ $TRAVIS_EVENT_TYPE == "push" ]; then
|
||||||
|
wget https://raw.githubusercontent.com/Human-Connection/Discord-Bot/develop/tester.sh &&
|
||||||
|
chmod +x tester.sh &&
|
||||||
|
./tester.sh staging $WEBHOOK_URL;
|
||||||
|
fi
|
||||||
|
|
||||||
|
after_failure:
|
||||||
|
- wget https://raw.githubusercontent.com/DiscordHooks/travis-ci-discord-webhook/master/send.sh
|
||||||
|
- chmod +x send.sh
|
||||||
|
- ./send.sh failure $WEBHOOK_URL
|
||||||
|
|
||||||
|
before_deploy:
|
||||||
|
- go get -u github.com/tcnksm/ghr
|
||||||
|
# stop deployment to kubernetes until we have set it up
|
||||||
|
# - ./scripts/setup_kubernetes.sh
|
||||||
|
|
||||||
|
deploy:
|
||||||
|
- provider: script
|
||||||
|
script: bash scripts/docker_push.sh
|
||||||
|
on:
|
||||||
|
branch: master
|
||||||
|
# stop deployment to kubernetes until we have set it up
|
||||||
|
# - provider: script
|
||||||
|
# script: bash scripts/deploy.sh
|
||||||
|
# on:
|
||||||
|
# branch: master
|
||||||
@ -1,12 +0,0 @@
|
|||||||
import { defineUserConfig } from 'vuepress'
|
|
||||||
import { viteBundler } from '@vuepress/bundler-vite'
|
|
||||||
|
|
||||||
import meta from './config/meta'
|
|
||||||
import theme from './config/theme'
|
|
||||||
|
|
||||||
export default defineUserConfig({
|
|
||||||
pagePatterns: ['**/*.md', '!.vuepress', '!node_modules', '!backend/node_modules', '!webapp/node_modules', '!deployment/src/old'],
|
|
||||||
bundler: viteBundler(),
|
|
||||||
...meta,
|
|
||||||
theme,
|
|
||||||
})
|
|
||||||
@ -1,8 +0,0 @@
|
|||||||
export default {
|
|
||||||
base: '/',
|
|
||||||
title: 'Ocelot.Social Documentation',
|
|
||||||
description: 'Ocelot.Social Documentation',
|
|
||||||
head: [
|
|
||||||
['meta', {name: 'viewport', content: 'width=device-width,initial-scale=1'}],
|
|
||||||
],
|
|
||||||
}
|
|
||||||
@ -1,114 +0,0 @@
|
|||||||
import path from 'path'
|
|
||||||
import fs from 'fs'
|
|
||||||
import { hopeTheme } from 'vuepress-theme-hope'
|
|
||||||
|
|
||||||
export default hopeTheme({
|
|
||||||
favicon: 'favicon.ico',
|
|
||||||
logo: '/logo.svg',
|
|
||||||
docsRepo: 'https://github.com/Ocelot-Social-Community/Ocelot-Social',
|
|
||||||
docsBranch: 'master',
|
|
||||||
docsDir: '.',
|
|
||||||
editLink: true,
|
|
||||||
lastUpdated: false,
|
|
||||||
contributors: false,
|
|
||||||
print: false,
|
|
||||||
pure: true,
|
|
||||||
navbarLayout: {
|
|
||||||
start: ['Brand'],
|
|
||||||
center: ['Links'],
|
|
||||||
end: ['Repo', 'Outlook', 'Search'],
|
|
||||||
},
|
|
||||||
repo: 'Ocelot-Social-Community/Ocelot-Social',
|
|
||||||
repoLabel: 'GitHub',
|
|
||||||
repoDisplay: true,
|
|
||||||
|
|
||||||
|
|
||||||
displayFooter: true,
|
|
||||||
copyright: '© by <a href="https://busfaktor.org" target="_blank">busFaktor() e.V.</a> & Authors | <a href="https://ocelot.social/en/impressum/">Imprint</a>',
|
|
||||||
footer: 'Released under the <a class="vt-link link link" href="https://opensource.org/licenses/MIT" target="_blank" rel="noopener noreferrer"><!--[-->MIT License<!--]--><!----></a>.',
|
|
||||||
sidebar: generateSidebar('../../SUMMARY.md'),
|
|
||||||
navbar: [
|
|
||||||
{
|
|
||||||
text: 'Demo',
|
|
||||||
link: 'https://stage.ocelot.social/',
|
|
||||||
target: '_self',
|
|
||||||
},
|
|
||||||
],
|
|
||||||
plugins: {
|
|
||||||
mdEnhance: {
|
|
||||||
align: true,
|
|
||||||
demo: true,
|
|
||||||
imgLazyload: true,
|
|
||||||
imgMark: true,
|
|
||||||
imgSize: true,
|
|
||||||
sub: true,
|
|
||||||
sup: true,
|
|
||||||
tabs: true,
|
|
||||||
vPre: true,
|
|
||||||
},
|
|
||||||
searchPro: {
|
|
||||||
indexContent: true,
|
|
||||||
autoSuggestions: true,
|
|
||||||
customFields: [
|
|
||||||
{
|
|
||||||
getter: (page) => page.frontmatter.category,
|
|
||||||
formatter: "Category: $content",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
getter: (page) => page.frontmatter.tag,
|
|
||||||
formatter: "Tag: $content",
|
|
||||||
},
|
|
||||||
],
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
function generateSidebar(summaryFileName) {
|
|
||||||
const summaryFile = path.resolve(__dirname, summaryFileName)
|
|
||||||
|
|
||||||
try {
|
|
||||||
return getSummaryData(summaryFile)
|
|
||||||
} catch (err) {
|
|
||||||
console.error(`Error generating sidebar from file ${summaryFileName}:`, err)
|
|
||||||
process.exit(1)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function getSummaryData(file) {
|
|
||||||
const lines = fs.readFileSync(file, 'utf8').split('\n')
|
|
||||||
const sidebarStructure = []
|
|
||||||
let currentParent = null
|
|
||||||
|
|
||||||
lines.forEach((line, i) => {
|
|
||||||
const level = line.search(/\S|$/) / 2
|
|
||||||
const match = line.match(/^\s*\*\s*\[([^\]]+)\]\(([^)]+)\)/)
|
|
||||||
|
|
||||||
if (match) {
|
|
||||||
const newEntry = { text: match[1], link: `/${match[2]}`, children: [] }
|
|
||||||
if (level === 0) {
|
|
||||||
sidebarStructure.push(newEntry)
|
|
||||||
currentParent = sidebarStructure[sidebarStructure.length - 1]
|
|
||||||
} else {
|
|
||||||
let parent = currentParent
|
|
||||||
|
|
||||||
for (let i = 1; i < level; i++) {
|
|
||||||
parent = parent.children[parent.children.length - 1]
|
|
||||||
}
|
|
||||||
|
|
||||||
parent.children.push(newEntry)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
sidebarStructure.forEach(removeEmptyArrays)
|
|
||||||
return sidebarStructure
|
|
||||||
}
|
|
||||||
|
|
||||||
function removeEmptyArrays(item) {
|
|
||||||
if (item.children && item.children.length === 0) {
|
|
||||||
delete item.children;
|
|
||||||
} else if (item.children) {
|
|
||||||
item.children.forEach(removeEmptyArrays);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
Before Width: | Height: | Size: 5.4 KiB |
|
Before Width: | Height: | Size: 28 KiB |
@ -1 +0,0 @@
|
|||||||
$theme-color: #17b53f;
|
|
||||||
4440
CHANGELOG.md
154
CONTRIBUTING.md
@ -1,90 +1,74 @@
|
|||||||
# CONTRIBUTING
|
# CONTRIBUTING
|
||||||
|
|
||||||
Thank you so much for thinking of contributing to the [ocelot.social](https://ocelot.social) project! It's awesome you're here, we really appreciate it. :-\)
|
Thank you so much for thinking of contributing to the Human Connection project! It's awesome you're here, we really appreciate it. :-\)
|
||||||
|
|
||||||
## Getting Set Up
|
## Getting Set Up
|
||||||
|
|
||||||
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](./SUMMARY.md).
|
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/).
|
||||||
|
|
||||||
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):
|
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):
|
||||||
|
|
||||||
We also can have pair programming sessions for you! 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.
|

|
||||||
|
|
||||||
|
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
|
## 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 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](https://discord.gg/AJSX9DCSUA) 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:
|
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.
|
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 @Ocelot-Social-Community/core-team to make sure we check in.)
|
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?
|
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/ocelotsocial-5fb21ff922cb410015dd6535/board?filterLogic=any&repos=301151089).
|
4. We assign ourselves to the issue and move it to `In Progress` on [Zenhub](https://app.zenhub.com/workspaces/human-connection-nitro-5c0154ecc699f60fc92cf11f).
|
||||||
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.
|
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).
|
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 @Ocelot-Social-Community/core-team which pings all core developers).
|
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!
|
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:
|
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)
|
* 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
|
* include tests for the code that is added or changed
|
||||||
* pass all tests (linter, backend, webapp, code coverage, end-to-end)
|
* pass all tests (linter, backend, frontend, end-to-end)
|
||||||
* be approved by at least 1 developer who is not the owner of the PR (when more than 10 files were changed it needs 2 approvals)
|
* be approved by at least 1 developer who is not the owner of the PR (when more than 10 files were changed it needs 2 approvals)
|
||||||
|
|
||||||
## Contribution Flow For Open Source Contributors
|
|
||||||
|
|
||||||
See [contributing in main README.md](./README.md#contributing)
|
|
||||||
|
|
||||||
## The Team
|
## The Team
|
||||||
|
|
||||||
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!
|
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 talk to our core team on [Discord](https://discord.gg/AJSX9DCSUA). And on Github you will mostly run into our core developers:
|
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)
|
||||||
* Ulf (@ulfgebhardt)
|
* Matt (@mattwr18)
|
||||||
* Moriz (@Mogge)
|
|
||||||
* Wolle (@Tirokk)
|
* Wolle (@Tirokk)
|
||||||
* Alex (@ogerly)
|
* Alex (@ogerly)
|
||||||
* Hannes (@elweyn5803)
|
|
||||||
* Mathias (@mahula)
|
|
||||||
* Markus (@maeckes#1133)
|
|
||||||
|
|
||||||
<!-- * Robert (@roschaefer)
|
|
||||||
* Matt (@mattwr18)
|
|
||||||
* Alina (@alina-beck)
|
* Alina (@alina-beck)
|
||||||
* Martin (@datenbrei), our head of IT
|
* Martin (@datenbrei), our head of IT
|
||||||
* and sometimes Dennis (@DennisHack), the founder of Human Connection -->
|
* and sometimes Dennis (@DennisHack), the founder of Human Connection
|
||||||
|
|
||||||
## Meetings and Pair Programming Sessions
|
## 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 ocelot.social Community core team members are living in Germany.
|
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
|
Daily standup
|
||||||
|
* every Monday–Friday 11:30
|
||||||
* every Monday–Thursday 11:30 am (german time see above 👆🏼)
|
* in the discord `Conference Room`
|
||||||
* in our [Discord](https://discord.gg/AJSX9DCSUA) `Office Cube`
|
|
||||||
* all contributors welcome!
|
* all contributors welcome!
|
||||||
* everybody shares what they are working on and asks for help if they are blocked
|
* everybody shares what they are working on and asks for help if they are blocked
|
||||||
|
|
||||||
<!--
|
|
||||||
Regular pair programming sessions
|
Regular pair programming sessions
|
||||||
|
|
||||||
* every Monday, Wednesday and Thursday 15:00
|
* every Monday, Wednesday and Thursday 15:00
|
||||||
* the link will be posted in the [Discord chat](https://discord.gg/AJSX9DCSUA) and on the [Agile Ventures website](https://www.agileventures.org/events?utf8=%E2%9C%93&project_id=220&commit=Filter+by+Project)
|
* the link will be posted in the [discord chat](https://discord.gg/6ub73U3) and on the [Agile Ventures website](https://www.agileventures.org/events?utf8=%E2%9C%93&project_id=220&commit=Filter+by+Project)
|
||||||
* all contributors welcome!
|
* all contributors welcome!
|
||||||
* we team up and work on an issue together (often using Visual Studio live sharing sessions)
|
* we team up and work on an issue together (often using Visual Studio live sharing sessions)
|
||||||
|
|
||||||
Open-Source Community Meeting
|
Open-Source Community Meeting
|
||||||
|
|
||||||
* bi-weekly on Mondays 13:00 (when there is no sprint retrospective)
|
* bi-weekly on Mondays 13:00 (when there is no sprint retrospective)
|
||||||
* the link will be posted in the [Discord chat](https://discord.gg/AJSX9DCSUA) and on the [Agile Ventures website](https://www.agileventures.org/events?utf8=%E2%9C%93&project_id=220&commit=Filter+by+Project)
|
* the link will be posted in the [discord chat](https://discord.gg/6ub73U3) and on the [Agile Ventures website](https://www.agileventures.org/events?utf8=%E2%9C%93&project_id=220&commit=Filter+by+Project)
|
||||||
* all contributors welcome!
|
* all contributors welcome!
|
||||||
|
|
||||||
Meet the team
|
Meet the team
|
||||||
|
|
||||||
* every Monday 21:00 (at the moment only in German)
|
* every Monday 21:00 (at the moment only in German)
|
||||||
* details here https://human-connection.org/veranstaltungen/
|
* details here https://human-connection.org/veranstaltungen/
|
||||||
* via this [zoom link](https://zoom.us/j/936943532)
|
* via this [zoom link](https://zoom.us/j/936943532)
|
||||||
@ -92,7 +76,6 @@ Meet the team
|
|||||||
* users of the network chat with the Human Connection team and discuss current questions and issues
|
* users of the network chat with the Human Connection team and discuss current questions and issues
|
||||||
|
|
||||||
Sprint planning
|
Sprint planning
|
||||||
|
|
||||||
* bi-weekly on Tuesday 13:00
|
* bi-weekly on Tuesday 13:00
|
||||||
* via this [zoom link](https://zoom.us/j/7743582385)
|
* via this [zoom link](https://zoom.us/j/7743582385)
|
||||||
* all contributors welcome (recommended for those who want to work on an issue in this sprint)
|
* all contributors welcome (recommended for those who want to work on an issue in this sprint)
|
||||||
@ -104,26 +87,25 @@ Sprint retrospective
|
|||||||
* via this [zoom link](https://zoom.us/j/7743582385)
|
* via this [zoom link](https://zoom.us/j/7743582385)
|
||||||
* all contributors welcome (most interesting for those who participated in the sprint)
|
* all contributors welcome (most interesting for those who participated in the sprint)
|
||||||
* we review the past sprint and talk about what went well and what we could improve
|
* we review the past sprint and talk about what went well and what we could improve
|
||||||
-->
|
|
||||||
|
|
||||||
## Philosophy
|
## Philosophy
|
||||||
|
|
||||||
We practice [collective code ownership](http://www.extremeprogramming.org/rules/collective.html) rather than strong code ownership, which means that:
|
We practise [collective code ownership](http://www.extremeprogramming.org/rules/collective.html) rather than strong code ownership, which means that:
|
||||||
|
|
||||||
* developers can make contributions to other people's PRs (after checking in with them)
|
* developers can make contributions to other people's PRs (after checking in with them)
|
||||||
* we avoid blocking because someone else isn't working, so we sometimes take over PRs from other developers
|
* we avoid blocking because someone else isn't working, so we sometimes take over PRs from other developers
|
||||||
* everyone should always push their code to branches so others can see it
|
* everyone should always push their code to branches so others can see it
|
||||||
|
|
||||||
We believe in open source contributions as a learning experience – everyone is welcome to join our team of volunteers and to contribute to the project, no matter their background or level of experience. To support your learning experience we founded the charity association [busFaktor() e.V.](https://www.busfaktor.org/en).
|
We believe in open source contributions as a learning experience – everyone is welcome to join our team of volunteers and to contribute to the project, no matter their background or level of experience.
|
||||||
|
|
||||||
We use pair programming sessions as a tool for knowledge sharing. We can learn a lot from each other and only by sharing what we know and overcoming challenges together can we grow as a team and truly own this project collectively.
|
We use pair programming sessions as a tool for knowledge sharing. We can learn a lot from each other and only by sharing what we know and overcoming challenges together can we grow as a team and truly own this project collectively.
|
||||||
|
|
||||||
As a volunteer 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!
|
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
|
## Open-Source Bounties
|
||||||
|
|
||||||
There are so many good reasons to contribute to ocelot.social
|
There are so many good reasons to contribute to Human Connection
|
||||||
|
|
||||||
* You learn state-of-the-art technologies
|
* You learn state-of-the-art technologies
|
||||||
* You build your portfolio
|
* You build your portfolio
|
||||||
@ -139,7 +121,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
|
quick and easy. What's important is starting a working relationship with the
|
||||||
team, learning the workflow, and understanding this contribution guide. You can
|
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
|
filter issues by 'good first issue', to get an idea where to start. Please join
|
||||||
our our [Discord community chat](https://discord.gg/AJSX9DCSUA), too.
|
our our [community chat](https://human-connection.org/discord), 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 `€<amount>`
|
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 `€<amount>`
|
||||||
which indicate their respective financial compensation in Euros.
|
which indicate their respective financial compensation in Euros.
|
||||||
@ -151,87 +133,3 @@ us your invoice as .pdf file attached to an E-Mail once you are done.
|
|||||||
Our Open-Source bounty program is a work-in-progress. Based on our future
|
Our Open-Source bounty program is a work-in-progress. Based on our future
|
||||||
experience we will make changes and improvements. So keep an eye on this
|
experience we will make changes and improvements. So keep an eye on this
|
||||||
contribution guide.
|
contribution guide.
|
||||||
-->
|
|
||||||
|
|
||||||
## Programming
|
|
||||||
|
|
||||||
### Localization
|
|
||||||
|
|
||||||
#### Quotation Marks
|
|
||||||
|
|
||||||
The following characters are different from the programming quotation mark:
|
|
||||||
|
|
||||||
`"` or `\"`
|
|
||||||
|
|
||||||
Please copy and paste the following quotes for the languages:
|
|
||||||
|
|
||||||
* de: „Dies ist ein Beispielsatz.“
|
|
||||||
* en: “This is a sample sentence.”
|
|
||||||
* See <https://grammar.collinsdictionary.com/easy-learning/when-do-you-use-quotation-marks-or-in-english>
|
|
||||||
|
|
||||||
## Docker – More Closely
|
|
||||||
|
|
||||||
### Apple Silicon Platform
|
|
||||||
|
|
||||||
***ATTENTION:** For using Docker commands in Apple Silicon environments!*
|
|
||||||
|
|
||||||
#### Environment Variable For Apple Silicon Platform (M1, M2 Chips)
|
|
||||||
|
|
||||||
If you encounter trouble building the docker containers on an Apple M1 chip you can try to explicitly define the target platform docker builds and pulls images for:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# set env variable for your shell
|
|
||||||
$ export DOCKER_DEFAULT_PLATFORM=linux/amd64
|
|
||||||
```
|
|
||||||
|
|
||||||
Or alternatively use a `YAML` docker compose overwrite file with `platform: linux/amd64`.
|
|
||||||
|
|
||||||
### Analyzing Docker Builds
|
|
||||||
|
|
||||||
To analyze a Docker build, there is a wonderful tool called [dive](https://github.com/wagoodman/dive). Please sponsor if you're using it!
|
|
||||||
|
|
||||||
The `dive build` command is exactly the right one to fulfill what we are looking for.
|
|
||||||
We can use it just like the `docker build` command and get an analysis afterwards.
|
|
||||||
|
|
||||||
So, in our main folder, we use it in the following way:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# in main folder
|
|
||||||
$ dive build --target <layer-name> -t "ocelotsocialnetwork/<app-name>:local-<layer-name>" --build-arg BBUILD_DATE="<build-date>" --build-arg BBUILD_VERSION="<build-version>" --build-arg BBUILD_COMMIT="<build-commit>" <app-folder-name-or-dot>/
|
|
||||||
```
|
|
||||||
|
|
||||||
The build arguments are optional.
|
|
||||||
|
|
||||||
For the specific applications, we use them as follows.
|
|
||||||
|
|
||||||
#### Backend
|
|
||||||
|
|
||||||
##### Production For Backend
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# in main folder
|
|
||||||
$ dive build --target production -t "ocelotsocialnetwork/backend:local-production" backend/
|
|
||||||
```
|
|
||||||
|
|
||||||
##### Development For Backend
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# in main folder
|
|
||||||
$ dive build --target development -t "ocelotsocialnetwork/backend:local-development" backend/
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Webapp
|
|
||||||
|
|
||||||
##### Production For Webapp
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# in main folder
|
|
||||||
$ dive build --target production -t "ocelotsocialnetwork/webapp:local-production" webapp/
|
|
||||||
```
|
|
||||||
|
|
||||||
##### Development For Webapp
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# in main folder
|
|
||||||
$ dive build --target development -t "ocelotsocialnetwork/webapp:local-development" webapp/
|
|
||||||
```
|
|
||||||
|
|||||||
@ -2,10 +2,11 @@
|
|||||||
|
|
||||||
MIT License
|
MIT License
|
||||||
|
|
||||||
Copyright \(c\) 2018-2021 [Ocelot.Social Community](https://github.com/Ocelot-Social-Community)
|
Copyright \(c\) 2018 Human-Connection gGmbH
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files \(the "Software"\), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files \(the "Software"\), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
|
||||||
|
|||||||
309
README.md
@ -1,136 +1,61 @@
|
|||||||
# Ocelot.Social
|
# ocelot.social
|
||||||
|
|
||||||
[](https://github.com/Ocelot-Social-Community/Ocelot-Social/actions/workflows/test-backend.yml)
|
[](https://travis-ci.com/Human-Connection/Human-Connection)
|
||||||
[](https://github.com/Ocelot-Social-Community/Ocelot-Social/actions/workflows/test-webapp.yml)
|
[](https://codecov.io/gh/Human-Connection/Human-Connection/)
|
||||||
[](https://github.com/Ocelot-Social-Community/Ocelot-Social/actions/workflows/test-e2e.yml)
|
[](https://github.com/Human-Connection/Nitro-Backend/blob/backend/LICENSE.md)
|
||||||
[](https://github.com/Ocelot-Social-Community/Ocelot-Social/actions)
|
[](https://discordapp.com/invite/DFSjPaX)
|
||||||
[](https://github.com/Ocelot-Social-Community/Ocelot-Social/blob/master/LICENSE.md)
|
[](https://www.codetriage.com/human-connection/human-connection)
|
||||||
[](https://discord.gg/AJSX9DCSUA)
|
|
||||||
[](https://www.codetriage.com/ocelot-social-community/ocelot-social)
|
|
||||||
|
|
||||||
[Ocelot.social](https://ocelot.social) is free and open source software program code to run social networks. Its development is supported by a community of programmers and interested network operators.
|
ocelot.social is a nonprofit social, action and knowledge network that connects information to action and promotes positive local and global change in all areas of life.
|
||||||
|
|
||||||
<!-- markdownlint-disable MD033 -->
|
* **Social**: Interact with other people not just by commenting their posts, but by providing **Pro & Contra** arguments, give a **Versus** or ask them by integrated **Chat** or **Let's Talk**
|
||||||
<!-- <p align="center"> -->
|
* **Knowledge**: Read articles about interesting topics and find related posts in the **More Info** tab or by **Filtering** based on **Categories** and **Tagging** or by using the **Fulltext Search**.
|
||||||
<p style="text-align: center;">
|
* **Action**: Don't just read about how to make the world a better place, but come into **Action** by following provided suggestions on the **Action** tab provided by other people or **Organisations**.
|
||||||
<a href="https://ocelot.social" target="_blank"><img src="https://raw.githubusercontent.com/Ocelot-Social-Community/Ocelot-Social/master/webapp/static/img/custom/logo-squared.svg" alt="ocelot.social" width="40%" height="40%"></a>
|
|
||||||
|
<p align="center">
|
||||||
|
<img src="webapp/static/img/custom/logo-squared.svg" alt="ocelot.social" width="40%" height="40%">
|
||||||
</p>
|
</p>
|
||||||
<!-- markdownlint-enable MD033 -->
|
|
||||||
|
|
||||||
Our goal is to enable people to participate fairly and equally in online social networks. The equality of opportunity applies both to the fundamental equality of all people and to the possibility of letting their diverse voices be heard.
|
## Live demo
|
||||||
|
|
||||||
We therefore consider it desirable that operators offer such networks so that people can choose where they want to be on the move.
|
__Try out our deployed [development environment](https://develop.human-connection.org/).__
|
||||||
|
|
||||||
Our vision for the future is that at some point it should be possible to link these networks together (ActivityPub, Fediverse) so that users can also connect with people from other networks - for example, by friending them or following posts or other contributions.
|
Logins:
|
||||||
|
|
||||||
If you would like to help set up this capability with us, please contact us.
|
| email | password | role |
|
||||||
|
| :--- | :--- | :--- |
|
||||||
|
| `user@example.org` | 1234 | user |
|
||||||
|
| `moderator@example.org` | 1234 | moderator |
|
||||||
|
| `admin@example.org` | 1234 | admin |
|
||||||
|
|
||||||
In other words, we are interested in a network of networks and in keeping the data as close as possible to the user and the operator they trusts.
|
## Directory Layout
|
||||||
|
|
||||||
## Screenshots
|
There are four important directories:
|
||||||
|
* [Backend](./backend) runs on the server and is a middleware between database and frontend
|
||||||
<!-- markdownlint-disable MD033 -->
|
* [Frontend](./webapp) is a server-side-rendered and client-side-rendered web frontend
|
||||||
<img src="https://user-images.githubusercontent.com/17728384/218597429-554e4082-3906-4721-8f68-0c13146fc218.png" alt="Post feed" title="Post feed" />
|
* [Cypress](./cypress) contains end-to-end tests and executable feature specifications
|
||||||
<!-- markdownlint-enable MD033 -->
|
|
||||||
|
|
||||||
Check out more screenshots [here](https://github.com/Ocelot-Social-Community/Ocelot-Social/wiki/en:Screenshots).
|
|
||||||
|
|
||||||
## Features
|
|
||||||
|
|
||||||
Ocelot.social networks features:
|
|
||||||
|
|
||||||
- **news feed**
|
|
||||||
- **posts**
|
|
||||||
- as **articles** and **events**
|
|
||||||
- **comments**
|
|
||||||
- **filter**
|
|
||||||
- **search**
|
|
||||||
- **groups**
|
|
||||||
- **map**
|
|
||||||
- **user accounts**
|
|
||||||
- **user roles**
|
|
||||||
- make your own **branded network**
|
|
||||||
- and more …
|
|
||||||
|
|
||||||
Check out the [full feature list](https://github.com/Ocelot-Social-Community/Ocelot-Social/wiki/en:FAQ#what-are-the-features).
|
|
||||||
|
|
||||||
## User Guide and Frequently Asked Questions
|
|
||||||
|
|
||||||
In the [wiki](https://github.com/Ocelot-Social-Community/Ocelot-Social/wiki) you can find more information.
|
|
||||||
|
|
||||||
- [User Guide](https://github.com/Ocelot-Social-Community/Ocelot-Social/wiki/en:User-Guide)
|
|
||||||
- [Frequently Asked Questions](https://github.com/Ocelot-Social-Community/Ocelot-Social/wiki/en:FAQ)
|
|
||||||
|
|
||||||
## Demo
|
|
||||||
|
|
||||||
Try out our live demo network, see [here](#live-demo-and-developer-logins).
|
|
||||||
|
|
||||||
## Help us
|
|
||||||
|
|
||||||
If you're wondering how you could help, there are plenty of ways, e.g.:
|
|
||||||
|
|
||||||
- Spread the good word about ocelot.social to make it more popular:
|
|
||||||
- Add the link [ocelot.social](https://ocelot.social) to your website.
|
|
||||||
- Give ocelot.social a Like at <https://alternativeto.net/software/ocelot-social/>.
|
|
||||||
- Star our project on GitHub at <https://github.com/Ocelot-Social-Community/Ocelot-Social/>.
|
|
||||||
- Promote it on your social networks.
|
|
||||||
- Tell your friends about it by word-of-mouth.
|
|
||||||
- Write a press article on ocelot.social or contact the editorial office of your local news page or radio station.
|
|
||||||
- Take a [good first issue](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22) or issues that need help. Make sure to read [CONTRIBUTING.md](./CONTRIBUTING.md) first though.
|
|
||||||
- Testing and [reporting](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/new/choose) bugs.
|
|
||||||
- Translating: Please [contact us](#contact).
|
|
||||||
- Reviewing and testing pull requests.
|
|
||||||
|
|
||||||
## Donate
|
|
||||||
|
|
||||||
Your donation is very welcome and helps to enhance and improve the network. This software is mostly developed and maintained by the association [busFaktor() e.V.](https://www.busfaktor.org/en) . Please support us with a [donation](https://www.busfaktor.org/en/donations) to busFaktor() e.V. . Thanks a lot! ❤️
|
|
||||||
|
|
||||||
## Contact
|
|
||||||
|
|
||||||
Are you interested in operating your own ocelot.social network or becoming a user? Please contact us here:
|
|
||||||
|
|
||||||
- [hello@ocelot.social](mailto:hello@ocelot.social)
|
|
||||||
- our developer chat on [Discord](https://discord.gg/AJSX9DCSUA)
|
|
||||||
|
|
||||||
## For Developers and Contributors
|
|
||||||
|
|
||||||
### Introduction
|
|
||||||
|
|
||||||
Have a look into our short video:
|
|
||||||
[ocelot.social - GitHub - Developer Welcome - Tutorial (english)](https://www.youtube.com/watch?v=gZSL6KvBIiY&list=PLFMD5liPP01kbuReHxYXxv_1fI5rIgS1f&index=1)
|
|
||||||
|
|
||||||
### Directory Layout
|
|
||||||
|
|
||||||
There are three 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
|
|
||||||
|
|
||||||
In order to setup the application and start to develop features you have to
|
In order to setup the application and start to develop features you have to
|
||||||
setup **webapp** and **backend**.
|
setup **frontend** and **backend**.
|
||||||
|
|
||||||
There are two approaches:
|
There are two approaches:
|
||||||
|
|
||||||
1. [Local](#local-installation) installation, which means you have to take care of dependencies yourself.
|
1. Local installation, which means you have to take care of dependencies yourself
|
||||||
2. **Or** install everything through [Docker](#docker-installation) which takes care of dependencies for you.
|
2. **Or** Install everything through Docker which takes care of dependencies for you
|
||||||
|
|
||||||
### Installation
|
## Installation
|
||||||
|
|
||||||
#### Clone the Repository
|
|
||||||
|
|
||||||
|
### Clone the Repository
|
||||||
Clone the repository, this will create a new folder called `Ocelot-Social`:
|
Clone the repository, this will create a new folder called `Ocelot-Social`:
|
||||||
|
|
||||||
Using HTTPS:
|
Using HTTPS:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
$ git clone https://github.com/Ocelot-Social-Community/Ocelot-Social.git
|
$ git clone https://github.com/Ocelot-Social-Community/Ocelot-Social.git
|
||||||
```
|
```
|
||||||
|
|
||||||
Using SSH:
|
Using SSH:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
$ git clone git@github.com:Ocelot-Social-Community/Ocelot-Social.git
|
$ git clone git@github.com:Human-Connection/Human-Connection.git
|
||||||
```
|
```
|
||||||
|
|
||||||
Change into the new folder.
|
Change into the new folder.
|
||||||
@ -139,177 +64,71 @@ Change into the new folder.
|
|||||||
$ cd Ocelot-Social
|
$ cd Ocelot-Social
|
||||||
```
|
```
|
||||||
|
|
||||||
### Live Demo and Developer Logins
|
### Docker Installation
|
||||||
|
|
||||||
**Try out our deployed [development environment](https://stage.ocelot.social).**
|
|
||||||
|
|
||||||
Visit our staging networks:
|
|
||||||
|
|
||||||
- central staging network: [stage.ocelot.social](https://stage.ocelot.social)
|
|
||||||
<!-- - rebranded staging network: [rebrand.ocelot.social](https://stage.ocelot.social). -->
|
|
||||||
|
|
||||||
#### Login
|
|
||||||
|
|
||||||
Logins for the live demos and developers (local developers after the following installations) in the browser:
|
|
||||||
|
|
||||||
| email | password | role |
|
|
||||||
| :--- | :--- | :--- |
|
|
||||||
| `user@example.org` | 1234 | user |
|
|
||||||
| `moderator@example.org` | 1234 | moderator |
|
|
||||||
| `admin@example.org` | 1234 | admin |
|
|
||||||
|
|
||||||
#### Docker Installation
|
|
||||||
|
|
||||||
Docker is a software development container tool that combines software and its dependencies into one standardized unit that contains everything needed to run it. This helps us to avoid problems with dependencies and makes installation easier.
|
Docker is a software development container tool that combines software and its dependencies into one standardized unit that contains everything needed to run it. This helps us to avoid problems with dependencies and makes installation easier.
|
||||||
|
|
||||||
##### General Installation of Docker
|
#### General Installation of Docker
|
||||||
|
|
||||||
There are [several ways to install Docker](https://docs.docker.com/get-docker/) on your computer or server.
|
There are [sevaral ways to install Docker CE](https://docs.docker.com/install/) on your computer or server.
|
||||||
|
|
||||||
|
* [install Docker Desktop on macOS](https://docs.docker.com/docker-for-mac/install/)
|
||||||
|
* [install Docker Desktop on Windows](https://docs.docker.com/docker-for-windows/install/)
|
||||||
|
* [install Docker CE on Linux](https://docs.docker.com/install/)
|
||||||
|
|
||||||
Check the correct Docker installation by checking the version before proceeding. E.g. we have the following versions:
|
Check the correct Docker installation by checking the version before proceeding. E.g. we have the following versions:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# use Docker version 24.0.6 or newer
|
|
||||||
# includes Docker Compose
|
|
||||||
$ docker --version
|
$ docker --version
|
||||||
|
Docker version 18.09.2
|
||||||
|
$ docker-compose --version
|
||||||
|
docker-compose version 1.23.2
|
||||||
```
|
```
|
||||||
|
|
||||||
##### Start Ocelot-Social via Docker Compose
|
#### Start Ocelot-Social via Docker-Compose
|
||||||
|
|
||||||
***ATTENTION:** For using Docker commands in Apple Silicon environments see [here](https://github.com/Ocelot-Social-Community/Ocelot-Social/blob/master/CONTRIBUTING.md#apple-silicon-platform).*
|
|
||||||
|
|
||||||
Prepare ENVs once beforehand:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# in folder webapp/
|
|
||||||
$ cp .env.template .env
|
|
||||||
|
|
||||||
# in folder backend/
|
|
||||||
$ cp .env.template .env
|
|
||||||
|
|
||||||
For Development:
|
For Development:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# in main folder
|
docker-compose up
|
||||||
$ docker compose up
|
|
||||||
```
|
```
|
||||||
|
|
||||||
For Production:
|
For Production
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# in main folder
|
docker-compose -f docker-compose.yml up
|
||||||
$ docker compose -f docker-compose.yml up
|
|
||||||
```
|
```
|
||||||
|
|
||||||
This will start all required Docker containers.
|
This will start all required Docker containers
|
||||||
Make sure your database is running on `http://localhost:7474/browser/`.
|
|
||||||
|
|
||||||
Prepare database once before you start by running the following command in a second terminal:
|
## Deployment
|
||||||
|
|
||||||
```bash
|
Deployment methods can be found in the [Ocelot-Social-Deploy-Rebranding](https://github.com/Ocelot-Social-Community/Ocelot-Social-Deploy-Rebranding) repository.
|
||||||
# in main folder while docker compose is up
|
|
||||||
$ docker compose exec backend yarn run db:migrate init
|
|
||||||
$ docker compose exec backend yarn run db:migrate up
|
|
||||||
```
|
|
||||||
|
|
||||||
Then clear and seed database by running the following command as well in the second terminal:
|
The only deployment method in this repository is `docker-compose` for development purposes as described above.
|
||||||
|
|
||||||
```bash
|
## Developer Chat
|
||||||
# in main folder while docker compose is up
|
|
||||||
$ docker compose exec backend yarn run db:reset
|
|
||||||
$ docker compose exec backend yarn run db:seed
|
|
||||||
```
|
|
||||||
|
|
||||||
For a closer description see [backend](./backend/README.md).
|
Join our friendly open-source community on [Discord](https://discordapp.com/invite/DFSjPaX) :heart_eyes_cat:
|
||||||
For a full documentation of the Docker installation see [summary](./SUMMARY.md).
|
Just introduce yourself at `#introduce-yourself` and mention `@@Mentor` to get you onboard :neckbeard:
|
||||||
|
Check out the [contribution guideline](./CONTRIBUTING.md), too!
|
||||||
#### Local Installation
|
|
||||||
|
|
||||||
For a full documentation of the local installation see [summary](./SUMMARY.md).
|
|
||||||
|
|
||||||
### Contributing
|
|
||||||
|
|
||||||
Choose an issue (consider our label [good-first-issue](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22)) and leave a comment there. We will then invite you to join our volunteers team.
|
|
||||||
To have the necessary permission to push directly to this repository, please accept our invitation to join our volunteers team, you will receive via the email, Github will send you, once invited. If we did not invite you yet, please request an invitation via Discord.
|
|
||||||
|
|
||||||
We are happy if you fork our repository, but we don't recommend it for development. You do not need a fork.
|
|
||||||
|
|
||||||
Clone this repository locally as [described above](#clone-the-repository), create your branch named `<issue-number>-<description>`, add your code and push your branch direct to this repository. Then create a PR by comparing it to our `master`.
|
|
||||||
|
|
||||||
***!!! Be aware:*** Please don't compare from a fork, because the tests are breaking caused by credential problems.
|
|
||||||
|
|
||||||
Please run the following commands before you push:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# in folder backend/
|
|
||||||
$ yarn lint --fix
|
|
||||||
$ yarn test
|
|
||||||
```
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# in folder webapp/
|
|
||||||
$ yarn lint --fix
|
|
||||||
$ yarn locales --fix
|
|
||||||
$ yarn test
|
|
||||||
```
|
|
||||||
|
|
||||||
Check out our [contribution guideline](https://github.com/Ocelot-Social-Community/Ocelot-Social/blob/master/CONTRIBUTING.md), too!
|
|
||||||
|
|
||||||
#### Developer Chat
|
|
||||||
|
|
||||||
Join our friendly open-source community on [Discord](https://discord.gg/AJSX9DCSUA) 😻
|
|
||||||
Just introduce yourself at `#introduce-yourself` and mention a mentor or `@@Mentors` to get you onboard 🤓
|
|
||||||
|
|
||||||
We give write permissions to every developer who asks for it. Just text us on
|
We give write permissions to every developer who asks for it. Just text us on
|
||||||
[Discord](https://discord.gg/AJSX9DCSUA).
|
[Discord](https://discord.gg/6ub73U3).
|
||||||
|
|
||||||
### Deployment
|
## Technology Stack
|
||||||
|
|
||||||
Deployment methods can be found in our `deployment` folder described in the [README](./deployment/README.md).
|
* [VueJS](https://vuejs.org/)
|
||||||
Our branding template is our [stage.ocelot.social](https://github.com/Ocelot-Social-Community/stage.ocelot.social) repository.
|
* [NuxtJS](https://nuxtjs.org/)
|
||||||
Place your branding repository inside `deployment/configurations`.
|
* [GraphQL](https://graphql.org/)
|
||||||
|
* [NodeJS](https://nodejs.org/en/)
|
||||||
|
* [Neo4J](https://neo4j.com/)
|
||||||
|
|
||||||
The only deployment method in this repository for production purposes is [Kubernetes](https://kubernetes.io) for now.
|
## Attributions
|
||||||
But we just started to develop a deployment for [Docker Compose](https://docs.docker.com/compose/) as well.
|
|
||||||
|
|
||||||
The only deployment method with branding in this repository for development purposes as described above is [Docker Compose](https://docs.docker.com/compose/):
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# in folder deployment/
|
|
||||||
# set your branding folder name in .env
|
|
||||||
# then run
|
|
||||||
$ docker compose up
|
|
||||||
```
|
|
||||||
|
|
||||||
The code is branded automatically.
|
|
||||||
To setup the Neo4j database see above.
|
|
||||||
|
|
||||||
### Technology Stack
|
|
||||||
|
|
||||||
- [VueJS](https://vuejs.org/)
|
|
||||||
- [NuxtJS](https://nuxtjs.org/)
|
|
||||||
- [GraphQL](https://graphql.org/)
|
|
||||||
- [NodeJS](https://nodejs.org/en/)
|
|
||||||
- [Neo4J](https://neo4j.com/)
|
|
||||||
|
|
||||||
#### For Testing
|
|
||||||
|
|
||||||
- [Cypress](https://docs.cypress.io/)
|
|
||||||
- [Storybook](https://storybook.js.org/)
|
|
||||||
- [Jest](https://jestjs.io/)
|
|
||||||
- [Vue Test Utils](https://vue-test-utils.vuejs.org/)
|
|
||||||
- [ESLint](https://eslint.org/)
|
|
||||||
|
|
||||||
### Attributions
|
|
||||||
|
|
||||||
Locale Icons made by [Freepik](http://www.freepik.com/) from [www.flaticon.com](https://www.flaticon.com/) is licensed by [CC 3.0 BY](http://creativecommons.org/licenses/by/3.0/).
|
Locale Icons made by [Freepik](http://www.freepik.com/) from [www.flaticon.com](https://www.flaticon.com/) is licensed by [CC 3.0 BY](http://creativecommons.org/licenses/by/3.0/).
|
||||||
|
|
||||||
Browser compatibility testing with [BrowserStack](https://www.browserstack.com/).
|
Browser compatibility testing with [BrowserStack](https://www.browserstack.com/).
|
||||||
|
|
||||||
<!-- markdownlint-disable MD033 -->
|
<img alt="BrowserStack Logo" src=".gitbook/assets/browserstack-logo.svg" width="256">
|
||||||
<img alt="BrowserStack Logo" src="https://raw.githubusercontent.com/Ocelot-Social-Community/Ocelot-Social/master/.gitbook/assets/browserstack-logo.svg" width="256">
|
|
||||||
<!-- markdownlint-enable MD033 -->
|
|
||||||
|
|
||||||
### License
|
|
||||||
|
|
||||||
|
## License
|
||||||
See the [LICENSE](LICENSE.md) file for license rights and limitations (MIT).
|
See the [LICENSE](LICENSE.md) file for license rights and limitations (MIT).
|
||||||
|
|||||||
15
SUMMARY.md
@ -1,22 +1,23 @@
|
|||||||
# Table of contents
|
# Table of contents
|
||||||
|
|
||||||
* [Introduction](README.md)
|
* [Introduction](README.md)
|
||||||
|
* [Edit this Documentation](edit-this-documentation.md)
|
||||||
* [Neo4J](neo4j/README.md)
|
* [Neo4J](neo4j/README.md)
|
||||||
* [Backend](backend/README.md)
|
* [Backend](backend/README.md)
|
||||||
* [GraphQL](backend/graphql.md)
|
* [GraphQL](backend/graphql.md)
|
||||||
* [neo4j-graphql-js](backend/neo4j-graphql-js.md)
|
* [neo4j-graphql-js](backend/neo4j-graphql-js.md)
|
||||||
* [Webapp (Frontend)](webapp/README.md)
|
* [Webapp](webapp/README.md)
|
||||||
* [Components](webapp/components.md)
|
* [Components](webapp/components.md)
|
||||||
* [HTML](webapp/html.md)
|
* [HTML](webapp/html.md)
|
||||||
* [SCSS](webapp/scss.md)
|
* [SCSS](webapp/scss.md)
|
||||||
* [Vue](webapp/vue.md)
|
* [Vue](webapp/vue.md)
|
||||||
* [Testing Guide](testing.md)
|
* [Testing Guide](testing.md)
|
||||||
* [End-to-end Tests](cypress/README.md)
|
* [End-to-end tests](cypress/README.md)
|
||||||
* [Webapp (Frontend) Tests](webapp/testing.md)
|
* [Frontend tests](webapp/testing.md)
|
||||||
* [Backend Tests](backend/testing.md)
|
* [Backend tests](backend/testing.md)
|
||||||
* [Deployment](deployment/README.md)
|
* [Deployment](https://github.com/Ocelot-Social-Community/Ocelot-Social-Deploy-Rebranding/blob/master/deployment/README.md)
|
||||||
* [Contributing](CONTRIBUTING.md)
|
* [Contributing](CONTRIBUTING.md)
|
||||||
* [Feature Specification](cypress/features.md)
|
* [Feature Specification](cypress/features.md)
|
||||||
* [Code of Conduct](CODE_OF_CONDUCT.md)
|
* [Code of conduct](CODE_OF_CONDUCT.md)
|
||||||
* [Documentation](documentation.md)
|
|
||||||
* [License](LICENSE.md)
|
* [License](LICENSE.md)
|
||||||
|
|
||||||
|
|||||||
2
backend/.codecov.yml
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
coverage:
|
||||||
|
range: "60...100"
|
||||||
@ -12,9 +12,11 @@ docker-compose*.yml
|
|||||||
./*.log
|
./*.log
|
||||||
|
|
||||||
node_modules/
|
node_modules/
|
||||||
build/
|
scripts/
|
||||||
|
dist/
|
||||||
|
|
||||||
maintenance-worker/
|
maintenance-worker/
|
||||||
neo4j/
|
neo4j/
|
||||||
|
|
||||||
|
public/uploads/*
|
||||||
!.gitkeep
|
!.gitkeep
|
||||||
|
|||||||
@ -1,51 +1,30 @@
|
|||||||
DEBUG=neo4j-graphql-js
|
|
||||||
|
|
||||||
NEO4J_URI=bolt://localhost:7687
|
NEO4J_URI=bolt://localhost:7687
|
||||||
NEO4J_USERNAME=neo4j
|
NEO4J_USERNAME=neo4j
|
||||||
NEO4J_PASSWORD=letmein
|
NEO4J_PASSWORD=letmein
|
||||||
GRAPHQL_URI=http://localhost:4000
|
GRAPHQL_URI=http://localhost:4000
|
||||||
CLIENT_URI=http://localhost:3000
|
CLIENT_URI=http://localhost:3000
|
||||||
|
|
||||||
# E-Mail default settings
|
|
||||||
SUPPORT_EMAIL="devops@ocelot.social"
|
|
||||||
EMAIL_DEFAULT_SENDER="devops@ocelot.social"
|
|
||||||
SMTP_HOST=
|
SMTP_HOST=
|
||||||
SMTP_PORT=
|
SMTP_PORT=
|
||||||
SMTP_IGNORE_TLS=true
|
SMTP_IGNORE_TLS=true
|
||||||
SMTP_MAX_CONNECTIONS=5
|
|
||||||
SMTP_MAX_MESSAGES=Infinity
|
|
||||||
SMTP_USERNAME=
|
SMTP_USERNAME=
|
||||||
SMTP_PASSWORD=
|
SMTP_PASSWORD=
|
||||||
SMTP_SECURE="false" # true for 465, false for other ports
|
|
||||||
SMTP_DKIM_DOMAINNAME=
|
|
||||||
SMTP_DKIM_KEYSELECTOR=
|
|
||||||
SMTP_DKIM_PRIVATEKEY=
|
|
||||||
# E-Mail settings for our 'docker compose up mailserver'
|
|
||||||
# SMTP_HOST=localhost
|
|
||||||
# SMTP_PORT=1025
|
|
||||||
# SMTP_IGNORE_TLS=true
|
|
||||||
# SMTP_USERNAME=
|
|
||||||
# SMTP_PASSWORD=
|
|
||||||
# SMTP_MAX_CONNECTIONS=1
|
|
||||||
# SMTP_MAX_MESSAGES= 10
|
|
||||||
|
|
||||||
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
|
||||||
INVITE_REGISTRATION=true
|
INVITE_REGISTRATION=true
|
||||||
|
|
||||||
AWS_ACCESS_KEY_ID=minio
|
AWS_ACCESS_KEY_ID=
|
||||||
AWS_SECRET_ACCESS_KEY=12341234
|
AWS_SECRET_ACCESS_KEY=
|
||||||
AWS_ENDPOINT=http://localhost:9000
|
AWS_ENDPOINT=
|
||||||
AWS_REGION=local
|
AWS_REGION=
|
||||||
AWS_BUCKET=ocelot
|
AWS_BUCKET=
|
||||||
IMAGOR_PUBLIC_URL=http://localhost:8000
|
|
||||||
IMAGOR_SECRET=mysecret
|
|
||||||
|
|
||||||
CATEGORIES_ACTIVE=false
|
EMAIL_DEFAULT_SENDER="devops@ocelot.social"
|
||||||
MAX_PINNED_POSTS=1
|
EMAIL_SUPPORT="devops@ocelot.social"
|
||||||
MAX_GROUP_PINNED_POSTS=1
|
|
||||||
|
|||||||
@ -1,43 +0,0 @@
|
|||||||
DEBUG=true
|
|
||||||
|
|
||||||
NEO4J_URI=bolt://localhost:7687
|
|
||||||
NEO4J_USERNAME=neo4j
|
|
||||||
NEO4J_PASSWORD=letmein
|
|
||||||
GRAPHQL_URI=http://localhost:4000
|
|
||||||
CLIENT_URI=http://localhost:3000
|
|
||||||
|
|
||||||
# E-Mail default settings
|
|
||||||
SUPPORT_EMAIL="devops@ocelot.social"
|
|
||||||
EMAIL_DEFAULT_SENDER="devops@ocelot.social"
|
|
||||||
SMTP_HOST=mailserver
|
|
||||||
SMTP_PORT=1025
|
|
||||||
SMTP_IGNORE_TLS=true
|
|
||||||
SMTP_MAX_CONNECTIONS=5
|
|
||||||
SMTP_MAX_MESSAGES=Infinity
|
|
||||||
SMTP_USERNAME=
|
|
||||||
SMTP_PASSWORD=
|
|
||||||
SMTP_SECURE="false" # true for 465, false for other ports
|
|
||||||
SMTP_DKIM_DOMAINNAME=
|
|
||||||
SMTP_DKIM_KEYSELECTOR=
|
|
||||||
SMTP_DKIM_PRIVATEKEY=
|
|
||||||
|
|
||||||
JWT_SECRET="b/&&7b78BF&fv/Vd"
|
|
||||||
JWT_EXPIRES="2y"
|
|
||||||
MAPBOX_TOKEN="pk.eyJ1IjoiYnVzZmFrdG9yIiwiYSI6ImNraDNiM3JxcDBhaWQydG1uczhpZWtpOW4ifQ.7TNRTO-o9aK1Y6MyW_Nd4g"
|
|
||||||
|
|
||||||
SENTRY_DSN_BACKEND=
|
|
||||||
COMMIT=
|
|
||||||
PUBLIC_REGISTRATION=false
|
|
||||||
INVITE_REGISTRATION=true
|
|
||||||
|
|
||||||
AWS_ACCESS_KEY_ID=minio
|
|
||||||
AWS_SECRET_ACCESS_KEY=12341234
|
|
||||||
AWS_ENDPOINT=http://localhost:9000
|
|
||||||
AWS_REGION=local
|
|
||||||
AWS_BUCKET=ocelot
|
|
||||||
IMAGOR_PUBLIC_URL=http://localhost:8000
|
|
||||||
IMAGOR_SECRET=mysecret
|
|
||||||
|
|
||||||
CATEGORIES_ACTIVE=false
|
|
||||||
MAX_PINNED_POSTS=1
|
|
||||||
MAX_GROUP_PINNED_POSTS=1
|
|
||||||
@ -1,3 +0,0 @@
|
|||||||
node_modules/
|
|
||||||
build/
|
|
||||||
coverage/
|
|
||||||
@ -1,263 +0,0 @@
|
|||||||
// eslint-disable-next-line import/no-commonjs
|
|
||||||
module.exports = {
|
|
||||||
root: true,
|
|
||||||
env: {
|
|
||||||
node: true,
|
|
||||||
},
|
|
||||||
parser: '@typescript-eslint/parser',
|
|
||||||
plugins: ['prettier', '@typescript-eslint', 'import', 'n', 'promise', 'security', 'no-catch-all'],
|
|
||||||
extends: [
|
|
||||||
'standard',
|
|
||||||
'eslint:recommended',
|
|
||||||
'plugin:n/recommended',
|
|
||||||
'plugin:prettier/recommended',
|
|
||||||
'plugin:import/recommended',
|
|
||||||
'plugin:import/typescript',
|
|
||||||
'plugin:promise/recommended',
|
|
||||||
'plugin:@eslint-community/eslint-comments/recommended',
|
|
||||||
'prettier',
|
|
||||||
],
|
|
||||||
settings: {
|
|
||||||
'import/parsers': {
|
|
||||||
'@typescript-eslint/parser': ['.ts', '.tsx'],
|
|
||||||
},
|
|
||||||
'import/resolver': {
|
|
||||||
typescript: {
|
|
||||||
project: ['./tsconfig.json', './backend/tsconfig.json'],
|
|
||||||
},
|
|
||||||
node: true,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
rules: {
|
|
||||||
'no-catch-all/no-catch-all': 'error',
|
|
||||||
'no-console': 'error',
|
|
||||||
camelcase: 'error',
|
|
||||||
'no-debugger': 'error',
|
|
||||||
'prettier/prettier': [
|
|
||||||
'error',
|
|
||||||
{
|
|
||||||
htmlWhitespaceSensitivity: 'ignore',
|
|
||||||
},
|
|
||||||
],
|
|
||||||
// import
|
|
||||||
'import/export': 'error',
|
|
||||||
// 'import/no-deprecated': 'error',
|
|
||||||
'import/no-empty-named-blocks': 'error',
|
|
||||||
'import/no-extraneous-dependencies': 'error',
|
|
||||||
'import/no-mutable-exports': 'error',
|
|
||||||
'import/no-unused-modules': 'error',
|
|
||||||
'import/no-named-as-default': 'error',
|
|
||||||
'import/no-named-as-default-member': 'error',
|
|
||||||
'import/no-amd': 'error',
|
|
||||||
'import/no-commonjs': 'error',
|
|
||||||
'import/no-import-module-exports': 'error',
|
|
||||||
'import/no-nodejs-modules': 'off',
|
|
||||||
'import/unambiguous': 'off', // not compatible with .eslintrc.cjs
|
|
||||||
'import/default': 'error',
|
|
||||||
'import/named': 'off', // has false positives
|
|
||||||
'import/namespace': 'error',
|
|
||||||
'import/no-absolute-path': 'error',
|
|
||||||
'import/no-cycle': 'error',
|
|
||||||
'import/no-dynamic-require': 'error',
|
|
||||||
'import/no-internal-modules': 'off',
|
|
||||||
'import/no-relative-packages': 'error',
|
|
||||||
'import/no-relative-parent-imports': ['error', { ignore: ['@/*'] }],
|
|
||||||
'import/no-self-import': 'error',
|
|
||||||
'import/no-unresolved': 'error',
|
|
||||||
'import/no-useless-path-segments': 'error',
|
|
||||||
'import/no-webpack-loader-syntax': 'error',
|
|
||||||
'import/consistent-type-specifier-style': 'error',
|
|
||||||
'import/exports-last': 'off',
|
|
||||||
'import/extensions': 'error',
|
|
||||||
'import/first': 'error',
|
|
||||||
'import/group-exports': 'off',
|
|
||||||
'import/newline-after-import': 'error',
|
|
||||||
'import/no-anonymous-default-export': 'off', // not compatible with neode
|
|
||||||
'import/no-default-export': 'off', // not compatible with neode
|
|
||||||
'import/no-duplicates': 'error',
|
|
||||||
'import/no-named-default': 'error',
|
|
||||||
'import/no-namespace': 'error',
|
|
||||||
'import/no-unassigned-import': 'error',
|
|
||||||
'import/order': [
|
|
||||||
'error',
|
|
||||||
{
|
|
||||||
groups: ['builtin', 'external', 'internal', 'parent', 'sibling', 'index', 'object', 'type'],
|
|
||||||
'newlines-between': 'always',
|
|
||||||
pathGroups: [
|
|
||||||
{
|
|
||||||
pattern: '@?*/**',
|
|
||||||
group: 'external',
|
|
||||||
position: 'after',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
pattern: '@/**',
|
|
||||||
group: 'external',
|
|
||||||
position: 'after',
|
|
||||||
},
|
|
||||||
],
|
|
||||||
alphabetize: {
|
|
||||||
order: 'asc' /* sort in ascending order. Options: ['ignore', 'asc', 'desc'] */,
|
|
||||||
caseInsensitive: true /* ignore case. Options: [true, false] */,
|
|
||||||
},
|
|
||||||
distinctGroup: true,
|
|
||||||
},
|
|
||||||
],
|
|
||||||
'import/prefer-default-export': 'off',
|
|
||||||
|
|
||||||
// n
|
|
||||||
// 'n/callback-return': 'error',
|
|
||||||
'n/exports-style': 'error',
|
|
||||||
'n/file-extension-in-import': ['error', 'never'],
|
|
||||||
'n/global-require': 'error',
|
|
||||||
'n/handle-callback-err': 'error',
|
|
||||||
// 'n/hashbang': 'error', // part of n/recommended
|
|
||||||
'n/no-callback-literal': 'error',
|
|
||||||
// 'n/no-deprecated-api': 'error', // part of n/recommended
|
|
||||||
// 'n/no-exports-assign': 'error', // part of n/recommended
|
|
||||||
'n/no-extraneous-import': 'off', // duplicate of import/no-extraneous-dependencies // part of n/recommended
|
|
||||||
// 'n/no-extraneous-require': 'error', // part of n/recommended
|
|
||||||
'n/no-hide-core-modules': 'error',
|
|
||||||
'n/no-missing-import': 'off', // not compatible with typescript // part of n/recommended
|
|
||||||
// 'n/no-missing-require': 'error', // part of n/recommended
|
|
||||||
'n/no-mixed-requires': 'error',
|
|
||||||
'n/no-new-require': 'error',
|
|
||||||
'n/no-path-concat': 'error',
|
|
||||||
'n/no-process-env': 'error',
|
|
||||||
// 'n/no-process-exit': 'error', // part of n/recommended
|
|
||||||
'n/no-restricted-import': 'error',
|
|
||||||
'n/no-restricted-require': 'error',
|
|
||||||
'n/no-sync': 'error',
|
|
||||||
// 'n/no-unpublished-bin': 'error', // part of n/recommended
|
|
||||||
'n/no-unpublished-import': [
|
|
||||||
'error',
|
|
||||||
{ allowModules: ['apollo-server-testing', 'rosie', '@faker-js/faker', 'ts-jest'] },
|
|
||||||
], // part of n/recommended
|
|
||||||
'n/no-unpublished-require': ['error', { allowModules: ['ts-jest', 'require-json5'] }], // part of n/recommended
|
|
||||||
// 'n/no-unsupported-features/es-builtins': 'error', // part of n/recommended
|
|
||||||
// 'n/no-unsupported-features/es-syntax': 'error', // part of n/recommended
|
|
||||||
// 'n/no-unsupported-features/node-builtins': 'error', // part of n/recommended
|
|
||||||
'n/prefer-global/buffer': 'error',
|
|
||||||
'n/prefer-global/console': 'error',
|
|
||||||
'n/prefer-global/process': 'error',
|
|
||||||
'n/prefer-global/text-decoder': 'error',
|
|
||||||
'n/prefer-global/text-encoder': 'error',
|
|
||||||
'n/prefer-global/url': 'error',
|
|
||||||
'n/prefer-global/url-search-params': 'error',
|
|
||||||
'n/prefer-node-protocol': 'error',
|
|
||||||
'n/prefer-promises/dns': 'error',
|
|
||||||
'n/prefer-promises/fs': 'error',
|
|
||||||
// 'n/process-exit-as-throw': 'error', // part of n/recommended
|
|
||||||
'n/shebang': 'error',
|
|
||||||
|
|
||||||
// promise
|
|
||||||
// 'promise/always-return': 'error', // part of promise/recommended
|
|
||||||
'promise/avoid-new': 'error',
|
|
||||||
// 'promise/catch-or-return': 'error', // part of promise/recommended
|
|
||||||
// 'promise/no-callback-in-promise': 'warn', // part of promise/recommended
|
|
||||||
'promise/no-multiple-resolved': 'error',
|
|
||||||
'promise/no-native': 'off', // ES5 only
|
|
||||||
// 'promise/no-nesting': 'warn', // part of promise/recommended
|
|
||||||
// 'promise/no-new-statics': 'error', // part of promise/recommended
|
|
||||||
// 'promise/no-promise-in-callback': 'warn', // part of promise/recommended
|
|
||||||
// 'promise/no-return-in-finally': 'warn', // part of promise/recommended
|
|
||||||
// 'promise/no-return-wrap': 'error', // part of promise/recommended
|
|
||||||
// 'promise/param-names': 'error', // part of promise/recommended
|
|
||||||
'promise/prefer-await-to-callbacks': 'error',
|
|
||||||
'promise/prefer-catch': 'error',
|
|
||||||
'promise/spec-only': 'error',
|
|
||||||
// 'promise/valid-params': 'error', // part of promise/recommended
|
|
||||||
|
|
||||||
// eslint comments
|
|
||||||
'@eslint-community/eslint-comments/disable-enable-pair': ['error', { allowWholeFile: true }],
|
|
||||||
'@eslint-community/eslint-comments/no-restricted-disable': 'error',
|
|
||||||
'@eslint-community/eslint-comments/no-use': 'off',
|
|
||||||
'@eslint-community/eslint-comments/require-description': 'off',
|
|
||||||
},
|
|
||||||
overrides: [
|
|
||||||
{
|
|
||||||
files: ['*.js', '*.cjs', '*.ts', '*.tsx'],
|
|
||||||
extends: ['plugin:security/recommended-legacy'],
|
|
||||||
},
|
|
||||||
// only for ts files
|
|
||||||
{
|
|
||||||
files: ['*.ts', '*.tsx'],
|
|
||||||
extends: [
|
|
||||||
'plugin:@typescript-eslint/recommended',
|
|
||||||
'plugin:@typescript-eslint/recommended-requiring-type-checking',
|
|
||||||
'plugin:@typescript-eslint/strict',
|
|
||||||
'prettier',
|
|
||||||
],
|
|
||||||
rules: {
|
|
||||||
// allow explicitly defined dangling promises
|
|
||||||
// '@typescript-eslint/no-floating-promises': ['error', { ignoreVoid: true }],
|
|
||||||
'no-void': ['error', { allowAsStatement: true }],
|
|
||||||
// ignore prefer-regexp-exec rule to allow string.match(regex)
|
|
||||||
'@typescript-eslint/prefer-regexp-exec': 'off',
|
|
||||||
// this should not run on ts files: https://github.com/import-js/eslint-plugin-import/issues/2215#issuecomment-911245486
|
|
||||||
'import/unambiguous': 'off',
|
|
||||||
// this is not compatible with typeorm, due to joined tables can be null, but are not defined as nullable
|
|
||||||
'@typescript-eslint/no-unnecessary-condition': 'off',
|
|
||||||
// respect underscore as acceptable unused variable
|
|
||||||
'@typescript-eslint/no-unused-vars': [
|
|
||||||
'error',
|
|
||||||
{ argsIgnorePattern: '^_', varsIgnorePattern: '^_' },
|
|
||||||
],
|
|
||||||
},
|
|
||||||
parserOptions: {
|
|
||||||
tsconfigRootDir: __dirname,
|
|
||||||
project: ['./tsconfig.json'],
|
|
||||||
// this is to properly reference the referenced project database without requirement of compiling it
|
|
||||||
EXPERIMENTAL_useSourceOfProjectReferenceRedirect: true,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
files: ['*.spec.ts'],
|
|
||||||
plugins: ['jest'],
|
|
||||||
env: {
|
|
||||||
jest: true,
|
|
||||||
},
|
|
||||||
rules: {
|
|
||||||
'jest/no-disabled-tests': 'error',
|
|
||||||
'jest/no-focused-tests': 'error',
|
|
||||||
'jest/no-identical-title': 'error',
|
|
||||||
'jest/prefer-to-have-length': 'error',
|
|
||||||
'jest/valid-expect': 'error',
|
|
||||||
'@typescript-eslint/unbound-method': 'off',
|
|
||||||
'jest/unbound-method': 'error',
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
extends: ['plugin:jsonc/recommended-with-jsonc'],
|
|
||||||
files: ['*.json', '*.json5', '*.jsonc'],
|
|
||||||
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,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
],
|
|
||||||
}
|
|
||||||
25
backend/.eslintrc.js
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
module.exports = {
|
||||||
|
env: {
|
||||||
|
es6: true,
|
||||||
|
node: true,
|
||||||
|
jest: true
|
||||||
|
},
|
||||||
|
parserOptions: {
|
||||||
|
parser: 'babel-eslint'
|
||||||
|
},
|
||||||
|
extends: [
|
||||||
|
'standard',
|
||||||
|
'plugin:prettier/recommended'
|
||||||
|
],
|
||||||
|
plugins: [
|
||||||
|
'jest'
|
||||||
|
],
|
||||||
|
rules: {
|
||||||
|
//'indent': [ 'error', 2 ],
|
||||||
|
//'quotes': [ "error", "single"],
|
||||||
|
// 'no-console': process.env.NODE_ENV === 'production' ? 'error' : 'off',
|
||||||
|
'no-console': ['error'],
|
||||||
|
'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off',
|
||||||
|
'prettier/prettier': ['error'],
|
||||||
|
},
|
||||||
|
};
|
||||||
3
backend/.gitignore
vendored
@ -3,9 +3,10 @@ node_modules/
|
|||||||
.vscode
|
.vscode
|
||||||
.idea
|
.idea
|
||||||
yarn-error.log
|
yarn-error.log
|
||||||
build/*
|
dist/*
|
||||||
coverage.lcov
|
coverage.lcov
|
||||||
.nyc_output/
|
.nyc_output/
|
||||||
|
public/uploads/*
|
||||||
!.gitkeep
|
!.gitkeep
|
||||||
|
|
||||||
# Apple macOS folder attribute file
|
# Apple macOS folder attribute file
|
||||||
|
|||||||
3
backend/.graphqlconfig
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
{
|
||||||
|
"schemaPath": "./src/schema.graphql"
|
||||||
|
}
|
||||||
@ -1 +0,0 @@
|
|||||||
v25.3.0
|
|
||||||
@ -1,50 +1,97 @@
|
|||||||
# syntax=docker/dockerfile:1
|
##################################################################################
|
||||||
FROM node:25.6.0-alpine AS base
|
# BASE ###########################################################################
|
||||||
|
##################################################################################
|
||||||
|
FROM node:12.19.0-alpine3.10 as base
|
||||||
|
|
||||||
|
# ENVs
|
||||||
|
## DOCKER_WORKDIR would be a classical ARG, but that is not multi layer persistent - shame
|
||||||
|
ENV DOCKER_WORKDIR="/app"
|
||||||
|
## We Cannot do `$(date -u +'%Y-%m-%dT%H:%M:%SZ')` here so we use unix timestamp=0
|
||||||
|
ARG BBUILD_DATE="1970-01-01T00:00:00.00Z"
|
||||||
|
ENV BUILD_DATE=$BBUILD_DATE
|
||||||
|
## We cannot do $(yarn run version)-${BUILD_NUMBER} here so we default to 0.0.0-0
|
||||||
|
ARG BBUILD_VERSION="0.0.0-0"
|
||||||
|
ENV BUILD_VERSION=$BBUILD_VERSION
|
||||||
|
## We cannot do `$(git rev-parse --short HEAD)` here so we default to 0000000
|
||||||
|
ARG BBUILD_COMMIT="0000000"
|
||||||
|
ENV BUILD_COMMIT=$BBUILD_COMMIT
|
||||||
|
## SET NODE_ENV
|
||||||
|
ENV NODE_ENV="production"
|
||||||
|
## App relevant Envs
|
||||||
|
ENV PORT="4000"
|
||||||
|
|
||||||
|
# Labels
|
||||||
|
LABEL org.label-schema.build-date="${BUILD_DATE}"
|
||||||
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"
|
||||||
LABEL org.label-schema.url="https://ocelot.social"
|
LABEL org.label-schema.url="https://ocelot.social"
|
||||||
LABEL org.label-schema.vcs-url="https://github.com/Ocelot-Social-Community/Ocelot-Social/tree/master/backend"
|
LABEL org.label-schema.vcs-url="https://github.com/Ocelot-Social-Community/Ocelot-Social/tree/master/backend"
|
||||||
|
LABEL org.label-schema.vcs-ref="${BUILD_COMMIT}"
|
||||||
LABEL org.label-schema.vendor="ocelot.social Community"
|
LABEL org.label-schema.vendor="ocelot.social Community"
|
||||||
|
LABEL org.label-schema.version="${BUILD_VERSION}"
|
||||||
LABEL org.label-schema.schema-version="1.0"
|
LABEL org.label-schema.schema-version="1.0"
|
||||||
LABEL maintainer="devops@ocelot.social"
|
LABEL maintainer="devops@ocelot.social"
|
||||||
ENV NODE_ENV="production"
|
|
||||||
ENV PORT="4000"
|
# Install Additional Software
|
||||||
|
## install: git
|
||||||
|
RUN apk --no-cache add git
|
||||||
|
|
||||||
|
# Settings
|
||||||
|
## Expose Container Port
|
||||||
EXPOSE ${PORT}
|
EXPOSE ${PORT}
|
||||||
RUN apk --no-cache add git python3 make g++ bash linux-headers
|
|
||||||
RUN mkdir -p /app
|
|
||||||
WORKDIR /app
|
|
||||||
CMD ["/bin/bash", "-c", "yarn run start"]
|
|
||||||
|
|
||||||
FROM base AS development
|
## Workdir
|
||||||
CMD ["/bin/sh", "-c", "yarn install && yarn run dev"]
|
RUN mkdir -p ${DOCKER_WORKDIR}
|
||||||
|
WORKDIR ${DOCKER_WORKDIR}
|
||||||
|
|
||||||
FROM base AS build
|
##################################################################################
|
||||||
|
# DEVELOPMENT (Connected to the local environment, to reload on demand) ##########
|
||||||
|
##################################################################################
|
||||||
|
FROM base as development
|
||||||
|
|
||||||
|
# We don't need to copy or build anything since we gonna bind to the
|
||||||
|
# local filesystem which will need a rebuild anyway
|
||||||
|
|
||||||
|
# Run command
|
||||||
|
# (for development we need to execute yarn install since the
|
||||||
|
# node_modules are on another volume and need updating)
|
||||||
|
CMD /bin/sh -c "yarn install && yarn run dev"
|
||||||
|
|
||||||
|
##################################################################################
|
||||||
|
# BUILD (Does contain all files and is therefore bloated) ########################
|
||||||
|
##################################################################################
|
||||||
|
FROM base as build
|
||||||
|
|
||||||
|
# Copy everything
|
||||||
COPY . .
|
COPY . .
|
||||||
ONBUILD COPY ./branding/constants/ src/config/tmp
|
# yarn install
|
||||||
# copy categories to brand them (use yarn prod:db:data:categories)
|
RUN yarn install --production=false --frozen-lockfile --non-interactive
|
||||||
ONBUILD COPY ./branding/constants/ src/constants/
|
# yarn build
|
||||||
ONBUILD RUN tools/replace-constants.sh
|
RUN yarn run build
|
||||||
ONBUILD COPY ./branding/email/ src/middleware/helpers/email/
|
|
||||||
ONBUILD COPY ./branding/middlewares/ src/middleware/branding/
|
|
||||||
ONBUILD COPY ./branding/data/ src/db/data
|
|
||||||
ONBUILD COPY ./branding/public/ public/
|
|
||||||
ONBUILD RUN --mount=type=cache,target=/yarn-cache,sharing=locked \
|
|
||||||
yarn install --production=false --frozen-lockfile --non-interactive --cache-folder /yarn-cache
|
|
||||||
ONBUILD RUN yarn run build
|
|
||||||
ONBUILD RUN mkdir /build
|
|
||||||
ONBUILD RUN cp -r ./build /build
|
|
||||||
ONBUILD RUN cp -r ./public /build
|
|
||||||
ONBUILD RUN cp -r ./package.json yarn.lock /build
|
|
||||||
ONBUILD RUN --mount=type=cache,target=/yarn-cache,sharing=locked \
|
|
||||||
cd /build && yarn install --production=true --frozen-lockfile --non-interactive --cache-folder /yarn-cache
|
|
||||||
|
|
||||||
FROM build AS test
|
##################################################################################
|
||||||
# required for the migrations
|
# TEST ###########################################################################
|
||||||
# ONBUILD RUN cp -r ./src /src
|
##################################################################################
|
||||||
CMD ["/bin/bash", "-c", "yarn run dev"]
|
FROM build as test
|
||||||
|
|
||||||
FROM build AS production_build
|
# Run command
|
||||||
|
CMD /bin/sh -c "yarn run dev"
|
||||||
|
|
||||||
FROM base AS production
|
##################################################################################
|
||||||
COPY --from=production_build /build .
|
# PRODUCTION (Does contain only "binary"- and static-files to reduce image size) #
|
||||||
|
##################################################################################
|
||||||
|
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/
|
||||||
|
COPY --from=build ${DOCKER_WORKDIR}/public/providers.json ./public/providers.json
|
||||||
|
# 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"
|
||||||
@ -6,12 +6,11 @@ Run the following command to install everything through docker.
|
|||||||
|
|
||||||
The installation takes a bit longer on the first pass or on rebuild ...
|
The installation takes a bit longer on the first pass or on rebuild ...
|
||||||
|
|
||||||
```sh
|
```bash
|
||||||
# in main folder
|
$ docker-compose up
|
||||||
$ docker compose up
|
|
||||||
# or
|
|
||||||
# rebuild the containers for a cleanup
|
# rebuild the containers for a cleanup
|
||||||
$ docker compose up --build
|
$ docker-compose up --build
|
||||||
```
|
```
|
||||||
|
|
||||||
Wait a little until your backend is up and running at [http://localhost:4000/](http://localhost:4000/).
|
Wait a little until your backend is up and running at [http://localhost:4000/](http://localhost:4000/).
|
||||||
@ -19,33 +18,23 @@ 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/). We are using
|
[node](https://nodejs.org/en/) (>= `v10.12.0`). We are using
|
||||||
`v25.3.0` and therefore we recommend to use the same version. You can use the
|
`12.19.0` and therefore we recommend to use the same version
|
||||||
[node version manager](https://github.com/nvm-sh/nvm) `nvm` to switch
|
([see](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues/4082)
|
||||||
between different local Node versions:
|
some known problems with more recent node versions). You can use the
|
||||||
|
[node version manager](https://github.com/nvm-sh/nvm) to switch
|
||||||
```sh
|
between different local node versions.
|
||||||
# install Node using '.nvmrc' file
|
|
||||||
$ cd backend
|
|
||||||
$ nvm install
|
|
||||||
$ nvm use
|
|
||||||
```
|
|
||||||
|
|
||||||
Install node dependencies with [yarn](https://yarnpkg.com/en/):
|
Install node dependencies with [yarn](https://yarnpkg.com/en/):
|
||||||
|
|
||||||
```sh
|
```bash
|
||||||
# in main folder
|
|
||||||
$ cd backend
|
$ cd backend
|
||||||
$ yarn install
|
$ yarn install
|
||||||
# or just
|
|
||||||
$ yarn
|
|
||||||
# or just later on to use version of ".nvmrc" file
|
|
||||||
$ nvm use && yarn
|
|
||||||
```
|
```
|
||||||
|
|
||||||
Copy Environment Variables:
|
Copy Environment Variables:
|
||||||
|
|
||||||
```sh
|
```bash
|
||||||
# in backend/
|
# in backend/
|
||||||
$ cp .env.template .env
|
$ cp .env.template .env
|
||||||
```
|
```
|
||||||
@ -55,15 +44,13 @@ a [local Neo4J](http://localhost:7474) instance is up and running.
|
|||||||
|
|
||||||
Start the backend for development with:
|
Start the backend for development with:
|
||||||
|
|
||||||
```sh
|
```bash
|
||||||
# in backend/
|
|
||||||
$ yarn run dev
|
$ yarn run dev
|
||||||
```
|
```
|
||||||
|
|
||||||
or start the backend in production environment with:
|
or start the backend in production environment with:
|
||||||
|
|
||||||
```sh
|
```bash
|
||||||
# in backend/
|
|
||||||
$ yarn run start
|
$ yarn run start
|
||||||
```
|
```
|
||||||
|
|
||||||
@ -73,145 +60,139 @@ your `.env` configuration file.
|
|||||||
Your backend is up and running at [http://localhost:4000/](http://localhost:4000/)
|
Your backend is up and running at [http://localhost:4000/](http://localhost:4000/)
|
||||||
This will start the GraphQL service \(by default on localhost:4000\) where you
|
This will start the GraphQL service \(by default on localhost:4000\) where you
|
||||||
can issue GraphQL requests or access GraphQL Playground in the browser.
|
can issue GraphQL requests or access GraphQL Playground in the browser.
|
||||||
More details about our GraphQL playground and how to use it with ocelot.social can be found [here](./src/graphql/GraphQL-Playground.md).
|
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
## Database
|
### Database Indices and Constraints
|
||||||
|
|
||||||
A fresh database needs to be initialized and migrated.
|
Database indices and constraints need to be created when the database and the
|
||||||
|
backend is running:
|
||||||
|
|
||||||
```sh
|
{% tabs %}
|
||||||
# in folder backend while database is running
|
{% tab title="Docker" %}
|
||||||
yarn db:migrate init
|
|
||||||
# for docker environments:
|
```bash
|
||||||
docker exec ocelot-social-backend-1 yarn db:migrate init
|
$ docker-compose exec backend yarn run db:migrate init
|
||||||
# for docker production:
|
|
||||||
docker exec ocelot-social-backend-1 yarn prod:migrate init
|
|
||||||
```
|
```
|
||||||
|
|
||||||
```sh
|
{% endtab %}
|
||||||
# in backend with database running (In docker or local)
|
{% tab title="Without Docker" %}
|
||||||
yarn db:migrate up
|
|
||||||
|
|
||||||
# for docker development:
|
```bash
|
||||||
docker exec ocelot-social-backend-1 yarn db:migrate up
|
# in folder backend/
|
||||||
# for docker production
|
# make sure your database is running on http://localhost:7474/browser/
|
||||||
docker exec ocelot-social-backend-1 yarn prod:migrate up
|
yarn run db:migrate init
|
||||||
```
|
```
|
||||||
|
|
||||||
### Optional Data
|
{% endtab %}
|
||||||
|
{% endtabs %}
|
||||||
|
|
||||||
You can seed some optional data into the database.
|
#### Seed Database
|
||||||
|
|
||||||
To create the default admin <admin@example.org> with password `1234` use:
|
If you want your backend to return anything else than an empty response, you
|
||||||
|
need to seed your database:
|
||||||
|
|
||||||
```sh
|
{% tabs %}
|
||||||
# in backend with database running (In docker or local)
|
{% tab title="Docker" %}
|
||||||
yarn db:data:admin
|
|
||||||
|
In another terminal run:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ docker-compose exec backend yarn run db:seed
|
||||||
```
|
```
|
||||||
|
|
||||||
When using `CATEGORIES_ACTIVE=true` you also want to seed the categories with:
|
To reset the database run:
|
||||||
|
|
||||||
```sh
|
```bash
|
||||||
# in backend with database running (In docker or local)
|
$ docker-compose exec backend yarn run db:reset
|
||||||
yarn db:data:categories
|
|
||||||
```
|
|
||||||
|
|
||||||
### Branding Data
|
|
||||||
|
|
||||||
You might need to seed some branding specific data into the database.
|
|
||||||
|
|
||||||
To do so, run:
|
|
||||||
|
|
||||||
```sh
|
|
||||||
# in backend with database running (In docker or local)
|
|
||||||
yarn db:data:branding
|
|
||||||
|
|
||||||
# for docker
|
|
||||||
docker exec ocelot-social-backend-1 yarn db:data:branding
|
|
||||||
```
|
|
||||||
|
|
||||||
### Seed Data
|
|
||||||
|
|
||||||
For a predefined set of test data you can seed the database with:
|
|
||||||
|
|
||||||
```sh
|
|
||||||
# in backend with database running (In docker or local)
|
|
||||||
yarn db:seed
|
|
||||||
|
|
||||||
# for docker
|
|
||||||
docker exec ocelot-social-backend-1 yarn db:seed
|
|
||||||
```
|
|
||||||
|
|
||||||
### Reset Data
|
|
||||||
|
|
||||||
In order to reset the database you can run:
|
|
||||||
|
|
||||||
```sh
|
|
||||||
# in backend with database running (In docker or local)
|
|
||||||
yarn db:reset
|
|
||||||
# or deleting the migrations as well
|
|
||||||
yarn db:reset:withmigrations
|
|
||||||
|
|
||||||
# for docker
|
|
||||||
docker exec ocelot-social-backend-1 yarn db:reset
|
|
||||||
# or deleting the migrations as well
|
|
||||||
docker exec ocelot-social-backend-1 yarn db:reset:withmigrations
|
|
||||||
# you could also wipe out your neo4j database and delete all volumes with:
|
# you could also wipe out your neo4j database and delete all volumes with:
|
||||||
docker compose down -v
|
$ docker-compose down -v
|
||||||
|
# if container is not running, run this command to set up your database indeces and contstraints
|
||||||
|
$ docker-compose exec backend yarn run db:migrate init
|
||||||
```
|
```
|
||||||
|
|
||||||
> Note: This just deletes the data and not the constraints, hence you do not need to rerun `yarn db:migrate init` or `yarn db:migrate up`.
|
{% endtab %}
|
||||||
|
{% tab title="Without Docker" %}
|
||||||
|
|
||||||
|
Run:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ yarn run db:seed
|
||||||
|
```
|
||||||
|
|
||||||
|
To reset the database run:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ yarn run db:reset
|
||||||
|
```
|
||||||
|
|
||||||
|
{% endtab %}
|
||||||
|
{% endtabs %}
|
||||||
|
|
||||||
### Data migrations
|
### Data migrations
|
||||||
|
|
||||||
Although Neo4J is schema-less,you might find yourself in a situation in which
|
Although Neo4J is schema-less,you might find yourself in a situation in which
|
||||||
you have to migrate your data e.g. because your data modeling has changed.
|
you have to migrate your data e.g. because your data modeling has changed.
|
||||||
|
|
||||||
|
{% tabs %}
|
||||||
|
{% tab title="Docker" %}
|
||||||
|
|
||||||
Generate a data migration file:
|
Generate a data migration file:
|
||||||
|
|
||||||
```sh
|
```bash
|
||||||
# in backend
|
$ docker-compose exec backend yarn run db:migrate:create your_data_migration
|
||||||
$ yarn run db:migrate:create your_data_migration
|
|
||||||
# Edit the file in ./src/db/migrations/
|
|
||||||
|
|
||||||
# for docker
|
|
||||||
# in main folder while docker compose is running
|
|
||||||
$ docker compose exec ocelot-social-backend-1 yarn run db:migrate:create your_data_migration
|
|
||||||
# Edit the file in ./src/db/migrations/
|
# Edit the file in ./src/db/migrations/
|
||||||
```
|
```
|
||||||
|
|
||||||
To run the migration:
|
To run the migration:
|
||||||
|
|
||||||
```sh
|
```bash
|
||||||
# in backend/ while database is running
|
$ docker-compose exec backend yarn run db:migrate up
|
||||||
$ yarn run db:migrate up
|
|
||||||
|
|
||||||
# for docker
|
|
||||||
# in main folder while docker compose is running
|
|
||||||
$ docker exec backend yarn run db:migrate up
|
|
||||||
```
|
```
|
||||||
|
|
||||||
|
{% endtab %}
|
||||||
|
{% tab title="Without Docker" %}
|
||||||
|
|
||||||
|
Generate a data migration file:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ yarn run db:migrate:create your_data_migration
|
||||||
|
# Edit the file in ./src/db/migrations/
|
||||||
|
```
|
||||||
|
|
||||||
|
To run the migration:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ yarn run db:migrate up
|
||||||
|
```
|
||||||
|
|
||||||
|
{% endtab %}
|
||||||
|
{% endtabs %}
|
||||||
|
|
||||||
## Testing
|
## Testing
|
||||||
|
|
||||||
**Beware**: We have no multiple database setup at the moment. We clean the
|
**Beware**: We have no multiple database setup at the moment. We clean the
|
||||||
database after each test, running the tests will wipe out all your data!
|
database after each test, running the tests will wipe out all your data!
|
||||||
|
|
||||||
|
|
||||||
|
{% tabs %}
|
||||||
|
{% tab title="Docker" %}
|
||||||
|
|
||||||
Run the unit tests:
|
Run the unit tests:
|
||||||
|
|
||||||
```sh
|
```bash
|
||||||
# in backend/ while database is running
|
$ docker-compose exec backend yarn run test
|
||||||
|
```
|
||||||
|
|
||||||
|
{% endtab %}
|
||||||
|
|
||||||
|
{% tab title="Without Docker" %}
|
||||||
|
|
||||||
|
Run the unit tests:
|
||||||
|
|
||||||
|
```bash
|
||||||
$ yarn run test
|
$ yarn run test
|
||||||
|
|
||||||
# for docker
|
|
||||||
# in main folder while docker compose is running
|
|
||||||
$ docker exec ocelot-social-backend-1 yarn run test
|
|
||||||
```
|
```
|
||||||
|
|
||||||
If the snapshots of the emails must be updated, you have to run the tests in docker! Otherwise the CI will fail.
|
{% endtab %}
|
||||||
|
{% endtabs %}
|
||||||
```sh
|
|
||||||
# in main folder while docker compose is running
|
|
||||||
$ docker exec ocelot-social-backend-1 yarn run test -u src/emails/
|
|
||||||
```
|
|
||||||
|
|||||||
15
backend/babel.config.json
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
{
|
||||||
|
"presets": [
|
||||||
|
[
|
||||||
|
"@babel/preset-env",
|
||||||
|
{
|
||||||
|
"targets": {
|
||||||
|
"node": "10"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
],
|
||||||
|
"plugins": [
|
||||||
|
"@babel/plugin-proposal-throw-expressions"
|
||||||
|
]
|
||||||
|
}
|
||||||
@ -2,13 +2,12 @@
|
|||||||
|
|
||||||
GraphQL is a data query language which provides an alternative to REST and ad-hoc web service architectures. It allows clients to define the structure of the data required, and exactly the same structure of the data is returned from the server.
|
GraphQL is a data query language which provides an alternative to REST and ad-hoc web service architectures. It allows clients to define the structure of the data required, and exactly the same structure of the data is returned from the server.
|
||||||
|
|
||||||
We have a closer description for the [GraphQL Playground](./src/graphql/GraphQL-Playground.md).
|

|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
## Middleware keeps resolvers clean
|
## Middleware keeps resolvers clean
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
|
|
||||||
A well-organized codebase is key for the ability to maintain and easily introduce changes into an app. Figuring out the right structure for your code remains a continuous challenge - especially as an application grows and more developers are joining a project.
|
A well-organized codebase is key for the ability to maintain and easily introduce changes into an app. Figuring out the right structure for your code remains a continuous challenge - especially as an application grows and more developers are joining a project.
|
||||||
|
|
||||||
|
|||||||
@ -1,27 +0,0 @@
|
|||||||
/* eslint-disable import/no-commonjs */
|
|
||||||
const requireJSON5 = require('require-json5')
|
|
||||||
const { pathsToModuleNameMapper } = require('ts-jest')
|
|
||||||
|
|
||||||
const { compilerOptions } = requireJSON5('./tsconfig.json')
|
|
||||||
|
|
||||||
module.exports = {
|
|
||||||
verbose: true,
|
|
||||||
preset: 'ts-jest',
|
|
||||||
collectCoverage: true,
|
|
||||||
collectCoverageFrom: [
|
|
||||||
'**/*.ts',
|
|
||||||
'!**/node_modules/**',
|
|
||||||
'!**/test/**',
|
|
||||||
'!**/build/**',
|
|
||||||
'!**/src/**/?(*.)+(spec|test).ts?(x)',
|
|
||||||
'!**/src/db/**',
|
|
||||||
],
|
|
||||||
coverageThreshold: {
|
|
||||||
global: {
|
|
||||||
lines: 93,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
testMatch: ['**/src/**/?(*.)+(spec|test).ts?(x)'],
|
|
||||||
setupFilesAfterEnv: ['<rootDir>/test/setup.ts'],
|
|
||||||
moduleNameMapper: pathsToModuleNameMapper(compilerOptions.paths, { prefix: '<rootDir>/' }),
|
|
||||||
}
|
|
||||||
@ -1,147 +1,144 @@
|
|||||||
{
|
{
|
||||||
"name": "ocelot-social-backend",
|
"name": "ocelot-social-backend",
|
||||||
"version": "3.14.1",
|
"version": "1.0.3",
|
||||||
"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",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"private": false,
|
"private": false,
|
||||||
"main": "src/index.ts",
|
"main": "src/index.js",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"start": "node build/src/",
|
"__migrate": "migrate --compiler 'js:@babel/register' --migrations-dir ./src/db/migrations",
|
||||||
"build": "tsc && tsc-alias && ./scripts/build.copy.files.sh",
|
"prod:migrate": "migrate --migrations-dir ./dist/db/migrations --store ./dist/db/migrate/store.js",
|
||||||
"dev": "nodemon --exec ts-node --require tsconfig-paths/register src/index.ts -e js,ts,gql",
|
"start": "node dist/",
|
||||||
"dev:debug": "nodemon --exec node --inspect=0.0.0.0:9229 build/src/index.js -e js,ts,gql",
|
"build": "babel src/ -d dist/ --copy-files",
|
||||||
"lint": "eslint --max-warnings=0 --report-unused-disable-directives --ext .js,.ts,.cjs,.json,.json5,.jsonc,.graphql,.gql .",
|
"dev": "nodemon --exec babel-node src/ -e js,gql",
|
||||||
"test": "cross-env NODE_ENV=test NODE_OPTIONS=--max-old-space-size=8192 jest --runInBand --coverage --forceExit --detectOpenHandles",
|
"dev:debug": "nodemon --exec babel-node --inspect=0.0.0.0:9229 src/ -e js,gql",
|
||||||
"db:reset": "ts-node --require tsconfig-paths/register src/db/reset.ts",
|
"lint": "eslint src --config .eslintrc.js",
|
||||||
"db:reset:withmigrations": "ts-node --require tsconfig-paths/register src/db/reset-with-migrations.ts",
|
"test": "cross-env NODE_ENV=test jest --forceExit --detectOpenHandles --runInBand --coverage",
|
||||||
"db:seed": "ts-node --require tsconfig-paths/register src/db/seed.ts",
|
"db:clean": "babel-node src/db/clean.js",
|
||||||
"db:data:admin": "ts-node --require tsconfig-paths/register src/db/admin.ts",
|
"db:reset": "yarn run db:clean",
|
||||||
"db:data:badges": "ts-node --require tsconfig-paths/register src/db/badges.ts",
|
"db:seed": "babel-node src/db/seed.js",
|
||||||
"db:data:branding": "ts-node --require tsconfig-paths/register src/db/data-branding.ts",
|
"db:migrate": "yarn run __migrate --store ./src/db/migrate/store.js",
|
||||||
"db:data:categories": "ts-node --require tsconfig-paths/register src/db/categories.ts",
|
"db:migrate:create": "yarn run __migrate --template-file ./src/db/migrate/template.js --date-format 'yyyymmddHHmmss' create"
|
||||||
"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",
|
"jest": {
|
||||||
"db:func:disable:notifications": "ts-node --require tsconfig-paths/register src/db/disable-notifications.ts",
|
"verbose": true,
|
||||||
"prod:migrate": "migrate --migrations-dir ./build/src/db/migrations --store ./build/src/db/migrate/store.js",
|
"collectCoverageFrom": [
|
||||||
"prod:db:data:branding": "node build/src/db/data-branding.js",
|
"**/*.js",
|
||||||
"prod:db:data:categories": "node build/src/db/categories.js",
|
"!**/node_modules/**",
|
||||||
"prod:db:data:admin": "node build/src/db/admin.js",
|
"!**/test/**",
|
||||||
"prod:db:func:disable:notifications": "node build/src/db/disable-notifications.js"
|
"!**/dist/**",
|
||||||
|
"!**/src/**/?(*.)+(spec|test).js?(x)"
|
||||||
|
],
|
||||||
|
"coverageReporters": [
|
||||||
|
"lcov"
|
||||||
|
],
|
||||||
|
"testMatch": [
|
||||||
|
"**/src/**/?(*.)+(spec|test).js?(x)"
|
||||||
|
]
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@aws-sdk/client-s3": "^3.990.0",
|
"@hapi/joi": "^17.1.1",
|
||||||
"@aws-sdk/lib-storage": "^3.985.0",
|
"@sentry/node": "^5.15.4",
|
||||||
"@sentry/node": "^5.30.0",
|
"apollo-cache-inmemory": "~1.6.5",
|
||||||
"@types/mime-types": "^3.0.1",
|
"apollo-client": "~2.6.8",
|
||||||
|
"apollo-link-context": "~1.0.20",
|
||||||
|
"apollo-link-http": "~1.5.17",
|
||||||
"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.3",
|
"aws-sdk": "^2.652.0",
|
||||||
"body-parser": "^1.20.3",
|
"babel-plugin-transform-runtime": "^6.23.0",
|
||||||
"cheerio": "~1.2.0",
|
"bcryptjs": "~2.4.3",
|
||||||
"cross-env": "~10.1.0",
|
"cheerio": "~1.0.0-rc.3",
|
||||||
"dotenv": "~17.0.1",
|
"cors": "~2.8.5",
|
||||||
"email-templates": "^13.0.1",
|
"cross-env": "~7.0.2",
|
||||||
"express": "^4.22.1",
|
"date-fns": "2.11.1",
|
||||||
|
"debug": "~4.1.1",
|
||||||
|
"dotenv": "~8.2.0",
|
||||||
|
"express": "^4.17.1",
|
||||||
|
"faker": "Marak/faker.js#master",
|
||||||
"graphql": "^14.6.0",
|
"graphql": "^14.6.0",
|
||||||
"graphql-middleware": "~6.1.35",
|
"graphql-custom-directives": "~0.2.14",
|
||||||
|
"graphql-iso-date": "~3.6.1",
|
||||||
|
"graphql-middleware": "~4.0.2",
|
||||||
"graphql-middleware-sentry": "^3.2.1",
|
"graphql-middleware-sentry": "^3.2.1",
|
||||||
"graphql-redis-subscriptions": "^2.7.0",
|
"graphql-redis-subscriptions": "^2.2.1",
|
||||||
"graphql-shield": "~7.2.2",
|
"graphql-shield": "~7.2.2",
|
||||||
"graphql-subscriptions": "^1.1.0",
|
|
||||||
"graphql-tag": "~2.10.3",
|
"graphql-tag": "~2.10.3",
|
||||||
"graphql-upload": "^13.0.0",
|
"helmet": "~3.22.0",
|
||||||
"helmet": "~8.1.0",
|
"ioredis": "^4.16.1",
|
||||||
"ioredis": "^5.9.3",
|
|
||||||
"jsonwebtoken": "~8.5.1",
|
"jsonwebtoken": "~8.5.1",
|
||||||
"languagedetect": "^2.0.0",
|
"languagedetect": "^2.0.0",
|
||||||
"linkify-html": "^4.3.2",
|
"linkifyjs": "~2.1.8",
|
||||||
"linkifyjs": "^4.3.2",
|
"lodash": "~4.17.14",
|
||||||
"lodash": "~4.17.23",
|
"merge-graphql-schemas": "^1.7.7",
|
||||||
"merge-graphql-schemas": "^1.7.8",
|
"metascraper": "^5.11.8",
|
||||||
"metascraper": "^5.49.19",
|
"metascraper-audio": "^5.14.26",
|
||||||
"metascraper-author": "^5.49.19",
|
"metascraper-author": "^5.14.22",
|
||||||
"metascraper-date": "^5.49.19",
|
"metascraper-clearbit-logo": "^5.3.0",
|
||||||
"metascraper-description": "^5.49.19",
|
"metascraper-date": "^5.11.8",
|
||||||
"metascraper-image": "^5.49.19",
|
"metascraper-description": "^5.11.6",
|
||||||
"metascraper-lang": "^5.49.19",
|
"metascraper-image": "^5.11.8",
|
||||||
|
"metascraper-lang": "^5.11.8",
|
||||||
"metascraper-lang-detector": "^4.10.2",
|
"metascraper-lang-detector": "^4.10.2",
|
||||||
"metascraper-logo": "^5.49.19",
|
"metascraper-logo": "^5.14.26",
|
||||||
"metascraper-publisher": "^5.49.19",
|
"metascraper-publisher": "^5.11.8",
|
||||||
"metascraper-soundcloud": "^5.34.4",
|
"metascraper-soundcloud": "^5.11.8",
|
||||||
"metascraper-title": "^5.49.19",
|
"metascraper-title": "^5.11.8",
|
||||||
"metascraper-url": "^5.49.19",
|
"metascraper-url": "^5.14.26",
|
||||||
"metascraper-video": "^5.49.19",
|
"metascraper-video": "^5.11.8",
|
||||||
"metascraper-youtube": "^5.49.20",
|
"metascraper-youtube": "^5.11.8",
|
||||||
"migrate": "^2.1.0",
|
"migrate": "^1.7.0",
|
||||||
"mime-types": "^3.0.2",
|
"mime-types": "^2.1.26",
|
||||||
"minimatch": "^10.2.0",
|
"minimatch": "^3.0.4",
|
||||||
"mustache": "^4.2.0",
|
"mustache": "^4.0.1",
|
||||||
"neo4j-driver": "^4.4.11",
|
"neo4j-driver": "^4.0.2",
|
||||||
"neo4j-graphql-js": "2.11.5",
|
"neo4j-graphql-js": "^2.11.5",
|
||||||
"neode": "^0.4.9",
|
"neode": "^0.3.7",
|
||||||
"node-fetch": "^2.7.0",
|
"node-fetch": "~2.6.1",
|
||||||
"nodemailer": "^8.0.1",
|
"nodemailer": "^6.4.4",
|
||||||
"nodemailer-html-to-text": "^3.2.0",
|
"nodemailer-html-to-text": "^3.1.0",
|
||||||
"preview-email": "^3.1.1",
|
"npm-run-all": "~4.1.5",
|
||||||
"pug": "^3.0.3",
|
"request": "~2.88.2",
|
||||||
"sanitize-html": "~2.17.0",
|
"sanitize-html": "~1.22.0",
|
||||||
"slugify": "^1.6.6",
|
"slug": "~4.0.2",
|
||||||
|
"subscriptions-transport-ws": "^0.9.16",
|
||||||
"trunc-html": "~1.1.2",
|
"trunc-html": "~1.1.2",
|
||||||
"tslog": "^4.10.2",
|
"uuid": "~8.3.2",
|
||||||
"uuid": "~9.0.1",
|
"validator": "^13.0.0",
|
||||||
"validator": "^13.15.26",
|
"wait-on": "~4.0.1",
|
||||||
"xregexp": "^5.1.2"
|
"xregexp": "^4.3.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@eslint-community/eslint-plugin-eslint-comments": "^4.6.0",
|
"@babel/cli": "~7.8.4",
|
||||||
"@faker-js/faker": "9.9.0",
|
"@babel/core": "~7.9.0",
|
||||||
"@graphql-eslint/eslint-plugin": "^3.20.1",
|
"@babel/node": "~7.8.7",
|
||||||
"@types/email-templates": "^10.0.4",
|
"@babel/plugin-proposal-throw-expressions": "^7.8.3",
|
||||||
"@types/jest": "^30.0.0",
|
"@babel/preset-env": "~7.9.5",
|
||||||
"@types/jsonwebtoken": "~8.5.1",
|
"@babel/register": "^7.9.0",
|
||||||
"@types/lodash": "^4.17.23",
|
|
||||||
"@types/node": "^25.2.3",
|
|
||||||
"@types/request": "^2.48.13",
|
|
||||||
"@types/slug": "^5.0.9",
|
|
||||||
"@types/uuid": "~9.0.1",
|
|
||||||
"@typescript-eslint/eslint-plugin": "^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",
|
"babel-core": "~7.0.0-0",
|
||||||
"eslint-config-prettier": "^10.1.8",
|
"babel-eslint": "~10.1.0",
|
||||||
"eslint-config-standard": "^17.1.0",
|
"babel-jest": "~25.2.6",
|
||||||
"eslint-import-resolver-typescript": "^4.4.4",
|
"chai": "~4.2.0",
|
||||||
"eslint-plugin-import": "^2.32.0",
|
"cucumber": "~6.0.5",
|
||||||
"eslint-plugin-jest": "^29.14.0",
|
"eslint": "~6.8.0",
|
||||||
"eslint-plugin-jsonc": "^2.21.1",
|
"eslint-config-prettier": "~6.10.1",
|
||||||
"eslint-plugin-n": "^17.23.2",
|
"eslint-config-standard": "~14.1.1",
|
||||||
"eslint-plugin-no-catch-all": "^1.1.0",
|
"eslint-plugin-import": "~2.20.2",
|
||||||
"eslint-plugin-prettier": "^5.5.5",
|
"eslint-plugin-jest": "~23.8.2",
|
||||||
"eslint-plugin-promise": "^7.2.1",
|
"eslint-plugin-node": "~11.1.0",
|
||||||
"eslint-plugin-security": "^3.0.1",
|
"eslint-plugin-prettier": "~3.1.2",
|
||||||
"jest": "^30.2.0",
|
"eslint-plugin-promise": "~4.2.1",
|
||||||
"nodemon": "~3.1.11",
|
"eslint-plugin-standard": "~4.0.1",
|
||||||
"prettier": "^3.8.1",
|
"jest": "~25.3.0",
|
||||||
"require-json5": "^1.3.0",
|
"nodemon": "~2.0.2",
|
||||||
"rosie": "^2.1.1",
|
"prettier": "~2.2.0",
|
||||||
"ts-jest": "^29.4.6",
|
"rosie": "^2.0.1",
|
||||||
"ts-node": "^10.9.2",
|
"supertest": "~4.0.2"
|
||||||
"tsc-alias": "^1.8.16",
|
|
||||||
"tsconfig-paths": "^4.2.0",
|
|
||||||
"typescript": "^5.8.3"
|
|
||||||
},
|
},
|
||||||
"resolutions": {
|
"resolutions": {
|
||||||
"**/**/fs-capacitor": "^6.2.0",
|
"fs-capacitor": "6.0.0"
|
||||||
"**/graphql-upload": "^11.0.0",
|
|
||||||
"**/strip-ansi": "6.0.1",
|
|
||||||
"**/string-width": "4.2.0",
|
|
||||||
"**/wrap-ansi": "7.0.0",
|
|
||||||
"**/jwa": "^2.0.1",
|
|
||||||
"**/@types/express": "4.17.25"
|
|
||||||
},
|
|
||||||
"engines": {
|
|
||||||
"node": ">=20.12.1"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,12 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
|
||||||
<svg width="400" height="346.67" version="1.1" viewBox="0 0 400 346.67" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
|
||||||
<defs>
|
|
||||||
<linearGradient id="linearGradient4" x1="708.76" x2="493.17" y1="280.91" y2="65.326" gradientTransform="translate(-404.06 .215)" gradientUnits="userSpaceOnUse">
|
|
||||||
<stop stop-color="#c1c1c1" offset="0"/>
|
|
||||||
<stop stop-color="#fcfcfc" offset="1"/>
|
|
||||||
</linearGradient>
|
|
||||||
</defs>
|
|
||||||
<path d="m-0.21505 173.98 100.65-173.76h198.71l101.08 173.76-99.785 172.04-201.29 0.43011z" fill="#bebebe"/>
|
|
||||||
<path d="m22.482 173.91 89.236-154.07h176.18l89.617 154.07-88.473 152.54-178.47 0.38135z" fill="url(#linearGradient4)"/>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 773 B |
@ -1,29 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
|
||||||
<svg
|
|
||||||
width="513"
|
|
||||||
height="444"
|
|
||||||
version="1.1"
|
|
||||||
id="svg3"
|
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
|
||||||
xmlns:svg="http://www.w3.org/2000/svg">
|
|
||||||
<defs
|
|
||||||
id="defs3" />
|
|
||||||
<g
|
|
||||||
fill="none"
|
|
||||||
fill-rule="evenodd"
|
|
||||||
id="g3">
|
|
||||||
<path
|
|
||||||
fill="#333"
|
|
||||||
d="M384.5.297L512.325 221.9l-128 221.702-255.825.102L.675 222.1 128.675.4z"
|
|
||||||
id="path1"
|
|
||||||
style="fill:#868383;fill-opacity:1" />
|
|
||||||
<g
|
|
||||||
fill="#ffffff"
|
|
||||||
id="g2"
|
|
||||||
transform="translate(92)">
|
|
||||||
<path
|
|
||||||
d="m 35.01,367.726 c -0.08,-21.169 -0.205,-53.162 21.257,-71.332 3.817,-3.253 9.93,-7.497 17.321,-9.224 2.575,-0.523 4.956,-0.756 7.262,-0.979 4.438,-0.431 8.27,-0.804 12.054,-2.9 l 4.954,-2.846 c 9.87,-5.655 19.194,-10.996 28.226,-17.377 5.085,-3.632 6.726,-15.73 6.095,-25.428 -0.214,-2.792 -1.893,-5.7 -3.67,-8.777 -1.097,-1.901 -2.232,-3.867 -3.065,-5.916 l -0.073,-0.199 a 56.976,56.976 0 0 1 -0.422,-1.443 c -1.195,-4.205 -1.933,-6.378 -2.386,-7.476 -7.029,-0.944 -11.8,-8.647 -12.888,-21.006 l -0.031,-0.557 c -0.645,-12.785 0.808,-16.13 2.316,-17.716 0.24,-0.254 0.505,-0.475 0.783,-0.666 -1.754,-16.051 3.115,-32.521 13.358,-44.704 9.314,-11.079 21.955,-17.18 35.592,-17.18 3.73,0 7.55,0.458 11.355,1.362 25.63,6.228 41.679,30.27 40.062,59.227 0.53,0.251 1.018,0.61 1.44,1.066 2.752,2.964 2.47,10.97 2.22,14.276 l -0.024,0.41 c -0.335,5.236 -0.684,10.65 -3.052,15.73 -1.739,3.918 -4.405,6.242 -6.76,8.29 -2.396,2.089 -4.288,3.735 -5.294,6.885 -0.7,2.416 -1.645,4.866 -2.559,7.235 -1.752,4.538 -3.407,8.827 -3.54,13.244 -0.427,10.222 1.17,18.391 4.172,21.359 5.097,5.163 13.003,9.391 19.978,13.121 1.6,0.855 3.166,1.692 4.654,2.517 9.28,5.052 16.07,7.915 25.309,8.557 9.118,0.849 18.056,5.193 24.754,11.97 0.736,0.641 1.82,1.744 3.694,3.648 4.416,4.492 4.416,4.492 4.426,5.852 l 0.007,0.758 c 10.783,17.702 11.14,40.656 11.415,58.169 l 0.05,3.28 -3.278,0.028 c -42.05,0.363 -84.058,0.677 -126.058,0.993 -42.12,0.314 -84.232,0.632 -126.367,0.994 L 35.024,371 Z"
|
|
||||||
id="path2" />
|
|
||||||
</g>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 2.0 KiB |
|
Before Width: | Height: | Size: 1.5 KiB After Width: | Height: | Size: 1.5 KiB |
|
Before Width: | Height: | Size: 2.4 KiB After Width: | Height: | Size: 2.4 KiB |
|
Before Width: | Height: | Size: 1.3 KiB After Width: | Height: | Size: 1.3 KiB |
|
Before Width: | Height: | Size: 3.0 KiB After Width: | Height: | Size: 3.0 KiB |
|
Before Width: | Height: | Size: 637 B After Width: | Height: | Size: 637 B |
|
Before Width: | Height: | Size: 1.3 KiB After Width: | Height: | Size: 1.3 KiB |
|
Before Width: | Height: | Size: 2.0 KiB After Width: | Height: | Size: 2.0 KiB |
|
Before Width: | Height: | Size: 654 B After Width: | Height: | Size: 654 B |
|
Before Width: | Height: | Size: 1.8 KiB After Width: | Height: | Size: 1.8 KiB |
|
Before Width: | Height: | Size: 3.4 KiB After Width: | Height: | Size: 3.4 KiB |
|
Before Width: | Height: | Size: 1.7 KiB After Width: | Height: | Size: 1.7 KiB |
|
Before Width: | Height: | Size: 5.7 KiB After Width: | Height: | Size: 5.7 KiB |
|
Before Width: | Height: | Size: 2.3 KiB After Width: | Height: | Size: 2.3 KiB |
|
Before Width: | Height: | Size: 3.6 KiB After Width: | Height: | Size: 3.6 KiB |
|
Before Width: | Height: | Size: 5.1 KiB After Width: | Height: | Size: 5.1 KiB |
|
Before Width: | Height: | Size: 1.4 KiB After Width: | Height: | Size: 1.4 KiB |
|
Before Width: | Height: | Size: 2.2 KiB After Width: | Height: | Size: 2.2 KiB |
1
backend/public/img/badges/user_role_admin.svg
Normal file
@ -0,0 +1 @@
|
|||||||
|
<svg width="513" height="444" xmlns="http://www.w3.org/2000/svg"><g fill="none" fill-rule="evenodd"><path fill="#AD245D" d="M384.5.297L512.325 221.9l-128 221.702-255.825.102L.675 222.1 128.675.4z"/><path d="M35.01 367.726c-.08-21.169-.205-53.162 21.257-71.332 3.817-3.253 9.93-7.497 17.321-9.224 2.575-.523 4.956-.756 7.262-.979 4.438-.431 8.27-.804 12.054-2.9l4.954-2.846c9.87-5.655 19.194-10.996 28.226-17.377 5.085-3.632 6.726-15.73 6.095-25.428-.214-2.792-1.893-5.7-3.67-8.777-1.097-1.901-2.232-3.867-3.065-5.916l-.073-.199a56.976 56.976 0 0 1-.422-1.443c-1.195-4.205-1.933-6.378-2.386-7.476-7.029-.944-11.8-8.647-12.888-21.006l-.031-.557c-.645-12.785.808-16.13 2.316-17.716.24-.254.505-.475.783-.666-1.754-16.051 3.115-32.521 13.358-44.704 9.314-11.079 21.955-17.18 35.592-17.18 3.73 0 7.55.458 11.355 1.362 25.63 6.228 41.679 30.27 40.062 59.227.53.251 1.018.61 1.44 1.066 2.752 2.964 2.47 10.97 2.22 14.276l-.024.41c-.335 5.236-.684 10.65-3.052 15.73-1.739 3.918-4.405 6.242-6.76 8.29-2.396 2.089-4.288 3.735-5.294 6.885-.7 2.416-1.645 4.866-2.559 7.235-1.752 4.538-3.407 8.827-3.54 13.244-.427 10.222 1.17 18.391 4.172 21.359 5.097 5.163 13.003 9.391 19.978 13.121 1.6.855 3.166 1.692 4.654 2.517 9.28 5.052 16.07 7.915 25.309 8.557 9.118.849 18.056 5.193 24.754 11.97.736.641 1.82 1.744 3.694 3.648 4.416 4.492 4.416 4.492 4.426 5.852l.007.758c10.783 17.702 11.14 40.656 11.415 58.169l.05 3.28-3.278.028c-42.05.363-84.058.677-126.058.993-42.12.314-84.232.632-126.367.994l-3.273.029-.014-3.274zM329.011 135.763a5.232 5.232 0 0 0-5.223 5.23 5.232 5.232 0 0 0 5.223 5.23 5.236 5.236 0 0 0 5.231-5.23 5.236 5.236 0 0 0-5.23-5.23m0 40.237C309.705 176 294 160.297 294 140.993 294 121.698 309.706 106 329.011 106 348.303 106 364 121.698 364 140.993 364 160.297 348.303 176 329.011 176" fill="#FFF"/><path d="M330.511 101C308.173 101 290 119.164 290 141.492 290 163.828 308.173 182 330.511 182 352.836 182 371 163.828 371 141.492 371 119.164 352.836 101 330.511 101m0 51.022c5.823 0 10.531-4.716 10.531-10.53a10.517 10.517 0 0 0-10.53-10.529 10.51 10.51 0 0 0-10.523 10.529c0 5.814 4.7 10.53 10.522 10.53m0-40.496c16.563 0 29.963 13.406 29.963 29.966 0 16.555-13.4 29.982-29.963 29.982-16.555 0-29.985-13.427-29.985-29.982 0-16.56 13.43-29.966 29.985-29.966" fill="#AD245D"/><path d="M331 106.209c-20.305 0-36.825 16.06-36.825 35.799 0 19.747 16.52 35.813 36.825 35.813 20.306 0 36.827-16.066 36.827-35.813 0-19.74-16.521-35.8-36.827-35.8zM314.287 215l-4.11-21.345c-.324-.129-.648-.265-.972-.404l-18.012 12.169-23.607-23.609 12.186-18.009a63.31 63.31 0 0 1-.403-.968L258 158.712v-33.383l21.361-4.13c.131-.327.267-.652.407-.979l-12.18-18.025 23.608-23.612 18.015 12.198c.322-.137.643-.27.964-.4L314.287 69h33.416l4.13 21.387c.319.13.638.26.956.396l18.024-12.2 23.608 23.612-12.186 18.031c.139.324.273.648.402.971L404 125.33v33.381l-21.37 4.124c-.13.32-.262.64-.398.96l12.19 18.017-23.606 23.609-18.021-12.171c-.32.137-.642.27-.964.402L347.701 215h-33.414z" fill="#FFF"/><path d="M330 171.448c-17.342 0-31.45-13.656-31.45-30.44 0-16.778 14.108-30.427 31.45-30.427 17.341 0 31.449 13.649 31.449 30.426 0 16.785-14.108 30.441-31.45 30.441zM350.979 63h-41.97l-1.64 8.517-1.953 10.156-8.55-5.788-7.18-4.862-6.132 6.132-17.399 17.4-6.126 6.126 4.85 7.178 5.8 8.583-10.173 1.966-8.506 1.646v41.932l8.51 1.643 10.16 1.962-5.787 8.553-4.858 7.179 6.13 6.13 17.399 17.399 6.126 6.126 7.177-4.85 8.56-5.782 1.954 10.141 1.64 8.513H350.975l1.645-8.507 1.964-10.15 8.566 5.787 7.178 4.846 6.124-6.124 17.4-17.399 6.13-6.13-4.858-7.18-5.788-8.554 10.153-1.96 8.51-1.643v-41.932l-8.507-1.646-10.165-1.965 5.8-8.584 4.85-7.178-6.125-6.126-17.4-17.4-6.13-6.13-7.18 4.858-8.558 5.792-1.964-10.166L350.98 63zm-20.98 118.948c23.176 0 41.95-18.318 41.95-40.94 0-22.607-18.774-40.927-41.95-40.927-23.174 0-41.948 18.32-41.948 40.926 0 22.623 18.774 40.941 41.949 40.941zM342.313 73.5l3.855 19.963a47.184 47.184 0 0 1 6.037 2.502l16.824-11.386 17.4 17.4-11.362 16.818a53.171 53.171 0 0 1 2.502 6.066l19.932 3.855v24.601l-19.932 3.848a56.644 56.644 0 0 1-2.502 6.066l11.362 16.795-17.4 17.4-16.824-11.364a44.931 44.931 0 0 1-6.037 2.504l-3.855 19.932H317.68l-3.84-19.932a43.821 43.821 0 0 1-6.043-2.504l-16.818 11.364-17.4-17.4 11.364-16.795a53.759 53.759 0 0 1-2.51-6.066l-19.933-3.848v-24.601l19.933-3.855a50.617 50.617 0 0 1 2.51-6.066l-11.364-16.818 17.4-17.4 16.818 11.386a45.957 45.957 0 0 1 6.043-2.502l3.84-19.963h24.632z" fill="#AD245D"/></g></svg>
|
||||||
|
After Width: | Height: | Size: 4.3 KiB |
1
backend/public/img/badges/user_role_developer.svg
Normal file
@ -0,0 +1 @@
|
|||||||
|
<svg width="513" height="444" xmlns="http://www.w3.org/2000/svg"><g fill="none" fill-rule="evenodd"><path fill="#AD245D" d="M384.5.297L512.325 221.9l-128 221.702-255.825.102L.675 222.1 128.675.4z"/><g fill="#FFF"><path d="M35.01 367.726c-.08-21.169-.205-53.162 21.257-71.332 3.817-3.253 9.93-7.497 17.321-9.224 2.575-.523 4.956-.756 7.262-.979 4.438-.431 8.27-.804 12.054-2.9l4.954-2.846c9.87-5.655 19.194-10.996 28.226-17.377 5.085-3.632 6.726-15.73 6.095-25.428-.214-2.792-1.893-5.7-3.67-8.777-1.097-1.901-2.232-3.867-3.065-5.916l-.073-.199a56.976 56.976 0 0 1-.422-1.443c-1.195-4.205-1.933-6.378-2.386-7.476-7.029-.944-11.8-8.647-12.888-21.006l-.031-.557c-.645-12.785.808-16.13 2.316-17.716.24-.254.505-.475.783-.666-1.754-16.051 3.115-32.521 13.358-44.704 9.314-11.079 21.955-17.18 35.592-17.18 3.73 0 7.55.458 11.355 1.362 25.63 6.228 41.679 30.27 40.062 59.227.53.251 1.018.61 1.44 1.066 2.752 2.964 2.47 10.97 2.22 14.276l-.024.41c-.335 5.236-.684 10.65-3.052 15.73-1.739 3.918-4.405 6.242-6.76 8.29-2.396 2.089-4.288 3.735-5.294 6.885-.7 2.416-1.645 4.866-2.559 7.235-1.752 4.538-3.407 8.827-3.54 13.244-.427 10.222 1.17 18.391 4.172 21.359 5.097 5.163 13.003 9.391 19.978 13.121 1.6.855 3.166 1.692 4.654 2.517 9.28 5.052 16.07 7.915 25.309 8.557 9.118.849 18.056 5.193 24.754 11.97.736.641 1.82 1.744 3.694 3.648 4.416 4.492 4.416 4.492 4.426 5.852l.007.758c10.783 17.702 11.14 40.656 11.415 58.169l.05 3.28-3.278.028c-42.05.363-84.058.677-126.058.993-42.12.314-84.232.632-126.367.994l-3.273.029-.014-3.274z"/><text font-family="Impact" font-size="118" font-style="condensed" font-weight="700" transform="translate(1 -1)"><tspan x="256" y="208"></></tspan></text></g></g></svg>
|
||||||
|
After Width: | Height: | Size: 1.7 KiB |
1
backend/public/img/badges/user_role_moderator.svg
Normal file
@ -0,0 +1 @@
|
|||||||
|
<svg width="512" height="444" xmlns="http://www.w3.org/2000/svg"><g fill="none" fill-rule="evenodd"><path fill="#AD245D" d="M384 .297L511.392 221.65l-128 221.702-255.392.352L.608 222.35 128.608.65z"/><g fill="#FFF"><path d="M34.944 367.726c-.081-21.169-.205-53.162 21.215-71.332 3.81-3.253 9.91-7.497 17.288-9.224 2.57-.523 4.946-.756 7.247-.979 4.43-.431 8.254-.804 12.03-2.9l4.945-2.846c9.851-5.655 19.157-10.996 28.171-17.377 5.075-3.632 6.713-15.73 6.082-25.428-.213-2.792-1.888-5.7-3.662-8.777-1.095-1.901-2.228-3.867-3.059-5.916l-.073-.199a57.061 57.061 0 0 1-.42-1.443c-1.194-4.205-1.93-6.378-2.382-7.476-7.015-.944-11.778-8.647-12.864-21.006l-.03-.557c-.644-12.785.806-16.13 2.31-17.716.241-.254.505-.475.783-.666-1.75-16.051 3.11-32.521 13.331-44.704 9.296-11.079 21.912-17.18 35.524-17.18 3.722 0 7.535.458 11.332 1.362 25.58 6.228 41.597 30.27 39.983 59.227.53.251 1.016.61 1.439 1.066 2.745 2.964 2.464 10.97 2.215 14.276l-.024.41c-.335 5.236-.683 10.65-3.046 15.73-1.736 3.918-4.397 6.242-6.747 8.29-2.391 2.089-4.28 3.735-5.284 6.885-.698 2.416-1.642 4.866-2.554 7.235-1.749 4.538-3.4 8.827-3.534 13.244-.425 10.222 1.17 18.391 4.165 21.359 5.087 5.163 12.977 9.391 19.939 13.121 1.597.855 3.16 1.692 4.645 2.517 9.262 5.052 16.038 7.915 25.259 8.557 9.1.849 18.02 5.193 24.706 11.97.735.641 1.817 1.744 3.687 3.648 4.408 4.492 4.408 4.492 4.417 5.852l.007.758c10.762 17.702 11.12 40.656 11.392 58.169l.05 3.28-3.271.028c-41.968.363-83.894.677-125.812.993-42.038.314-84.067.632-126.12.994l-3.267.029-.013-3.274zM332.387 115.763h15.318v86.734h-15.318v.513l-22.127-17.64v.12h-10.21V211h-22.128v-25.51h-20.424v-52.722h52.762v-.508l22.127-17.065v.568zm34.313 72.093l-7.988-4.591c15.803-27.453 1.717-46.642 1.106-47.443l7.304-5.607c.774.993 18.547 24.675-.422 57.641zm27.361 21.216l-13.866-7.975c27.437-47.66 2.98-80.973 1.918-82.36L394.795 109c1.343 1.723 32.2 42.839-.734 100.072z"/></g></g></svg>
|
||||||
|
After Width: | Height: | Size: 1.9 KiB |
@ -1,45 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
|
||||||
<svg
|
|
||||||
width="513"
|
|
||||||
height="444"
|
|
||||||
version="1.1"
|
|
||||||
id="svg5"
|
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
|
||||||
xmlns:svg="http://www.w3.org/2000/svg">
|
|
||||||
<defs
|
|
||||||
id="defs5" />
|
|
||||||
<g
|
|
||||||
fill="none"
|
|
||||||
fill-rule="evenodd"
|
|
||||||
id="g5">
|
|
||||||
<path
|
|
||||||
fill="#ad245d"
|
|
||||||
d="M 384.5,0.297 512.325,221.9 384.325,443.602 128.5,443.704 0.675,222.1 128.675,0.4 Z"
|
|
||||||
id="path1"
|
|
||||||
style="display:inline;fill:#e67919;fill-opacity:1" />
|
|
||||||
<path
|
|
||||||
d="m 83.051688,348.226 c -0.08,-21.169 -0.205,-53.162 21.257002,-71.332 3.817,-3.253 9.93,-7.497 17.321,-9.224 2.575,-0.523 4.956,-0.756 7.262,-0.979 4.438,-0.431 8.27,-0.804 12.054,-2.9 l 4.954,-2.846 c 9.87,-5.655 19.194,-10.996 28.226,-17.377 5.085,-3.632 6.726,-15.73 6.095,-25.428 -0.214,-2.792 -1.893,-5.7 -3.67,-8.777 -1.097,-1.901 -2.232,-3.867 -3.065,-5.916 l -0.073,-0.199 a 56.976,56.976 0 0 1 -0.422,-1.443 c -1.195,-4.205 -1.933,-6.378 -2.386,-7.476 -7.029,-0.944 -11.8,-8.647 -12.888,-21.006 l -0.031,-0.557 c -0.645,-12.785 0.808,-16.13 2.316,-17.716 0.24,-0.254 0.505,-0.475 0.783,-0.666 -1.754,-16.051 3.115,-32.521 13.358,-44.704 9.314,-11.079 21.955,-17.18 35.592,-17.18 3.73,0 7.55,0.458 11.355,1.362 25.63,6.228 41.679,30.27 40.062,59.227 0.53,0.251 1.018,0.61 1.44,1.066 2.752,2.964 2.47,10.97 2.22,14.276 l -0.024,0.41 c -0.335,5.236 -0.684,10.65 -3.052,15.73 -1.739,3.918 -4.405,6.242 -6.76,8.29 -2.396,2.089 -4.288,3.735 -5.294,6.885 -0.7,2.416 -1.645,4.866 -2.559,7.235 -1.752,4.538 -3.407,8.827 -3.54,13.244 -0.427,10.222 1.17,18.391 4.172,21.359 5.097,5.163 13.003,9.391 19.978,13.121 1.6,0.855 3.166,1.692 4.654,2.517 9.28,5.052 16.07,7.915 25.309,8.557 9.118,0.849 18.056,5.193 24.754,11.97 0.736,0.641 1.82,1.744 3.694,3.648 4.416,4.492 4.416,4.492 4.426,5.852 l 0.007,0.758 c 10.783,17.702 11.14,40.656 11.415,58.169 l 0.05,3.28 -3.278,0.028 c -42.05,0.363 -84.058,0.677 -126.058,0.993 -42.12,0.314 -84.232,0.632 -126.367002,0.994 l -3.273,0.029 z"
|
|
||||||
id="path2-5"
|
|
||||||
style="display:inline;fill:#ffffff" />
|
|
||||||
<path
|
|
||||||
d="m 351.97006,182.43811 c -2.88526,0.005 -5.2219,2.34474 -5.223,5.23 0.001,2.88526 2.33774,5.22504 5.223,5.23 2.88747,-0.003 5.22769,-2.34253 5.231,-5.23 -0.003,-2.88708 -2.34292,-5.22669 -5.23,-5.23 m 0,40.237 c -19.307,0 -35.012,-15.703 -35.012,-35.007 0,-19.295 15.706,-34.993 35.011,-34.993 19.292,0 34.989,15.698 34.989,34.993 0,19.304 -15.697,35.007 -34.989,35.007"
|
|
||||||
fill="#ffffff"
|
|
||||||
id="path2"
|
|
||||||
style="display:inline" />
|
|
||||||
<path
|
|
||||||
d="m 351.97006,147.67511 c -22.338,0 -40.511,18.164 -40.511,40.492 0,22.336 18.173,40.508 40.511,40.508 22.325,0 40.489,-18.172 40.489,-40.508 0,-22.328 -18.164,-40.492 -40.489,-40.492 m 0,51.022 c 5.823,0 10.531,-4.716 10.531,-10.53 a 10.517,10.517 0 0 0 -10.53,-10.529 10.51,10.51 0 0 0 -10.523,10.529 c 0,5.814 4.7,10.53 10.522,10.53 m 0,-40.496 c 16.563,0 29.963,13.406 29.963,29.966 0,16.555 -13.4,29.982 -29.963,29.982 -16.555,0 -29.985,-13.427 -29.985,-29.982 0,-16.56 13.43,-29.966 29.985,-29.966"
|
|
||||||
fill="#ad245d"
|
|
||||||
id="path3"
|
|
||||||
style="display:inline;fill:#e67919;fill-opacity:1" />
|
|
||||||
<path
|
|
||||||
d="m 351.95906,152.88411 c -20.305,0 -36.825,16.06 -36.825,35.799 0,19.747 16.52,35.813 36.825,35.813 20.306,0 36.827,-16.066 36.827,-35.813 0,-19.74 -16.521,-35.8 -36.827,-35.8 z m -16.713,108.791 -4.11,-21.345 c -0.324,-0.129 -0.648,-0.265 -0.972,-0.404 l -18.012,12.169 -23.607,-23.609 12.186,-18.009 a 63.31,63.31 0 0 1 -0.403,-0.968 l -21.369,-4.122 v -33.383 l 21.361,-4.13 c 0.131,-0.327 0.267,-0.652 0.407,-0.979 l -12.18,-18.025 23.608,-23.612 18.015,12.198 c 0.322,-0.137 0.643,-0.27 0.964,-0.4 l 4.112,-21.381 h 33.416 l 4.13,21.387 c 0.319,0.13 0.638,0.26 0.956,0.396 l 18.024,-12.2 23.608,23.612 -12.186,18.031 c 0.139,0.324 0.273,0.648 0.402,0.971 l 21.363,4.133 v 33.381 l -21.37,4.124 c -0.13,0.32 -0.262,0.64 -0.398,0.96 l 12.19,18.017 -23.606,23.609 -18.021,-12.171 c -0.32,0.137 -0.642,0.27 -0.964,0.402 l -4.13,21.348 z"
|
|
||||||
fill="#ffffff"
|
|
||||||
id="path4"
|
|
||||||
style="display:inline" />
|
|
||||||
<path
|
|
||||||
d="m 351.95956,218.12311 c -17.342,0 -31.45,-13.656 -31.45,-30.44 0,-16.778 14.108,-30.427 31.45,-30.427 17.341,0 31.449,13.649 31.449,30.426 0,16.785 -14.108,30.441 -31.45,30.441 z m 20.979,-108.448 h -41.97 l -1.64,8.517 -1.953,10.156 -8.55,-5.788 -7.18,-4.862 -6.132,6.132 -17.399,17.4 -6.126,6.126 4.85,7.178 5.8,8.583 -10.173,1.966 -8.506,1.646 v 41.932 l 8.51,1.643 10.16,1.962 -5.787,8.553 -4.858,7.179 6.13,6.13 17.399,17.399 6.126,6.126 7.177,-4.85 8.56,-5.782 1.954,10.141 1.64,8.513 h 41.964 l 1.645,-8.507 1.964,-10.15 8.566,5.787 7.178,4.846 6.124,-6.124 17.4,-17.399 6.13,-6.13 -4.858,-7.18 -5.788,-8.554 10.153,-1.96 8.51,-1.643 v -41.932 l -8.507,-1.646 -10.165,-1.965 5.8,-8.584 4.85,-7.178 -6.125,-6.126 -17.4,-17.4 -6.13,-6.13 -7.18,4.858 -8.558,5.792 -1.964,-10.166 -1.64,-8.509 z m -20.98,118.948 c 23.176,0 41.95,-18.318 41.95,-40.94 0,-22.607 -18.774,-40.927 -41.95,-40.927 -23.174,0 -41.948,18.32 -41.948,40.926 0,22.623 18.774,40.941 41.949,40.941 z m 12.314,-108.448 3.855,19.963 a 47.184,47.184 0 0 1 6.037,2.502 l 16.824,-11.386 17.4,17.4 -11.362,16.818 a 53.171,53.171 0 0 1 2.502,6.066 l 19.932,3.855 v 24.601 l -19.932,3.848 a 56.644,56.644 0 0 1 -2.502,6.066 l 11.362,16.795 -17.4,17.4 -16.824,-11.364 a 44.931,44.931 0 0 1 -6.037,2.504 l -3.855,19.932 h -24.633 l -3.84,-19.932 a 43.821,43.821 0 0 1 -6.043,-2.504 l -16.818,11.364 -17.4,-17.4 11.364,-16.795 a 53.759,53.759 0 0 1 -2.51,-6.066 l -19.933,-3.848 v -24.601 l 19.933,-3.855 a 50.617,50.617 0 0 1 2.51,-6.066 l -11.364,-16.818 17.4,-17.4 16.818,11.386 a 45.957,45.957 0 0 1 6.043,-2.502 l 3.84,-19.963 h 24.632 z"
|
|
||||||
fill="#ad245d"
|
|
||||||
id="path5"
|
|
||||||
style="display:inline;fill:#e67919;fill-opacity:1" />
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 5.7 KiB |
@ -1,38 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
|
||||||
<svg
|
|
||||||
width="513"
|
|
||||||
height="444"
|
|
||||||
version="1.1"
|
|
||||||
id="svg3"
|
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
|
||||||
xmlns:svg="http://www.w3.org/2000/svg">
|
|
||||||
<defs
|
|
||||||
id="defs3" />
|
|
||||||
<g
|
|
||||||
fill="none"
|
|
||||||
fill-rule="evenodd"
|
|
||||||
id="g3">
|
|
||||||
<path
|
|
||||||
fill="#AD245D"
|
|
||||||
d="M384.5.297L512.325 221.9l-128 221.702-255.825.102L.675 222.1 128.675.4z"
|
|
||||||
id="path1"
|
|
||||||
style="fill:#e67919;fill-opacity:1" />
|
|
||||||
<path
|
|
||||||
d="m 80.877371,348.226 c -0.08,-21.169 -0.205,-53.162 21.256999,-71.332 3.817,-3.253 9.93,-7.497 17.321,-9.224 2.575,-0.523 4.956,-0.756 7.262,-0.979 4.438,-0.431 8.27,-0.804 12.054,-2.9 l 4.954,-2.846 c 9.87,-5.655 19.194,-10.996 28.226,-17.377 5.085,-3.632 6.726,-15.73 6.095,-25.428 -0.214,-2.792 -1.893,-5.7 -3.67,-8.777 -1.097,-1.901 -2.232,-3.867 -3.065,-5.916 l -0.073,-0.199 a 56.976,56.976 0 0 1 -0.422,-1.443 c -1.195,-4.205 -1.933,-6.378 -2.386,-7.476 -7.029,-0.944 -11.8,-8.647 -12.888,-21.006 l -0.031,-0.557 c -0.645,-12.785 0.808,-16.13 2.316,-17.716 0.24,-0.254 0.505,-0.475 0.783,-0.666 -1.754,-16.051 3.115,-32.521 13.358,-44.704 9.314,-11.079 21.955,-17.18 35.592,-17.18 3.73,0 7.55,0.458 11.355,1.362 25.63,6.228 41.679,30.27 40.062,59.227 0.53,0.251 1.018,0.61 1.44,1.066 2.752,2.964 2.47,10.97 2.22,14.276 l -0.024,0.41 c -0.335,5.236 -0.684,10.65 -3.052,15.73 -1.739,3.918 -4.405,6.242 -6.76,8.29 -2.396,2.089 -4.288,3.735 -5.294,6.885 -0.7,2.416 -1.645,4.866 -2.559,7.235 -1.752,4.538 -3.407,8.827 -3.54,13.244 -0.427,10.222 1.17,18.391 4.172,21.359 5.097,5.163 13.003,9.391 19.978,13.121 1.6,0.855 3.166,1.692 4.654,2.517 9.28,5.052 16.07,7.915 25.309,8.557 9.118,0.849 18.056,5.193 24.754,11.97 0.736,0.641 1.82,1.744 3.694,3.648 4.416,4.492 4.416,4.492 4.426,5.852 l 0.007,0.758 c 10.783,17.702 11.14,40.656 11.415,58.169 l 0.05,3.28 -3.278,0.028 c -42.05,0.363 -84.058,0.677 -126.058,0.993 -42.12,0.314 -84.232,0.632 -126.366999,0.994 l -3.273,0.029 z"
|
|
||||||
id="path2-5"
|
|
||||||
style="display:inline;fill:#ffffff" />
|
|
||||||
<text
|
|
||||||
font-family="Impact"
|
|
||||||
font-size="118px"
|
|
||||||
font-style="condensed"
|
|
||||||
font-weight="700"
|
|
||||||
id="text2"
|
|
||||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:96px;font-family:Monospace;-inkscape-font-specification:Monospace;display:inline;fill:#ffffff"
|
|
||||||
x="6.8672509"
|
|
||||||
y="17"><tspan
|
|
||||||
x="262.86725"
|
|
||||||
y="225"
|
|
||||||
id="tspan2"
|
|
||||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:96px;font-family:Monospace;-inkscape-font-specification:Monospace;fill:#ffffff"></></tspan></text>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 2.6 KiB |
@ -1,29 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
|
||||||
<svg
|
|
||||||
width="512"
|
|
||||||
height="444"
|
|
||||||
version="1.1"
|
|
||||||
id="svg3"
|
|
||||||
xmlns="http://www.w3.org/2000/svg"
|
|
||||||
xmlns:svg="http://www.w3.org/2000/svg">
|
|
||||||
<defs
|
|
||||||
id="defs3" />
|
|
||||||
<g
|
|
||||||
fill="none"
|
|
||||||
fill-rule="evenodd"
|
|
||||||
id="g3">
|
|
||||||
<path
|
|
||||||
fill="#AD245D"
|
|
||||||
d="M384 .297L511.392 221.65l-128 221.702-255.392.352L.608 222.35 128.608.65z"
|
|
||||||
id="path1"
|
|
||||||
style="fill:#e67919;fill-opacity:1" />
|
|
||||||
<path
|
|
||||||
d="m 85.310542,348.226 c -0.08,-21.169 -0.205,-53.162 21.256998,-71.332 3.817,-3.253 9.93,-7.497 17.321,-9.224 2.575,-0.523 4.956,-0.756 7.262,-0.979 4.438,-0.431 8.27,-0.804 12.054,-2.9 l 4.954,-2.846 c 9.87,-5.655 19.194,-10.996 28.226,-17.377 5.085,-3.632 6.726,-15.73 6.095,-25.428 -0.214,-2.792 -1.893,-5.7 -3.67,-8.777 -1.097,-1.901 -2.232,-3.867 -3.065,-5.916 l -0.073,-0.199 a 56.976,56.976 0 0 1 -0.422,-1.443 c -1.195,-4.205 -1.933,-6.378 -2.386,-7.476 -7.029,-0.944 -11.8,-8.647 -12.888,-21.006 l -0.031,-0.557 c -0.645,-12.785 0.808,-16.13 2.316,-17.716 0.24,-0.254 0.505,-0.475 0.783,-0.666 -1.754,-16.051 3.115,-32.521 13.358,-44.704 9.314,-11.079 21.955,-17.18 35.592,-17.18 3.73,0 7.55,0.458 11.355,1.362 25.63,6.228 41.679,30.27 40.062,59.227 0.53,0.251 1.018,0.61 1.44,1.066 2.752,2.964 2.47,10.97 2.22,14.276 l -0.024,0.41 c -0.335,5.236 -0.684,10.65 -3.052,15.73 -1.739,3.918 -4.405,6.242 -6.76,8.29 -2.396,2.089 -4.288,3.735 -5.294,6.885 -0.7,2.416 -1.645,4.866 -2.559,7.235 -1.752,4.538 -3.407,8.827 -3.54,13.244 -0.427,10.222 1.17,18.391 4.172,21.359 5.097,5.163 13.003,9.391 19.978,13.121 1.6,0.855 3.166,1.692 4.654,2.517 9.28,5.052 16.07,7.915 25.309,8.557 9.118,0.849 18.056,5.193 24.754,11.97 0.736,0.641 1.82,1.744 3.694,3.648 4.416,4.492 4.416,4.492 4.426,5.852 l 0.007,0.758 c 10.783,17.702 11.14,40.656 11.415,58.169 l 0.05,3.28 -3.278,0.028 c -42.05,0.363 -84.058,0.677 -126.058,0.993 -42.12,0.314 -84.232,0.632 -126.366998,0.994 l -3.273,0.029 z"
|
|
||||||
id="path2-5"
|
|
||||||
style="display:inline;fill:#ffffff" />
|
|
||||||
<path
|
|
||||||
d="m 349.88573,158.65792 h 15.318 v 86.734 h -15.318 v 0.513 l -22.127,-17.64 v 0.12 h -10.21 v 25.51 h -22.128 v -25.51 h -20.424 v -52.722 h 52.762 v -0.508 l 22.127,-17.065 z m 34.313,72.093 -7.988,-4.591 c 15.803,-27.453 1.717,-46.642 1.106,-47.443 l 7.304,-5.607 c 0.774,0.993 18.547,24.675 -0.422,57.641 z m 27.361,21.216 -13.866,-7.975 c 27.437,-47.66 2.98,-80.973 1.918,-82.36 l 12.682,-9.737 c 1.343,1.723 32.2,42.839 -0.734,100.072 z"
|
|
||||||
id="path2-1"
|
|
||||||
style="display:inline;fill:#ffffff" />
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 2.5 KiB |
|
Before Width: | Height: | Size: 2.3 KiB After Width: | Height: | Size: 2.3 KiB |
|
Before Width: | Height: | Size: 2.3 KiB After Width: | Height: | Size: 2.3 KiB |
|
Before Width: | Height: | Size: 3.0 KiB After Width: | Height: | Size: 3.0 KiB |