Compare commits

..

618 Commits

Author SHA1 Message Date
DecDuck fd828d5b50 Update droplet & other small features, and bump version for v0.3.3 (#212)
* fix: bump version and fix context timeout issues

* fix: bump droplet

* feat: add appimage auto-detection (#209)
2025-08-25 13:23:46 +10:00
DecDuck b33e27e446 API tokens (#201)
* fix: small fixes to request util and version update endpoint

* feat: api token creation and management

* fix: lint

* fix: remove unneeded sidebar component
2025-08-23 13:58:52 +10:00
useless-bit c97a56eb42 Init Prisma in Dockerfile (#204) 2025-08-23 07:55:37 +10:00
dependabot[bot] 5e5519ece7 chore(deps): bump vite-plugin-static-copy from 3.1.1 to 3.1.2 (#199)
Bumps [vite-plugin-static-copy](https://github.com/sapphi-red/vite-plugin-static-copy) from 3.1.1 to 3.1.2.
- [Release notes](https://github.com/sapphi-red/vite-plugin-static-copy/releases)
- [Changelog](https://github.com/sapphi-red/vite-plugin-static-copy/blob/main/CHANGELOG.md)
- [Commits](https://github.com/sapphi-red/vite-plugin-static-copy/compare/vite-plugin-static-copy@3.1.1...vite-plugin-static-copy@3.1.2)

---
updated-dependencies:
- dependency-name: vite-plugin-static-copy
  dependency-version: 3.1.2
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-08-22 13:49:31 +10:00
DecDuck 6d89b7e510 Admin task UI update & QoL (#194)
* feat: revise library source names & update droplet

* feat: add internal name hint to library sources

* feat: update library source table with new name + icons

* fix: admin invitation localisation issue

* feat: #164

* feat: overhaul task UIs, #163

* fix: remove debug task

* fix: lint
2025-08-19 15:03:20 +10:00
FurbyOnSteroids 6baddc10e9 Fix non-unicode characters in game path (#193)
* replace btoa with a Buffer implementation, as btoa does not support non-unicode characters.

* replace btoa with a Buffer implementation, as btoa does not support non-unicode characters.

* fix linting

* fix linting

* replace buffer implementation with a md5 hash. This also adds the ts-md5 library.

* Revert "replace buffer implementation with a md5 hash. This also adds the ts-md5 library."

This reverts commit f98b811ab9.

* replace buffer implementation with md5 hash from node:crypto

* fix linting.. again

---------

Co-authored-by: FurbyOnSteroids <codeberg@your-moms-bellybutton.hair>
2025-08-16 22:23:57 +10:00
DecDuck a2ea0060cb Merge pull request #191 from Drop-OSS/weblate
Translations update from Weblate
2025-08-16 12:06:53 +10:00
Weblate 6aaab30439 Merge remote-tracking branch 'origin/develop' into develop 2025-08-16 02:05:27 +00:00
Ribemont Francois ea5d108a10 Translated using Weblate (French)
Currently translated at 98.2% (450 of 458 strings)

Translation: Drop/Drop
Translate-URL: http://translate.droposs.org/projects/drop/drop/fr/
2025-08-16 12:02:48 +10:00
Weblate Translation Memory f0b127789f Translated using Weblate (English (en_PIRATE))
Currently translated at 83.8% (384 of 458 strings)

Translation: Drop/Drop
Translate-URL: http://translate.droposs.org/projects/drop/drop/en_PIRATE/
2025-08-16 12:02:48 +10:00
Weblate 4c8be2bfd1 Update translation files
Updated by "Remove blank strings" add-on in Weblate.

Translation: Drop/Drop
Translate-URL: http://translate.droposs.org/projects/drop/drop/
2025-08-16 12:02:47 +10:00
Ribemont Francois 7e371adeb0 Translated using Weblate (French)
Currently translated at 97.3% (446 of 458 strings)

Translation: Drop/Drop
Translate-URL: http://translate.droposs.org/projects/drop/drop/fr/
2025-08-16 12:02:47 +10:00
Weblate Translation Memory 6d7b491adb Translated using Weblate (French)
Currently translated at 97.8% (448 of 458 strings)

Translation: Drop/Drop
Translate-URL: http://translate.droposs.org/projects/drop/drop/fr/
2025-08-16 12:02:36 +10:00
DecDuck abec952e39 Various fixes (#186)
* fix: #181

* fix: use taskHandler as source of truth for imports

* fix: task formatting

* fix: zip downloads

* feat: re-enable import version button on delete + lint
2025-08-15 22:57:56 +10:00
dependabot[bot] 9ff541059d chore(deps): bump tmp from 0.2.3 to 0.2.4 (#179)
Bumps [tmp](https://github.com/raszi/node-tmp) from 0.2.3 to 0.2.4.
- [Changelog](https://github.com/raszi/node-tmp/blob/master/CHANGELOG.md)
- [Commits](https://github.com/raszi/node-tmp/compare/v0.2.3...v0.2.4)

---
updated-dependencies:
- dependency-name: tmp
  dependency-version: 0.2.4
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-08-13 08:28:06 +10:00
DecDuck b84d1f20b5 v2 download API and Admin UI fixes (#177)
* fix: small ui fixes

* feat: #171

* fix: improvements to library scanning on admin UI

* feat: v2 download API

* fix: add download context cleanup

* fix: lint
2025-08-09 15:45:39 +10:00
Ribemont Francois ecc806dc07 Translated using Weblate (French)
Currently translated at 98.2% (450 of 458 strings)

Translation: Drop/Drop
Translate-URL: http://translate.droposs.org/projects/drop/drop/fr/
2025-08-06 21:06:35 +00:00
Weblate Translation Memory 45c94cfcbf Translated using Weblate (English (en_PIRATE))
Currently translated at 83.8% (384 of 458 strings)

Translation: Drop/Drop
Translate-URL: http://translate.droposs.org/projects/drop/drop/en_PIRATE/
2025-08-06 21:06:35 +00:00
DecDuck f6f972c2d6 Translations update from Weblate (#172)
* Translated using Weblate (English)

Currently translated at 100.0% (458 of 458 strings)

Translation: Drop/Drop
Translate-URL: http://translate.droposs.org/projects/drop/drop/en/

* Translated using Weblate (English (en_PIRATE))

Currently translated at 80.7% (370 of 458 strings)

Translation: Drop/Drop
Translate-URL: http://translate.droposs.org/projects/drop/drop/en_PIRATE/

* Translated using Weblate (English)

Currently translated at 100.0% (458 of 458 strings)

Translation: Drop/Drop
Translate-URL: http://translate.droposs.org/projects/drop/drop/en/

* Translated using Weblate (English (en_PIRATE))

Currently translated at 83.4% (382 of 458 strings)

Translation: Drop/Drop
Translate-URL: http://translate.droposs.org/projects/drop/drop/en_PIRATE/

* Added translation using Weblate (Russian)

* Translated using Weblate (French)

Currently translated at 49.1% (225 of 458 strings)

Translation: Drop/Drop
Translate-URL: http://translate.droposs.org/projects/drop/drop/fr/

* Translated using Weblate (German)

Currently translated at 54.3% (249 of 458 strings)

Translation: Drop/Drop
Translate-URL: http://translate.droposs.org/projects/drop/drop/de/

* Translated using Weblate (German)

Currently translated at 54.3% (249 of 458 strings)

Translation: Drop/Drop
Translate-URL: http://translate.droposs.org/projects/drop/drop/de/

* Translated using Weblate (Russian)

Currently translated at 6.1% (28 of 458 strings)

Translation: Drop/Drop
Translate-URL: http://translate.droposs.org/projects/drop/drop/ru/

* Translated using Weblate (English (en_PIRATE))

Currently translated at 84.0% (385 of 458 strings)

Translation: Drop/Drop
Translate-URL: http://translate.droposs.org/projects/drop/drop/en_PIRATE/

* Translated using Weblate (French)

Currently translated at 97.8% (448 of 458 strings)

Translation: Drop/Drop
Translate-URL: http://translate.droposs.org/projects/drop/drop/fr/

* Translated using Weblate (French)

Currently translated at 97.8% (448 of 458 strings)

Translation: Drop/Drop
Translate-URL: http://translate.droposs.org/projects/drop/drop/fr/

* Translated using Weblate (German)

Currently translated at 68.5% (314 of 458 strings)

Translation: Drop/Drop
Translate-URL: http://translate.droposs.org/projects/drop/drop/de/

* Translated using Weblate (German)

Currently translated at 68.5% (314 of 458 strings)

Translation: Drop/Drop
Translate-URL: http://translate.droposs.org/projects/drop/drop/de/

* Translated using Weblate (German)

Currently translated at 68.5% (314 of 458 strings)

Translation: Drop/Drop
Translate-URL: http://translate.droposs.org/projects/drop/drop/de/

* Translated using Weblate (English)

Currently translated at 100.0% (458 of 458 strings)

Translation: Drop/Drop
Translate-URL: http://translate.droposs.org/projects/drop/drop/en/

* Translated using Weblate (French)

Currently translated at 97.3% (446 of 458 strings)

Translation: Drop/Drop
Translate-URL: http://translate.droposs.org/projects/drop/drop/fr/

* Update translation files

Updated by "Remove blank strings" add-on in Weblate.

Translation: Drop/Drop
Translate-URL: http://translate.droposs.org/projects/drop/drop/

---------

Co-authored-by: Husky <husky@disroot.org>
Co-authored-by: Ribemont Francois <ribemont.francois+weblate@gmail.com>
Co-authored-by: Hicks <hicksgaming99+weblate@gmail.com>
Co-authored-by: Kuschiniko <nico.kusch@outlook.de>
Co-authored-by: Dmitrii <nossster@gmail.com>
Co-authored-by: Weblate Translation Memory <noreply-mt-weblate-translation-memory@weblate.org>
Co-authored-by: Weblate <noreply@weblate.org>
2025-08-06 17:49:07 +10:00
Mars7x e1dc26f676 README fixes (#174) 2025-08-06 17:48:25 +10:00
Weblate 2fec40c5a6 Update translation files
Updated by "Remove blank strings" add-on in Weblate.

Translation: Drop/Drop
Translate-URL: http://translate.droposs.org/projects/drop/drop/
2025-08-06 02:57:46 +00:00
Ribemont Francois 8f572e1259 Translated using Weblate (French)
Currently translated at 97.3% (446 of 458 strings)

Translation: Drop/Drop
Translate-URL: http://translate.droposs.org/projects/drop/drop/fr/
2025-08-06 02:57:46 +00:00
Weblate Admin 43aa15d45c Translated using Weblate (English)
Currently translated at 100.0% (458 of 458 strings)

Translation: Drop/Drop
Translate-URL: http://translate.droposs.org/projects/drop/drop/en/
2025-08-06 02:57:46 +00:00
Husky 59a5540248 Translated using Weblate (German)
Currently translated at 68.5% (314 of 458 strings)

Translation: Drop/Drop
Translate-URL: http://translate.droposs.org/projects/drop/drop/de/
2025-08-06 00:05:00 +00:00
Kuschiniko 5bfb3e0f68 Translated using Weblate (German)
Currently translated at 68.5% (314 of 458 strings)

Translation: Drop/Drop
Translate-URL: http://translate.droposs.org/projects/drop/drop/de/
2025-08-06 00:05:00 +00:00
Hicks c04f6cbf80 Translated using Weblate (German)
Currently translated at 68.5% (314 of 458 strings)

Translation: Drop/Drop
Translate-URL: http://translate.droposs.org/projects/drop/drop/de/
2025-08-06 00:05:00 +00:00
Weblate Translation Memory d2863fa95b Translated using Weblate (French)
Currently translated at 97.8% (448 of 458 strings)

Translation: Drop/Drop
Translate-URL: http://translate.droposs.org/projects/drop/drop/fr/
2025-08-06 00:05:00 +00:00
Ribemont Francois 821fd2cf2d Translated using Weblate (French)
Currently translated at 97.8% (448 of 458 strings)

Translation: Drop/Drop
Translate-URL: http://translate.droposs.org/projects/drop/drop/fr/
2025-08-06 00:05:00 +00:00
Husky 6f84ad42fc Translated using Weblate (English (en_PIRATE))
Currently translated at 84.0% (385 of 458 strings)

Translation: Drop/Drop
Translate-URL: http://translate.droposs.org/projects/drop/drop/en_PIRATE/
2025-08-06 00:04:59 +00:00
Dmitrii 1d1157a902 Translated using Weblate (Russian)
Currently translated at 6.1% (28 of 458 strings)

Translation: Drop/Drop
Translate-URL: http://translate.droposs.org/projects/drop/drop/ru/
2025-08-05 19:50:38 +00:00
Kuschiniko 6ca9e34c7e Translated using Weblate (German)
Currently translated at 54.3% (249 of 458 strings)

Translation: Drop/Drop
Translate-URL: http://translate.droposs.org/projects/drop/drop/de/
2025-08-05 19:50:38 +00:00
Hicks bc29c468d8 Translated using Weblate (German)
Currently translated at 54.3% (249 of 458 strings)

Translation: Drop/Drop
Translate-URL: http://translate.droposs.org/projects/drop/drop/de/
2025-08-05 19:50:38 +00:00
Ribemont Francois 925ea1a414 Translated using Weblate (French)
Currently translated at 49.1% (225 of 458 strings)

Translation: Drop/Drop
Translate-URL: http://translate.droposs.org/projects/drop/drop/fr/
2025-08-05 19:50:38 +00:00
Weblate Admin c9addd407e Added translation using Weblate (Russian) 2025-08-05 01:47:18 +00:00
Husky 242ae09857 Translated using Weblate (English (en_PIRATE))
Currently translated at 83.4% (382 of 458 strings)

Translation: Drop/Drop
Translate-URL: http://translate.droposs.org/projects/drop/drop/en_PIRATE/
2025-08-04 17:18:11 +00:00
Husky ba28c52912 Translated using Weblate (English)
Currently translated at 100.0% (458 of 458 strings)

Translation: Drop/Drop
Translate-URL: http://translate.droposs.org/projects/drop/drop/en/
2025-08-04 17:18:11 +00:00
Husky a98c95e695 Translated using Weblate (English (en_PIRATE))
Currently translated at 80.7% (370 of 458 strings)

Translation: Drop/Drop
Translate-URL: http://translate.droposs.org/projects/drop/drop/en_PIRATE/
2025-08-04 17:18:11 +00:00
Husky 26615ccad0 Translated using Weblate (English)
Currently translated at 100.0% (458 of 458 strings)

Translation: Drop/Drop
Translate-URL: http://translate.droposs.org/projects/drop/drop/en/
2025-08-04 17:18:11 +00:00
Husky 0b0972b48d Small IO tweaks, robots.txt, and README improvements (#173)
* feat: add link to drop version in footer

* feat: add drop logo aria label

* feat: disable all crawling by bots

for now i think this is a good default as all of drop is currently behind auth

* feat: hide logo when inside wordmark for aria

* docs: update readme and contributing

* feat: default page in setup wizzard is img

* ci: remove redundant perm in release ci

* docs: update translation links and add progress image

* fix: lang selector using wrong weblate link
2025-08-04 16:30:22 +10:00
luzpaz a435ead916 Fix various typos (#156)
Found via `codespell -q 3 -S "./yarn.lock" -L pris`
2025-08-01 21:53:31 +10:00
DecDuck 545a6b154a Fix #119 (#153) 2025-08-01 16:26:27 +10:00
DecDuck 442f940cc4 Translated using Weblate (English) (#151)
Currently translated at 100.0% (456 of 456 strings)

Translation: Drop/Drop
Translate-URL: http://translate.droposs.org/projects/drop/drop/en/
2025-08-01 14:31:50 +10:00
DecDuck 7d9525084d feat: bump version (#150) 2025-08-01 14:02:44 +10:00
DecDuck 72c972a2a7 Fix for undeleted games from library sources (#148)
* fix: casade delete for games and library sources

* fix: add bug workaround

* fix: lint
2025-08-01 14:00:10 +10:00
DecDuck b72e1ef7a4 Code-based authorization for Drop clients (#145)
* feat: code-based authorization

* fix: final touches

* fix: require session on code fetch endpoint

* feat: better error handling

* refactor: move auth send to client handler

* fix: lint
2025-08-01 13:11:56 +10:00
DecDuck 786ad0ff82 Translations update from Weblate (#107)
* Translated using Weblate (English (Australia))

Currently translated at 1.6% (6 of 375 strings)

Translation: Drop/Drop
Translate-URL: http://translate.droposs.org/projects/drop/drop/en_AU/

* Translated using Weblate (English (en_PIRATE))

Currently translated at 99.4% (373 of 375 strings)

Translation: Drop/Drop
Translate-URL: http://translate.droposs.org/projects/drop/drop/en_PIRATE/

* Translated using Weblate (English (en_PIRATE))

Currently translated at 99.4% (373 of 375 strings)

Translation: Drop/Drop
Translate-URL: http://translate.droposs.org/projects/drop/drop/en_PIRATE/

* Translated using Weblate (English (en_PIRATE))

Currently translated at 100.0% (375 of 375 strings)

Translation: Drop/Drop
Translate-URL: http://translate.droposs.org/projects/drop/drop/en_PIRATE/

---------

Co-authored-by: Weblate Translation Memory <noreply-mt-weblate-translation-memory@weblate.org>
2025-08-01 10:38:53 +10:00
DecDuck 00224bdd2f Fix for incorrect description on company page 2025-07-31 21:49:15 +10:00
DecDuck 371e069e20 Fix for invalid route in setup wizard 2025-07-31 21:44:25 +10:00
DecDuck 91bb7c7dd4 Fix for Release CI 2025-07-31 21:39:01 +10:00
DecDuck 4e901164fb Fix Github Release CI (#144)
* fix: attempt fix from https://github.com/reproducible-containers/buildkit-cache-dance

* fix: lint

* fix: migrate to pnpm to see if it builds

* fix: comment out unified deps builder

* fix: remove dependency on deps

* fix: shamefully hoist deps
2025-07-31 21:36:01 +10:00
DecDuck 244f20b5f4 v0.3.0 2025-07-31 20:41:42 +10:00
DecDuck e4c8d42cc8 Setup wizard & 0.3.0 release (#146)
* fix: small merge fixes

* feat: initial setup wizard

* fix: last few localization items

* fix: lint

* fix: bump version
2025-07-31 20:41:02 +10:00
DecDuck ed99e020df Merge branch 'main' into develop 2025-07-31 18:03:19 +10:00
DecDuck 8363de2eed Store overhaul (#142)
* feat: small library tweaks + company page

* feat: new store view

* fix: ci merge error

* feat: add genres to store page

* feat: sorting

* feat: lock game/version imports while their tasks are running

* feat: feature games

* feat: tag based filtering

* fix: make tags alphabetical

* refactor: move a bunch of i18n to common

* feat: add localizations for everything

* fix: title description on panel

* fix: feature carousel text

* fix: i18n footer strings

* feat: add tag page

* fix: develop merge

* feat: offline games support (don't error out if provider throws)

* feat: tag management

* feat: show library next to game import + small fixes

* feat: most of the company and tag managers

* feat: company text field editing

* fix: small fixes + tsgo experiemental

* feat: upload icon and banner

* feat: store infinite scrolling and bulk import mode

* fix: lint

* fix: add drop-base to prettier ignore
2025-07-30 13:40:49 +10:00
Husky 1ae051f066 Update Prisma to 6.11 (#133)
* chore: update prisma to 6.11

more prisma future proofing due to experimental features

* chore: update dependencies

twemoji - new unicode update
argon2 - bux fixes
vue3-carousel - improve mobile experiance
vue-tsc - more stable

* fix: incorrect prisma version in docker

Also remove default value for BUILD_DROP_VERSION, that is now handled in nuxt config

* fix: no logging in prod

* chore: optimize docker builds even more

* fix: revert adoption of prisma driverAdapters

see: https://github.com/prisma/prisma/issues/27486

* chore: optimize dockerignore some more

* Fix `pino-pretty` not being included in build (#135)

* Remove `pino` from frontend

* Fix for downloads and removing of library source (#136)

* fix: downloads and removing library source

* fix: linting

* Fix max file size of 4GB (update droplet) (#137)

* Fix manual metadata import (#138)

* chore(deps): bump vue-i18n from 10.0.7 to 10.0.8 (#140)

Bumps [vue-i18n](https://github.com/intlify/vue-i18n/tree/HEAD/packages/vue-i18n) from 10.0.7 to 10.0.8.
- [Release notes](https://github.com/intlify/vue-i18n/releases)
- [Changelog](https://github.com/intlify/vue-i18n/blob/master/CHANGELOG.md)
- [Commits](https://github.com/intlify/vue-i18n/commits/v10.0.8/packages/vue-i18n)

---
updated-dependencies:
- dependency-name: vue-i18n
  dependency-version: 10.0.8
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* chore(deps): bump @intlify/core from 10.0.7 to 10.0.8 (#139)

---
updated-dependencies:
- dependency-name: "@intlify/core"
  dependency-version: 10.0.8
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>

* Small fixes (#141)

* fix: save task as Json rather than string

* fix: pull objects before creating game in database

* fix: strips relative dirs from version information

* fix: #132

* fix: lint

* fix: news object ids and small tweaks

* fix: notification styling errors

* fix: lint

* fix: build issues by regenerating lockfile

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: DecDuck <declanahofmeyr@gmail.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-07-25 21:28:00 +10:00
DecDuck 45848d175e Small fixes (#141)
* fix: save task as Json rather than string

* fix: pull objects before creating game in database

* fix: strips relative dirs from version information

* fix: #132

* fix: lint

* fix: news object ids and small tweaks

* fix: notification styling errors

* fix: lint
2025-07-20 14:56:15 +10:00
dependabot[bot] 661dcf86a8 chore(deps): bump @intlify/core from 10.0.7 to 10.0.8 (#139)
---
updated-dependencies:
- dependency-name: "@intlify/core"
  dependency-version: 10.0.8
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-07-20 14:29:49 +10:00
dependabot[bot] a7b9bbc78a chore(deps): bump vue-i18n from 10.0.7 to 10.0.8 (#140)
Bumps [vue-i18n](https://github.com/intlify/vue-i18n/tree/HEAD/packages/vue-i18n) from 10.0.7 to 10.0.8.
- [Release notes](https://github.com/intlify/vue-i18n/releases)
- [Changelog](https://github.com/intlify/vue-i18n/blob/master/CHANGELOG.md)
- [Commits](https://github.com/intlify/vue-i18n/commits/v10.0.8/packages/vue-i18n)

---
updated-dependencies:
- dependency-name: vue-i18n
  dependency-version: 10.0.8
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-07-20 14:29:37 +10:00
DecDuck 75842fbfb6 Fix manual metadata import (#138) 2025-07-14 17:26:00 +10:00
DecDuck 4ef2ab2587 Fix max file size of 4GB (update droplet) (#137) 2025-07-14 16:43:42 +10:00
DecDuck 935ff48b15 Fix for downloads and removing of library source (#136)
* fix: downloads and removing library source

* fix: linting
2025-07-14 15:34:10 +10:00
DecDuck 51390e115f Remove pino from frontend 2025-07-14 14:20:17 +10:00
DecDuck 7bfc441d1d Fix pino-pretty not being included in build (#135) 2025-07-14 12:11:17 +10:00
Husky 2b70cea4e0 Logging (#131)
* ci: pull version from package.json on build

* fix: implicit any type

* feat: inital support for logger

* style: fix lint

* feat: move more logging over to pino

* fix: logging around company importing
2025-07-09 12:01:23 +10:00
DecDuck e4fbc7cd50 Toggle for showing title & description overlay on store page #51 (#130)
* #51 Adds settings page with showTitleDescriptionOnGamePanel

* Removes console.log

* Renames isHidden to system, adds missing system column on Game and fixes nitro plugin on fresh database

* Implements a different way to handle the placeholder image

* Removes system column on Game

* Groups settings keys together

* Removes unused i18n keys

* fix: fix eslints and other small tweaks

---------

Co-authored-by: Francois Ribemont <ribemont.francois@gmail.com>
2025-07-06 13:13:57 +10:00
DecDuck 706f2aac83 FlatLibrary provider (#127) 2025-07-06 12:44:41 +10:00
Husky 73c27f0984 User invite uses external domain option (#118)
* feat: user invite uses external domain option
fixes #117

* fix: inconsistent external url format

* fix: normalize external url more cleanly
2025-07-01 09:11:26 +10:00
DecDuck 12837d44fe Fix linting 2025-07-01 09:09:10 +10:00
DecDuck 12d87d6256 Fix CodeQL warnings 2025-06-28 12:00:42 +10:00
DecDuck 1bfdd73e4c Combined fixes (#116)
* fix: missing CheckIcon import in LanguageSelector

* fix: #114 and error handling

* fix: #97

* fix: lint

* feat: #104

* fix: #72
2025-06-10 10:08:01 +10:00
Pacodastre 60abc03091 Adds delete user functionality in admin panel #86 (#110)
* #86 Adds delete user functionality in admin panel

* Removes unnecessary code

* Prevents current user from deleting itself
2025-06-08 14:49:11 +10:00
DecDuck e32954ea7d Fix: Re-use validator from signup on invitation creation #108 (#113)
* fix: invitation validation

* fix: lint
2025-06-08 14:47:08 +10:00
Husky 72ae7a2884 Various bug fixes (#102)
* feat: set lang in html head

* fix: add # in front of git ref

* fix: remove unused vars from example env

* fix: package name and license field

* fix: enable sourcemap for client and server

* fix: emojis not showing in prod

this is extremely cursed, but it works

* chore: refactor auth manager

* feat: disable invitations if simple auth disabled

* feat: add drop version to footer

* feat: translate auth endpoints

* chore: move oidc module

* feat: add weekly tasks

enabled object cleanup as weekly task

* feat: add timestamp to task log msgs

* feat: add guard to prevent invalid progress %

* fix: add missing global scope to i18n components

* feat: set base url for i18n

* feat: switch task log to json format

* ci: run ci on develop branch only

* fix: UserWidget text not updating #109

* fix: EXTERNAL_URL being computed at build

* feat: add basic language outlines for translation

* feat: add more english dialects
2025-06-08 13:49:43 +10:00
DecDuck 9f5a3b3976 Re-use validator from signup on invitation creation #108 (#111)
* fix: server side validation and client side validation for invitation creation

* fix: lint
2025-06-08 11:59:00 +10:00
DecDuck de438b93d5 Migrate game metadata import to task system #90 (#103)
* feat: move game import to new task system

* fix: sizing issue with new task UI

* fix: lint

* feat: add pcgamingwiki task
2025-06-08 11:37:24 +10:00
DecDuck 9f8890020f Translations update from Weblate (#106)
* Translated using Weblate (English (en_PIRATE))

Currently translated at 100.0% (362 of 362 strings)

Translation: Drop/Drop
Translate-URL: http://translate.droposs.org/projects/drop/drop/en_PIRATE/

* Translated using Weblate (English (en_PIRATE))

Currently translated at 100.0% (362 of 362 strings)

Translation: Drop/Drop
Translate-URL: http://translate.droposs.org/projects/drop/drop/en_PIRATE/

---------

Co-authored-by: Anonymous <noreply@weblate.org>
2025-06-08 11:15:16 +10:00
DecDuck 0e023534a7 Redesign of language selector #100 (#101)
* feat: add new language selector in footer, add pirate language

* fix: translations in title bar not updating

* chore: refactor into separate component

* fix: update translate url

* fix: update pirate translation to use "ship" instead of "plank" for platform

a very very necessary change
2025-06-08 10:33:41 +10:00
DecDuck a199393e29 Fix: Sign out functionality #95 (#99)
* fix: signout button on user widget

* fix: add comment explaining
2025-06-07 17:26:09 +10:00
DecDuck ed90ae2775 Fix: Broken footer links #96 (#98)
* fix: footer links

* fix: lint
2025-06-07 17:21:07 +10:00
DecDuck ca8ad37adf Fix unauthenticated /api/v1/client/chunk route
Critical fix, no issue or PR
2025-06-07 16:27:43 +10:00
DecDuck 4184705b14 Task groups & viewer in admin panel #52 (#91)
* feat: historical tasks in database, better scheduling, and unified API for accessing tasks

* feat: new UI for everything

* fix: add translations and fix formatting
2025-06-07 15:39:01 +10:00
Pacodastre d976ac87e3 Fix: Image upload modal doesn't close when clicking cancel #50 (#93) 2025-06-07 15:10:28 +10:00
DecDuck c3005813a2 Fix: Server attempts to create setup executable and finds undefined #83 (#84) 2025-06-06 09:18:58 +10:00
DecDuck 9e929ddf98 Better metadata editing division #79 (#82)
* feat: new dropdown-based editor switching

* feat: tab based switching

* feat: add icon

* fix: lint

* chore: i18n translations

oh boy was this a 'chore'
2025-06-05 14:53:19 +10:00
Husky 681efe95af i18n Support and Task improvements (#80)
* fix: release workflow

* feat: move mostly to internal tasks system

* feat: migrate object clean to new task system

* fix: release not  getting good base version

* chore: set version v0.3.0

* chore: style

* feat: basic task concurrency

* feat: temp pages to fill in page links

* feat: inital i18n support

* feat: localize store page

* chore: style

* fix: weblate doesn't like multifile thing

* fix: update nuxt

* feat: improved error logging

* fix: using old task api

* feat: basic translation docs

* feat: add i18n eslint plugin

* feat: translate store and auth pages

* feat: more translation progress

* feat: admin dash i18n progress

* feat: enable update check by default in prod

* fix: using wrong i18n keys

* fix: crash in library sources page

* feat: finish i18n work

* fix: missing i18n translations

* feat: use twemoji for emojis

* feat: sanatize object ids

* fix: EmojiText's alt text

* fix: UserWidget not using links

* feat: cache and auth for emoji api

* fix: add more missing translations
2025-06-05 09:53:30 +10:00
Aden Lindsay c7fab132ab Many new improvments and features to the UI (#76)
* feat(general): many new improvments and features to the UI

* fix: fix lints and run preetier

* fix: furthermore fixes

* chore: fix preetier eslint issue

* stlye: reposition mark all as read button for better placement

* fix: fix inccorect positioning on the mark all as read buton, again

* fix: fix account related issue with predefined types and styling

* fix: fix notification button dissapearance & type definition

* fix: fix auth page styling

* stlye: fixed styling on users list

* fix: fix lint dead code collector

* fix: please the prettier gods

* fix(notifications): seriously serialising

* chore: please the prettier gods once again, o holy one

* fix: remove eslint thing, im blaming eslint for that one

---------

Co-authored-by: Aden <aden@adenmgb.com>
2025-06-04 13:56:23 +10:00
DecDuck 4f8ea3e4ff Custom readValidatedBody util to return more specific error #69 (#78)
* feat: add readDropValidatedBody w/ special handler for ArkErrors

* fix: lint
2025-06-03 17:40:41 +10:00
DecDuck f264fd0971 Fix: Importing without Metadata is broken. #73 (#75)
* fix: manual metadata import

* fix: lint
2025-06-03 10:49:01 +10:00
DecDuck 8a354f0674 Fix admin library page "to import" logic #70 (#71) 2025-06-02 12:06:57 +10:00
DecDuck 3f78b6c94e Cannot create library source due to backend missing from request #67 (#68) 2025-06-02 11:05:36 +10:00
DecDuck 2056871dc9 Add UI for multi-library management #59 (#63)
* feat: add ui for library source management

* fix: lint
2025-06-01 18:33:42 +10:00
DecDuck 40e66def1e Multi-upload to image library #56 (#60)
* feat: support for file upload handler to track multiple files

* feat: update image upload endpoint to allow multiple files

* fix: lint
2025-06-01 16:06:56 +10:00
DecDuck 3e5c3678d5 Database-level multi-library support #48 (#58)
* feat: start of library backends

* feat: update backend routes and create initializer

* feat: add legacy library creation

* fix: resolve frontend type errors

* fix: runtime errors

* fix: lint
2025-06-01 16:05:05 +10:00
DecDuck 490afd0bb7 Fix GiantBomb metadata #61 (#62)
* fix: reviews error

* fix: lint
2025-06-01 15:39:10 +10:00
DecDuck 3fbe514f65 feat: ratings ui, import giantbomb ratings 2025-05-30 22:07:50 +10:00
Huskydog9988 185f37f135 fix: release workflow 2025-05-30 19:01:39 +10:00
DecDuck 6cc7e10fcd fix: remove old validation on version import 2025-05-30 13:18:35 +10:00
DecDuck 85edc4cca2 chore: move more admin over to arktype validators 2025-05-30 13:17:21 +10:00
DecDuck 83a9b22d82 fix: various fixes 2025-05-30 10:29:55 +10:00
DecDuck fca85633c1 chore: remove old playtime api 2025-05-30 08:41:50 +10:00
DecDuck 83a0ef2240 Merge branch 'Huskydog9988-more-fixes' into develop 2025-05-30 08:40:42 +10:00
DecDuck 925f3cb4f0 chore: remove const 2025-05-30 08:39:58 +10:00
DecDuck 2b61e9a371 chore: add DROP_VERISON constant 2025-05-30 08:39:43 +10:00
Huskydog9988 4f789a2e5b feat: cleanup extra metadata 2025-05-29 17:27:03 -04:00
Huskydog9988 d1c09784a4 fix: remove unused favicon ref 2025-05-29 17:07:30 -04:00
Huskydog9988 37fa9537d0 feat: object cleanup is finally here 2025-05-29 16:55:24 -04:00
Huskydog9988 f97a968e0d fix: not being able to edit game title 2025-05-29 15:59:53 -04:00
Huskydog9988 59b77b5a5e fix: allow specifying git ref 2025-05-29 15:22:12 -04:00
Huskydog9988 ad2c0f982a feat: add attestations to docker images
attestations are best practice https://docs.docker.com/build/ci/github-actions/attestations/
2025-05-29 14:26:15 -04:00
Huskydog9988 04d5ad0519 fix: compose not following node best practices 2025-05-29 14:18:57 -04:00
Huskydog9988 f08e1b40c3 fix: git install in docker 2025-05-29 14:18:19 -04:00
Husky dc982df96b Merge branch 'develop' into more-fixes 2025-05-29 13:58:27 -04:00
Huskydog9988 d99c648259 fix: accidental removal of nightly tag 2025-05-29 13:54:14 -04:00
Huskydog9988 233324d6fb feat: supply drop version during release build 2025-05-29 13:52:32 -04:00
Huskydog9988 15806a3c9f feat: allow clients to fetch drop version 2025-05-29 13:29:19 -04:00
DecDuck c5f8b44537 fix: metadata update errors 2025-05-29 17:36:52 +10:00
DecDuck ea90a7f086 fix: blade's metadata issue 2025-05-29 17:28:49 +10:00
Huskydog9988 be793ce0f7 fix: use ghcr instead of docker registry 2025-05-28 12:15:23 -04:00
DecDuck 093bb60eb2 chore: add DROP_VERISON constant 2025-05-28 15:07:11 +10:00
Husky ddaba898ee Merge branch 'develop' into more-fixes 2025-05-27 15:17:42 -04:00
Huskydog9988 0816d2ab3e fix: info leak in screenshots api 2025-05-27 15:14:50 -04:00
Huskydog9988 4b009f1aca feat: basic playtime backend 2025-05-27 12:30:20 -04:00
DecDuck 79a23ae1c6 Merge pull request #46 from Pacodastre/fix-docker-compose-image
Fixes wrong image being used in deploy-template example
2025-05-25 07:16:14 +10:00
Francois Ribemont 0719ffe0fa Fixes wrong image being used in example 2025-05-24 21:11:51 +01:00
Huskydog9988 21eec081ee fix: missing user check in screenshot api endpoint 2025-05-15 18:28:08 -04:00
Huskydog9988 4fbc730490 chore: style 2025-05-15 17:29:43 -04:00
Huskydog9988 a89c657fe1 feat: very basic screenshot api 2025-05-15 15:51:35 -04:00
Huskydog9988 831b20d737 fix: remove old requiredPerms field 2025-05-15 14:42:40 -04:00
Huskydog9988 59c3b9b76e fix: don't send system notifications to all users 2025-05-15 13:53:05 -04:00
Huskydog9988 bee3b0c588 fix: drop update notifications 2025-05-15 13:45:05 -04:00
Huskydog9988 1165d86c2c Merge remote-tracking branch 'origin/develop' into more-fixes 2025-05-15 13:38:46 -04:00
DecDuck ce27f76856 fix: openid redirect auth query 2025-05-15 21:22:24 +10:00
DecDuck 8e3ae01a30 feat: backend inline capability registration 2025-05-15 16:06:03 +10:00
DecDuck 6dad3aeab7 chore: style 2025-05-15 14:58:01 +10:00
DecDuck 1d141c117b fix: apply notification acls to live notifications 2025-05-15 14:57:16 +10:00
DecDuck 1dba112bce feat: separate library and metadata pages, notification acls 2025-05-15 14:55:05 +10:00
Huskydog9988 9d2aded70f feat: add acl to notifications
not sure if i got all the acls of the different notifications down rn, but it seems to be about right
2025-05-14 22:53:09 -04:00
Huskydog9988 82b123a345 fix: gamerating model 2025-05-14 22:13:53 -04:00
Huskydog9988 a34f10d9b9 feat: igdb tag support 2025-05-14 22:03:32 -04:00
Huskydog9988 9bf36c8737 feat: pcgamgingwiki desc in searchstub 2025-05-14 21:52:32 -04:00
Huskydog9988 bea26a9a6d feat: game metadata rating support 2025-05-14 21:40:25 -04:00
Huskydog9988 6df2ef1740 fix: igdb assuming certain values always exist 2025-05-14 21:38:16 -04:00
Huskydog9988 56e1ba64ed fix: check update not using drop's correct version 2025-05-14 19:54:06 -04:00
Huskydog9988 898516b33d chore: style 2025-05-14 18:27:31 -04:00
Huskydog9988 2cc3f1329c feat: fs object metadata cache and validation 2025-05-14 17:19:51 -04:00
Huskydog9988 b551788c4c fix: object fs backend not deleting metadata 2025-05-14 16:51:45 -04:00
Huskydog9988 ccdbbcf01c fix: editing game image metadata in admin panel 2025-05-14 16:30:35 -04:00
Huskydog9988 b033496710 feat: update checker based gh releases 2025-05-14 16:07:25 -04:00
Huskydog9988 a101ff07c4 fix: allow notification nonce reuse per user 2025-05-14 15:40:55 -04:00
DecDuck 086664adfd Update README.md 2025-05-12 17:11:19 +10:00
DecDuck ce0e21be9a Update README.md 2025-05-12 17:10:36 +10:00
Huskydog9988 dad2161754 feat: games now have tag support 2025-05-11 12:52:00 -04:00
Huskydog9988 a8ee27eea9 feat: pcgamgingwiki now provides a description 2025-05-11 00:35:16 -04:00
Huskydog9988 1bbdf46a0e feat: better docker builds 2025-05-10 23:49:58 -04:00
Huskydog9988 fc74738643 feat: new unified data folder 2025-05-10 16:18:28 -04:00
Huskydog9988 60d22ea280 fix: back button link in admin dash 2025-05-10 16:02:44 -04:00
Huskydog9988 3df6818ffe feat: openapi support plus more api validation 2025-05-10 15:16:26 -04:00
DecDuck a0bc4bbc4c feat: refactored into separate metadata and library pages 2025-05-10 15:22:57 +10:00
DecDuck 90277653cb feat: rework developer/publisher system 2025-05-10 11:59:56 +10:00
DecDuck ac355918ed Merge branch 'Huskydog9988-further-improvements' into develop 2025-05-10 11:26:16 +10:00
DecDuck d6830c3428 feat: update search style 2025-05-10 11:25:45 +10:00
Huskydog9988 cbf480bef9 fix: pcgamingwiki not parsing company websites 2025-05-10 11:25:45 +10:00
Huskydog9988 afaaaf2eb5 feat: unified company metadata store
still need to migrate users from old developer and publisher tables
2025-05-10 11:25:45 +10:00
Huskydog9988 14f0833d17 feat: finish migrating to new objectid naming 2025-05-10 11:25:45 +10:00
Huskydog9988 7f7d8c8f45 fix: linting errors 2025-05-10 11:25:45 +10:00
Huskydog9988 52a7de0a8b feat: minimum support for unrefed object cleanup 2025-05-10 11:25:45 +10:00
Huskydog9988 dbded55113 feat: identify unused objects 2025-05-10 11:25:44 +10:00
Huskydog9988 aa3105aecd feat: manually edit search term for game import 2025-05-10 11:25:44 +10:00
Huskydog9988 0c48d42c2d fix: missing metadata preventing game import
when a metadata provider fails to import a game's developer / publisher, the import is no longer blocked. the imports usally fail because there isn't a page for these compaines
2025-05-10 11:25:44 +10:00
Huskydog9988 836ba33fe4 feat: basic screenshot manager 2025-05-10 11:25:44 +10:00
DecDuck 1f41e52a86 feat: update search style 2025-05-10 11:24:04 +10:00
Huskydog9988 17e4734cfb fix: pcgamingwiki not parsing company websites 2025-05-08 21:22:15 -04:00
Huskydog9988 b681476373 feat: unified company metadata store
still need to migrate users from old developer and publisher tables
2025-05-08 20:44:37 -04:00
DecDuck 3a9eb82fdf fix: fix invitation register url 2025-05-09 10:02:48 +10:00
Huskydog9988 7e5e7b032b feat: finish migrating to new objectid naming 2025-05-08 19:42:46 -04:00
Huskydog9988 df291c3e9a fix: linting errors 2025-05-08 19:26:46 -04:00
Huskydog9988 bf691a7f5c feat: minimum support for unrefed object cleanup 2025-05-08 19:20:34 -04:00
Huskydog9988 597a2264e8 feat: identify unused objects 2025-05-08 19:19:10 -04:00
Huskydog9988 1a2d3c8207 feat: manually edit search term for game import 2025-05-08 12:16:12 -04:00
Huskydog9988 471e85d7c6 fix: missing metadata preventing game import
when a metadata provider fails to import a game's developer / publisher, the import is no longer blocked. the imports usally fail because there isn't a page for these compaines
2025-05-08 11:57:37 -04:00
Huskydog9988 f9f437dd85 feat: basic screenshot manager 2025-05-08 11:38:09 -04:00
DecDuck 143846c48a fix: revert session store 2025-05-08 21:46:12 +10:00
DecDuck 2fb909f73d Revert "fix: convert socket sessions to cacheHandler"
This reverts commit 733aee3977.
2025-05-08 21:43:54 +10:00
DecDuck 0f773a9779 fix: docker build 2025-05-08 21:30:52 +10:00
DecDuck 92a98a5984 fix: add prisma binary targets 2025-05-08 20:21:50 +10:00
DecDuck 464af37afb chore: warn when metadata fails 2025-05-08 19:49:37 +10:00
DecDuck f8dc3fef55 fix: swap order of nuxt and prisma generations 2025-05-08 17:35:59 +10:00
DecDuck 6d35e2697d fix: switch prisma schema type 2025-05-08 17:33:07 +10:00
DecDuck 0d02be2392 fix: refactor prisma multifolder into docs example 2025-05-08 16:25:01 +10:00
DecDuck 48f796ae4b fix: update prisma schema and path 2025-05-08 16:20:19 +10:00
DecDuck 125fe9e6e2 fix: remove jank prisma script, and move to generated prisma client 2025-05-08 16:17:23 +10:00
DecDuck 29f3094ad4 Merge branch 'Huskydog9988-more-stuff' into develop 2025-05-08 15:50:47 +10:00
DecDuck 733aee3977 fix: convert socket sessions to cacheHandler 2025-05-08 15:50:29 +10:00
DecDuck e3ed60feae feat: add oidc to admin panel 2025-05-08 15:48:46 +10:00
DecDuck bfa2c0a641 feat: add oidc to admin panel 2025-05-08 15:29:50 +10:00
Huskydog9988 952df560ec chore: remove fsbackend console logs 2025-05-07 22:32:24 -04:00
Huskydog9988 1db2229ad3 fix: edgecase where object hash isn't read 2025-05-07 22:29:10 -04:00
Huskydog9988 731499be81 feat: unified cache handler 2025-05-07 22:26:34 -04:00
Huskydog9988 5aa0899bcf docs: why timeline was disabled 2025-05-07 21:45:13 -04:00
Huskydog9988 30b065dde3 fix: eslint error and server plugin name 2025-05-07 18:50:57 -04:00
Huskydog9988 1f510bee57 Merge branch 'develop' of https://github.com/Huskydog9988/drop into more-stuff 2025-05-07 18:45:36 -04:00
Huskydog9988 07b34c874d refactor: homepage link in header 2025-05-07 18:42:13 -04:00
DecDuck 19ff73cc30 feat: oidc 2025-05-07 22:14:04 +10:00
DecDuck e8633ceca2 fix: signout, again 2025-05-07 12:26:22 +10:00
DecDuck 770294d559 fix: ignore error if we are unable to blacklist certificate 2025-05-07 12:16:09 +10:00
DecDuck c0c55d35f4 fix: signout route 2025-05-07 11:33:21 +10:00
DecDuck a47debda91 fix: notification rendering 2025-05-07 09:54:02 +10:00
Huskydog9988 c449b45009 chore: remove redundant omitApi prisma option 2025-04-24 18:34:20 -04:00
Huskydog9988 f1f19c8263 feat: run tasks at startup 2025-04-23 21:14:16 -04:00
DecDuck 31ad8505b7 fix: task api and other small issues 2025-04-20 23:34:22 +10:00
DecDuck feedcfc5c4 fix: metadata init issues 2025-04-20 23:24:08 +10:00
DecDuck a5facbd648 fix: misc fixes 2025-04-20 21:33:19 +10:00
DecDuck 3b1d04251c feat: log metadata error if fail 2025-04-20 21:23:09 +10:00
DecDuck fd4ec3fd1c Update release.yml 2025-04-20 20:43:01 +10:00
DecDuck 0a270b267c fix: prisma migrations in docker
i hate prisma so so so so so much
2025-04-20 18:12:29 +10:00
DecDuck ec6d38d7af fix: copy package.json to Dockerfile 2025-04-19 21:51:44 +10:00
DecDuck a9d8ddc0f5 fix: prisma schema folder location 2025-04-19 21:51:22 +10:00
DecDuck dada379354 Merge pull request #37 from Huskydog9988/eslint
feat: add eslint and prettier
2025-04-19 11:40:21 +10:00
Huskydog9988 86c7aa33ce fix: don't set own script csp 2025-04-17 20:57:27 -04:00
Huskydog9988 26abb75e94 ci: add prefix to branch based docker tags 2025-04-17 20:18:21 -04:00
Huskydog9988 8eec8b19dd fix: userwidget not opening 2025-04-17 20:17:31 -04:00
Huskydog9988 582acfb385 fix: missing components errors 2025-04-16 12:03:42 -04:00
Huskydog9988 456902c784 fix: type error in $dropFetch 2025-04-15 22:01:24 -04:00
Huskydog9988 87215c4a1e chore: prettier pass 2025-04-15 21:46:34 -04:00
Huskydog9988 d361e01eef fix: last eslint errors 2025-04-15 21:43:27 -04:00
Huskydog9988 8e109dd562 fix: more eslint stuff 2025-04-15 21:10:45 -04:00
Huskydog9988 8f429e1e56 fix: eslint errors, switch to using maps 2025-04-15 20:04:45 -04:00
Huskydog9988 e362f732e7 fix: more eslint issues 2025-04-13 22:10:28 -04:00
Huskydog9988 86c2d00726 feat: add lint ci job 2025-04-13 21:46:41 -04:00
Huskydog9988 d4b89b5dc5 fix: inital eslint errors 2025-04-13 21:44:29 -04:00
Huskydog9988 ff1255f948 feat: add eslint and prettier 2025-04-13 21:43:35 -04:00
DecDuck 96742cc918 Merge branch 'Huskydog9988-more-ui-work' into develop 2025-04-14 10:54:09 +10:00
DecDuck c2bb835b0f fix: etags and other
remove sanitize-filename because IDs are internally generated
remove pulse animation on NO GAME cards
add migration
refactors to be inline with other stuff
2025-04-14 10:52:12 +10:00
Huskydog9988 f384492ed2 fix: missing key in loops 2025-04-12 16:03:35 -04:00
Huskydog9988 22a7cfa544 feat: save fs objectbackend hashes 2025-04-12 15:54:26 -04:00
Huskydog9988 228d109692 fix: incorrect perms when deleting objects 2025-04-11 19:32:30 -04:00
Huskydog9988 dc89ff95d8 feat: make internal objectbackend methods private 2025-04-10 19:57:08 -04:00
Huskydog9988 04c56fd985 chore: update @types/bcryptjs 2025-04-10 19:50:37 -04:00
Huskydog9988 ca03be7f43 fix: don't add write perms, users can only delete objects 2025-04-10 19:50:04 -04:00
Huskydog9988 35a2d98790 fix: don't use stream package 2025-04-10 19:29:11 -04:00
Huskydog9988 c4d8b24295 feat: hash objects for etag value 2025-04-09 14:48:13 -04:00
DecDuck 42349ad4e1 feat: allow client-based web tokens 2025-04-08 16:16:40 +10:00
Huskydog9988 e7566a6316 feat: upgrade to nuxt 3.16 2025-04-07 21:55:52 -04:00
Huskydog9988 fdffd9a32a feat: add skeleton for loading game carousel 2025-04-07 21:28:58 -04:00
Huskydog9988 4c3413ae63 feat: add nonce to scripts 2025-04-07 20:01:57 -04:00
Huskydog9988 30e3e7289a chore: drop unused dep 2025-04-07 19:57:47 -04:00
Huskydog9988 12ba416ca5 feat: enable nuxt dev tools 2025-04-07 19:57:00 -04:00
Huskydog9988 e4aeaee6e7 refactor: move tsconfig to nuxt config 2025-04-07 19:55:33 -04:00
Huskydog9988 9d943bc5dc feat: add etag to object response 2025-04-07 19:19:45 -04:00
Huskydog9988 66d1413eb5 fix: gamecarousel layout shifts (mostly) 2025-04-07 17:28:40 -04:00
Huskydog9988 e572b61af9 fix: gamecarousel not resizing 2025-04-07 16:57:44 -04:00
Huskydog9988 f9b774ddb5 fix: wordmark causing page refresh 2025-04-07 16:49:56 -04:00
Huskydog9988 106b3f66a4 feat: sleak transition from store page to item 2025-04-07 16:17:55 -04:00
Huskydog9988 657fd50702 fix: missing html attributes 2025-04-07 16:13:57 -04:00
Huskydog9988 7400fae11b fix: use nuxtlink instaed of a tag 2025-04-07 16:11:56 -04:00
DecDuck 043ef6dcd2 fix: remove debug values from game carousel 2025-04-07 17:44:48 +10:00
DecDuck 6ea50bffc8 fix: store page released date 2025-04-07 16:55:01 +10:00
DecDuck 9584d69e97 fix: add tsignore pending upstream fix 2025-04-07 10:52:56 +10:00
DecDuck 5ceff44993 Merge branch 'Huskydog9988-more-fixes' into develop 2025-04-07 10:40:20 +10:00
DecDuck 372a9bdd97 fix: devices page (reactivity and relative timestamps) 2025-04-07 10:37:01 +10:00
Huskydog9988 fe82c78571 refactor: remove momentjs 2025-04-06 19:44:38 -04:00
Huskydog9988 fd11d41dc5 chore: updates prisma and bycryptjs 2025-04-06 14:34:25 -04:00
Huskydog9988 9242a810b0 fix: don't prerender auth routes 2025-04-06 14:28:03 -04:00
Huskydog9988 0b9d0a4ad9 fix: don't use npm crypto 2025-04-06 14:27:31 -04:00
Huskydog9988 17d3e0ef54 refactor: use node crypto uuid 2025-04-06 14:08:36 -04:00
Huskydog9988 4fd2b159a6 fix: type error in devices page 2025-04-06 13:47:55 -04:00
Huskydog9988 d6d457f999 fix: generate prisma types on install (like nuxt) 2025-04-06 13:46:53 -04:00
DecDuck 54b3bc3a7e fix: devices page for mobile 2025-04-05 23:30:38 +11:00
DecDuck 2cbee3d495 feat: add ability to review and revoke clients 2025-04-05 17:42:32 +11:00
DecDuck 7263ec53ac fix: remove weird import 2025-04-05 15:38:07 +11:00
DecDuck 0edfdbdfce fix: return user library for client 2025-04-05 15:34:24 +11:00
DecDuck 114d235a6a fix: remove legacy metadata client routes 2025-04-05 15:34:12 +11:00
DecDuck a47615a274 refactor: move game id fetch to index 2025-04-05 15:33:59 +11:00
DecDuck 1987c578bc Merge branch 'Huskydog9988-better-ci' into develop 2025-04-05 14:22:38 +11:00
DecDuck b2327b21fe Merge branch 'better-ci' of https://github.com/Huskydog9988/drop into Huskydog9988-better-ci 2025-04-05 14:22:21 +11:00
DecDuck b22681c555 fix: fix types, remove @nuxt/image because of broken types 2025-04-05 14:21:37 +11:00
Huskydog9988 931913b836 ci: drop PAT_TOKEN 2025-04-04 19:19:33 -04:00
Huskydog9988 2be0e2f88c ci: add typecheck ci 2025-04-04 19:15:05 -04:00
Huskydog9988 7df175b747 ci: update actions versions 2025-04-04 19:03:38 -04:00
Huskydog9988 b6d05a6d09 ci: don't mark nightly container as latest 2025-04-04 18:59:18 -04:00
Huskydog9988 8d88728c99 feat: typecheck in dev 2025-04-04 18:52:34 -04:00
Huskydog9988 7141735664 fix: auth prerender 2025-04-04 18:51:01 -04:00
DecDuck 82baeb909a feat: add yarn typecheck and fix all types 2025-04-05 09:40:05 +11:00
DecDuck 2a85322f64 Merge branch 'Huskydog9988-db-store' into develop 2025-04-04 10:37:08 +11:00
DecDuck 088cb68604 chore: apply schema changes to db 2025-04-04 10:34:58 +11:00
Huskydog9988 81be7ccf58 Merge remote-tracking branch 'origin/develop' into db-store 2025-04-03 19:21:05 -04:00
Huskydog9988 a9d1a442f6 refactor: session handler 2025-04-03 19:15:33 -04:00
Huskydog9988 97043d6366 fix: register page validation 2025-04-03 19:11:35 -04:00
Huskydog9988 756bf8f93f fix: add missing dev deps 2025-04-03 18:15:39 -04:00
Huskydog9988 9dc35c80c5 Merge branch 'develop' into db-store 2025-04-03 18:12:07 -04:00
Huskydog9988 0f35d4a445 feat: cache for session store in db 2025-04-01 21:32:13 -04:00
DecDuck 57f50b0306 fix: renable nuxt-security with xss validator off 2025-04-01 21:20:54 +11:00
DecDuck 065951d91f fix: update last accessed client on push 2025-04-01 21:16:54 +11:00
DecDuck 36e6c92938 feat: add cloud save backend 2025-04-01 21:08:57 +11:00
DecDuck e7109e58bb feat: update readme 2025-04-01 18:36:51 +11:00
DecDuck 17372a9c06 feat: account pages framework & updates to library 2025-04-01 18:28:34 +11:00
DecDuck d7297707d7 fix: register redirect 2025-04-01 18:18:57 +11:00
DecDuck c809c8fcbf fix: re-request fix for $dropFetch 2025-04-01 16:58:53 +11:00
DecDuck 68f5f88347 fix: carousel pagination 2025-04-01 16:42:08 +11:00
DecDuck 6f8e28d711 fix: sidebar in library page 2025-04-01 16:19:03 +11:00
DecDuck 47dc364d4e Merge branch 'develop' of https://github.com/AdenMGB/drop into AdenMGB-develop 2025-04-01 12:11:57 +11:00
DecDuck 3b4f940983 feat: slight optimisation with removing from collection 2025-04-01 12:08:39 +11:00
DecDuck 1048653eef fix: $dropFetch SSR and rate limiting 2025-04-01 12:02:34 +11:00
DecDuck f1c932b7d7 fix: remove previous fix and add longer yarn install timeout 2025-03-31 12:35:34 +11:00
DecDuck 7c420ba7d7 fix: revert previous and add yarn clean/configs 2025-03-31 12:24:50 +11:00
DecDuck 7974361e5b fix: potential fix for timeout: switch to full image from slim 2025-03-31 12:18:14 +11:00
DecDuck 01171d788c fix: pin nuxt to 3.15.4 and recreate lockfile 2025-03-31 11:50:15 +11:00
DecDuck eec709a6e9 fix: recreate lockfile 2025-03-31 11:37:09 +11:00
DecDuck 5384759261 fix: update workflow to recurse submodules properly 2025-03-31 09:47:54 +11:00
DecDuck e3022bc52b fix: add submodules 2025-03-31 09:38:58 +11:00
DecDuck c7af02c15e fix: update dockerfile & use NPM droplet 2025-03-31 09:32:09 +11:00
DecDuck 96a1199fff fix: update dockerfile to debian 12 2025-03-27 11:09:37 +11:00
DecDuck 2cfc2cee7c Merge pull request #29 from Huskydog9988/patch-1
nightly builds and fix drop repo
2025-03-27 09:22:31 +11:00
Husky f5e52321b8 nightly builds and fix drop repo 2025-03-26 18:20:37 -04:00
DecDuck 58d558159d feat: github build 2025-03-27 09:16:22 +11:00
DecDuck e4e1c66bca fix: public assets 2025-03-24 12:55:07 +11:00
DecDuck 1996b97e99 refactor: use hash directly in authmek and version field on authmek 2025-03-24 12:50:21 +11:00
DecDuck cb4937b590 Merge pull request #28 from Huskydog9988/auth-overhaul
overhaul auth and futureproof it with argon2
2025-03-24 12:27:14 +11:00
Huskydog9988 57042892c4 move register to auth path 2025-03-23 21:08:08 -04:00
Huskydog9988 1f309606c9 address some issues 2025-03-23 21:07:12 -04:00
Huskydog9988 f9e6702d40 Merge branch 'develop' into auth-overhaul 2025-03-23 20:33:46 -04:00
Huskydog9988 690aa042df switch back to json 2025-03-23 20:29:50 -04:00
DecDuck 87f01a9984 Merge pull request #26 from Huskydog9988/perf-fixes
massive perf improvements
2025-03-23 10:56:35 +11:00
Huskydog9988 c1272dc7a7 use arktype for clientside validation 2025-03-22 19:37:28 -04:00
Huskydog9988 257cdacad4 make signup less error prone in db 2025-03-22 17:26:12 -04:00
Huskydog9988 2c9fdebf25 new accounts use argon2 2025-03-22 17:09:10 -04:00
Huskydog9988 2027c69c0e fix signout 2025-03-22 16:55:08 -04:00
Huskydog9988 e08a13f2c3 add sharp for ipx 2025-03-22 15:58:53 -04:00
Huskydog9988 6ed7e76b17 move auth pages into auth dir 2025-03-22 15:54:43 -04:00
DecDuck 573bf87cbb Merge pull request #27 from Huskydog9988/cleanup-platform-parse
fix: platformparse case sensitivity
2025-03-20 23:10:28 +00:00
Husky e8afa274a7 fix: platformparse case sensitivity 2025-03-20 17:52:04 -04:00
Husky d4d1eaf2e2 Merge branch 'develop' into perf-fixes 2025-03-16 12:16:47 -04:00
DecDuck 6918e78cf9 fix: macos and rate limiting 2025-03-15 15:04:52 +11:00
Husky cd93ba2197 massive perf improvements
on the store page, brings LCP down to only 5.6s from 11s. total lighthouse score is now 78
2025-03-14 20:18:26 -04:00
Aden Lindsay c052511ff3 fix(library): Use $dropFetch util 2025-03-15 09:54:20 +10:30
Aden Lindsay 19d1a9dd0e style(library): complete restyling to match client library 2025-03-15 09:46:15 +10:30
Aden Lindsay 66400f4875 fix(webui): Fix forcably redirecting to https 2025-03-15 09:45:09 +10:30
Huskydog9988 88a5dc2a58 add migrations to store ca and session in db 2025-03-14 11:37:31 -04:00
Huskydog9988 cf0af15854 store sessions in db 2025-03-14 11:35:12 -04:00
Huskydog9988 61764e81b8 store certs in db 2025-03-14 10:53:37 -04:00
DecDuck 98c8258127 fix?: https redirection issues 2025-03-14 20:31:00 +11:00
DecDuck 3527f678e5 fix: remove @nuxt/content 2025-03-14 13:23:56 +11:00
DecDuck fce084f95a Merge branch 'Huskydog9988-perf-improvements/fetch' into develop 2025-03-14 13:16:55 +11:00
DecDuck 1ad1ebb3fd merge: husky updates 2025-03-14 13:16:26 +11:00
DecDuck 1de9ebdfa5 feat: refactor news and migrate rest of useFetch to $dropFetch 2025-03-14 13:12:04 +11:00
DecDuck bd1cb67cd0 feat: user page & $dropFetch util 2025-03-14 12:22:08 +11:00
DecDuck 3225f536ce feat: lazy init igdb 2025-03-13 16:18:44 +11:00
DecDuck 58f91f4ac4 Merge branch 'Huskydog9988-metadata-improvements' into develop 2025-03-13 15:55:09 +11:00
DecDuck 8fc37936dc Merge branch 'metadata-improvements' of https://github.com/Huskydog9988/drop into Huskydog9988-metadata-improvements 2025-03-13 15:54:51 +11:00
DecDuck 0ca9a3b2f7 feat: database level metadata provider init 2025-03-13 15:20:13 +11:00
Huskydog9988 f8ae5b70c0 automate twitch credential refresh 2025-03-12 19:06:52 -04:00
Huskydog9988 7a3b30b012 accidently commited secret from testing lol (revoked) 2025-03-12 19:06:52 -04:00
Huskydog9988 4e8cffd778 make pcgamig wiki types match api return 2025-03-12 19:06:52 -04:00
Huskydog9988 bf7eb5b986 fix issue in igdb where company isn't found 2025-03-12 19:06:34 -04:00
Huskydog9988 77d06df7d3 fix manual metadata fetching publishers +types 2025-03-12 19:06:34 -04:00
Huskydog9988 2755aa472b in progress igdb 2025-03-12 19:06:34 -04:00
Huskydog9988 2b7bc6965d add content security policy to allow showing remote images for game importing 2025-03-12 19:05:11 -04:00
Huskydog9988 08164cae68 add pcgamingwiki as metadata source 2025-03-12 19:05:11 -04:00
Huskydog9988 2ca96c34f7 note that you need to init submodules 2025-03-12 19:04:32 -04:00
Huskydog9988 4b4e067fac cleanup giantbomb provider 2025-03-12 19:04:32 -04:00
Huskydog9988 d2b485456a gracefully disable metadata provider when api key is missing 2025-03-12 19:04:32 -04:00
quexeky 793b57a163 chore: Update changelog.md 2025-03-12 18:59:59 -04:00
quexeky d9218dea59 fix: Update README.md with discord link 2025-03-12 18:59:59 -04:00
DecDuck 789361ea73 feat: add mac as platform 2025-03-11 19:02:53 +11:00
DecDuck ffc1537d7f feat: partial work on home admin page 2025-03-11 18:25:29 +11:00
DecDuck 9d07070ef6 feat: add news client routes 2025-03-11 18:24:50 +11:00
DecDuck 0f0874c10a feat: file uploads on news articles 2025-03-11 17:51:46 +11:00
DecDuck 137241fdbb fix: notifications and store styling 2025-03-11 17:08:31 +11:00
DecDuck 9515a21dc6 feat: move article creation into a modal 2025-03-11 12:20:56 +11:00
DecDuck c3ee948682 fix: store page styling 2025-03-11 11:47:35 +11:00
DecDuck 9608cc9742 fix: re-enable metadata providers 2025-03-11 11:33:05 +11:00
DecDuck 88aaa2a71b fix: add aarch64 tag to runner 2025-03-11 09:06:41 +11:00
DecDuck 133503582a feat: client collection routes 2025-03-10 12:28:59 +11:00
DecDuck 1eede0f035 fix: news frontend 2025-03-10 12:05:10 +11:00
DecDuck b6f52f660a fix: unmerged changes 2025-03-10 11:42:33 +11:00
DecDuck a1f65b7e59 Merge branch 'AdenMGB-develop' into develop 2025-03-10 11:41:40 +11:00
DecDuck 1ce707788d fix: decduck's code review 2025-03-10 11:39:45 +11:00
DecDuck 31aaec74af feat: migrate to tailwind v4 and fix user token API 2025-03-10 10:35:03 +11:00
DecDuck 97792f0707 fix: home page now (temporarily) redirects to store 2025-03-10 10:34:57 +11:00
DecDuck b6189d12e7 fix(droplet): add aarch64 optional packages 2025-03-10 10:34:32 +11:00
DecDuck 0877638fc4 feat(acls): refactor & acl descriptions 2025-03-10 10:34:32 +11:00
DecDuck 090d2e6586 feat(acls): added backend acls 2025-03-10 10:34:26 +11:00
DecDuck a64a2479ba feat: migrate to tailwind v4 and fix user token API 2025-02-14 20:01:18 +11:00
DecDuck 856babbc21 fix: null strings in setup versions 2025-02-13 13:34:46 +11:00
DecDuck aad5c23f45 fix: import ui setup autocomplete 2025-02-13 13:34:45 +11:00
DecDuck d8d5b938f0 fix: home page now (temporarily) redirects to store 2025-02-08 11:41:16 +11:00
DecDuck 3afd36a821 fix(droplet): add aarch64 optional packages 2025-02-08 11:38:06 +11:00
DecDuck ce8887528f feat(acls): refactor & acl descriptions 2025-02-07 17:26:23 +11:00
DecDuck d4dd259b5f feat(acls): added backend acls 2025-02-04 13:15:52 +11:00
Aden Lindsay 256fbd6afa fix(backend): Add forgotton migration for news storage 2025-02-03 16:50:10 +10:30
Aden Lindsay 9344d94e4c feat(api): Added API for deleting news articles 2025-02-02 10:21:43 +10:30
Aden Lindsay 1286248207 feat(api): Added API for retriving information about a spesific news article 2025-02-02 10:21:10 +10:30
Aden Lindsay 2ef8f2f93c feat(api): Added API for fetching news articles 2025-02-02 10:20:26 +10:30
Aden Lindsay 86053815f0 feat(api): Added API for creating articles 2025-02-02 10:19:31 +10:30
Aden Lindsay 88453f1ec4 feat(backend): Added backend communction between API & Frontend 2025-02-02 10:18:27 +10:30
Aden Lindsay 623ab7d786 feat(DB): Updated DB for news articles to be stored in the DB 2025-02-02 10:17:21 +10:30
Aden Lindsay 1ed15902a3 feat(news): Updated user for authoring articles 2025-02-02 10:16:28 +10:30
Aden Lindsay 3a55075532 feat(news): Created article full screen view 2025-02-02 10:15:09 +10:30
Aden Lindsay 6c7866ad14 feat(news): Created article overview page 2025-02-02 10:10:16 +10:30
Aden Lindsay f78b29b7fd feat(news) Added news page/sidebar 2025-02-02 10:09:25 +10:30
Aden Lindsay d8e964e06b feat(news): Added backend for news 2025-02-02 10:08:34 +10:30
Aden Lindsay 5d8f9d3813 Create useNews.ts 2025-02-02 10:07:24 +10:30
Aden Lindsay 28bf070ce2 feat(news): Added ability to search and filter news articles 2025-02-02 10:06:38 +10:30
Aden Lindsay 866c4d354e feat(news): Created ability to create news articles 2025-02-02 10:05:55 +10:30
Aden Lindsay e7837af0e7 feat(news): added ability to delete news articles 2025-02-02 10:05:13 +10:30
DecDuck 97b9b6dc11 Merge pull request #20 from AdenMGB/develop
Fresh animations & scaled Games Grid view properly
2025-01-30 19:30:21 +11:00
Aden Lindsay 09fd01d9b5 style(store): Added reactive hover state for admin dashboard button 2025-01-28 19:25:00 +10:30
Aden Lindsay 8fbe02a1b7 style(store): hover state for coursel button 2025-01-28 19:24:30 +10:30
Aden Lindsay dce116b66f style(collections): Hover state & scaling games grid properly 2025-01-28 19:23:24 +10:30
Aden Lindsay d167780562 fix(library): Fixed game banner as background, & added hover state 2025-01-28 19:22:29 +10:30
Aden Lindsay 6e057afb6d style(collections): Added hover state & animation for addition icon 2025-01-28 19:20:33 +10:30
Aden Lindsay 1967de72c8 style(GamePanel): New hover state styles 2025-01-28 19:17:12 +10:30
Aden Lindsay bfcc7519bf style(AddLibraryButton): New hover state animations 2025-01-28 19:15:49 +10:30
DecDuck 1a2aca9999 fix: collection overview trash icon 2025-01-28 17:23:06 +11:00
DecDuck 282e5bc2a6 fix: store page styling 2025-01-28 17:21:05 +11:00
DecDuck f369462e7f fix: cascade delete for collection entries 2025-01-28 17:06:30 +11:00
DecDuck 6317ad2657 fix: collection creation & overview hover styles 2025-01-28 17:01:34 +11:00
DecDuck 42ebbf2922 feat: collection deleting 2025-01-28 16:50:57 +11:00
DecDuck 7c1dec9401 fix: store style & library game page 2025-01-28 16:39:13 +11:00
DecDuck ecd26a42a8 feat: mobile ui and other design 2025-01-28 16:24:08 +11:00
DecDuck cf0aa948fe feat: refactor & redesign parts of UI 2025-01-28 16:24:08 +11:00
DecDuck 934c176974 refactor(create collection modal): use ModalTemplate & v-model 2025-01-28 16:24:08 +11:00
Aden Lindsay eea8f82bf9 squash: AdenMGB collection design & backend work
Update index.post.ts to implement saving collections functionality

Update index.get.ts to verify if collection exists and if user can access it

Update index.delete.ts to ask questions and not be so nonchalant

Update entry.post.ts

Update entry.delete.ts to do it better

Update index.vue to add functionality to the add to library button + fidgit with image

Update index.vue to also add add to library functionality, but no fidget :(

Update entry.post.ts to infact not remove it

Update index.ts

Update index.vue to manage collections from store page

Update index.ts to restrut for ahhhh

Update index.vue too add collection control to carosel

Update index.vue fix minor issue

Update index.vue to fix dropdown modal bug

Create library.vue for page layout

Create index.vue for library game details pane

Create index.vue for viewing collections pane

Create DeleteCollectionModal.vue component

Create CreateCollectionModal.vue component

Update AddLibraryButton.vue with dropdown :D

Update index.vue to use new components

Update index.vue for more components :O

Update entry.post.ts to not not return success, it'll figure it out

Update entry.delete.ts to not return...
2025-01-28 16:24:02 +11:00
Aden Lindsay 892f64fe3a Create signout.vue to sign out :shocked: 2025-01-28 16:19:41 +11:00
DecDuck 6bc3173d3a Merge branch 'backslash-fix' into develop 2025-01-28 15:20:30 +11:00
DecDuck 93a58c0d04 fix: import ui setup autocomplete 2025-01-28 15:20:06 +11:00
quexeky 3298b5f3ee Edit .gitlab-ci.yml 2025-01-26 12:21:38 +00:00
quexeky 6d03266ade Edit .gitlab-ci.yml 2025-01-26 12:17:19 +00:00
quexeky 1b3cf498f4 Edit .gitlab-ci.yml 2025-01-26 12:14:22 +00:00
quexeky 0bfe9803ac Edit .gitlab-ci.yml 2025-01-26 12:13:21 +00:00
quexeky 617278281e Edit .gitlab-ci.yml 2025-01-26 12:12:54 +00:00
quexeky 994db6c26a Edit .gitlab-ci.yml 2025-01-26 12:11:34 +00:00
quexeky 9f456cec9d chore: Update changelog.md 2025-01-25 22:49:06 +11:00
quexeky a95be39c17 Merge pull request #18 from Drop-OSS/develop
Merge develop into main
2025-01-25 19:27:22 +11:00
DecDuck 36776cc61e fix(prisma): update prisma schemas 2025-01-19 16:46:43 +11:00
DecDuck a309651fe4 feat(collections): backend 2025-01-19 16:29:29 +11:00
DecDuck 716eac79bf cicd: custom dind 2025-01-14 20:43:50 +11:00
DecDuck f3ed0f6430 feat(tasks): improved ux 2025-01-14 20:43:22 +11:00
quexeky c6bb21d9ee fix: Update README.md with discord link 2025-01-08 22:43:30 +00:00
DecDuck c7eb11a836 fix(invitations): fix always being created as admin 2025-01-05 22:21:55 +11:00
DecDuck 39d7ce7d1b feat(import): overhauled version importing 2024-12-31 00:04:50 +11:00
DecDuck 02d6346b01 fix(utils): fix recursive dirs util 2024-12-31 00:04:14 +11:00
DecDuck a8f21068fc fix(tasks): fix disconnect code 2024-12-31 00:03:56 +11:00
DecDuck 2cfe75a551 feat(metadata): change name, description and icon 2024-12-30 14:17:27 +11:00
DecDuck 5a1f8411de feat(game panel): adjust gradient 2024-12-29 19:20:17 +11:00
DecDuck a86045c307 feat(carousel ui): add aden's carousel pagination design 2024-12-29 19:08:18 +11:00
DecDuck db103de24d fix(ci/cd): recurse submodules 2024-12-27 20:31:06 +11:00
DecDuck e505e58192 feat(admin ui): add modifying game descriptions 2024-12-27 19:52:59 +11:00
DecDuck b75ebd13b7 fix(drop-base): add drop-base as git submodule 2024-12-27 16:36:37 +11:00
DecDuck 937954fa02 feat(admin ui): customisable image carousel and new layout 2024-12-27 14:43:40 +11:00
DecDuck 43e32b44a2 fix(mail regex): removed global flag 2024-12-27 13:14:29 +11:00
DecDuck 61d88c3091 fix(callback ui): fix width of token breaking things 2024-12-27 13:07:29 +11:00
DecDuck 12e312593e feat(client ui): manual handshake 2024-12-27 13:07:29 +11:00
DecDuck 4f9b94921a feat(ui): add noWrapper option 2024-12-27 13:07:29 +11:00
quexeky 0a5a649cfe fix(account creation): Fix username length requirement
Signed-off-by: quexeky <git@quexeky.dev>
2024-12-27 08:17:03 +11:00
DecDuck 2f52a16d52 feat(metadata): 'manual' metadata provider 2024-12-26 19:54:49 +11:00
DecDuck 38fc6b81df feat(loading button): add disabled state 2024-12-26 19:38:48 +11:00
DecDuck 28baabc122 feat(store ui): 'no images' slide on image carousel 2024-12-26 19:37:44 +11:00
DecDuck 9b12d4576c feat(object transactions): support more types 2024-12-26 19:37:21 +11:00
DecDuck e5cf13fd93 feat(admin ui): mobile nav 2024-12-26 19:36:40 +11:00
DecDuck dbb315a8d7 fix(deploy template): fix FATAL: "root"... message 2024-12-26 12:34:10 +11:00
DecDuck 2c19e13c09 feat(admin ui): improve feedback when metadata fails 2024-12-25 23:36:39 +11:00
DecDuck fe9373af78 feat(version auto detection): add .sh for linux 2024-12-25 23:19:36 +11:00
quexeky eadcaa1b05 chore(changelog): Update changelog
Signed-off-by: quexeky <git@quexeky.dev>
2024-12-25 11:39:25 +11:00
quexeky 5f29c28e04 docs(version): Version bump
Signed-off-by: quexeky <git@quexeky.dev>
2024-12-25 11:19:31 +11:00
quexeky db916bf970 Update README.md 2024-12-24 23:24:13 +00:00
quexeky 2309407ca6 Update CONTRIBUTING.md 2024-12-24 21:34:05 +00:00
DecDuck 5c78b20504 fix(client event handler): future lenience 2024-12-24 17:46:56 +11:00
DecDuck cada630e81 fix: moved icons and created PlatformClient so we can use the enum on the frontend 2024-12-24 11:43:36 +11:00
DecDuck a361c38e82 fix(icons): remove unnecessary import 2024-12-24 10:56:30 +11:00
DecDuck 0f10626b1b fix(icons): remove dynamic imports 2024-12-24 10:49:04 +11:00
DecDuck 8945196633 fix(icons): properly import icons 2024-12-24 10:39:13 +11:00
DecDuck 31e8359ec0 chore(replace md-it): replaced markdown-it with micromark 2024-12-24 10:08:27 +11:00
DecDuck 089c3e03f6 feat(delete games): update prisma & delete games 2024-12-23 21:12:32 +11:00
DecDuck fd4a7d1981 feat(umu id override): add support for overriding UMU id 2024-12-23 13:33:22 +11:00
DecDuck b50e27f4b0 feat(library admin): client side search 2024-12-17 20:42:12 +11:00
DecDuck 54c5d55da7 fix(client chunk api route): follow best practices 2024-12-09 17:04:51 +11:00
DecDuck 25fc957092 fix(giantbomb): fix for missing developers or publishers 2024-12-08 16:07:42 +11:00
DecDuck 5393db3236 feat(download): add version metadata route 2024-12-07 11:00:56 +11:00
DecDuck 6df560ca37 fix(manifests): fix delta manifest generation 2024-12-06 22:16:42 +11:00
DecDuck 789d3ba2f2 refactor(windows logo): moved windows logo into logos dir 2024-12-06 21:25:21 +11:00
DecDuck c4391d3f4d style(invitation ui): non rounded bottom 2024-12-06 19:43:15 +11:00
DecDuck 1f4d07568f feat(client): fetch game endpoint 2024-11-26 20:11:25 +11:00
DecDuck e408ac5df8 feat(ui): more ui improvements 2024-11-24 16:12:19 +11:00
DecDuck 305de9f45a refactor: more consistent naming for globals 2024-11-24 15:29:14 +11:00
DecDuck ecc819eebc feat(ui): game carousel 2024-11-24 09:47:32 +11:00
DecDuck 9cbdcbcdf6 feat(store): new endpoints, ui and beginnings of main store page 2024-11-23 21:29:24 +11:00
DecDuck 9c2249ed08 fix(style): game panel now always shows 3 lines exactly 2024-11-23 09:12:57 +11:00
DecDuck 7b3b919581 feat(store page): add button to open in admin panel 2024-11-23 09:03:56 +11:00
DecDuck ef8f3ae6fd fix(library): only show versions that are directories 2024-11-23 08:49:38 +11:00
DecDuck 7a88f4c52d style: updated text colours across app 2024-11-19 11:11:59 +11:00
DecDuck 6e6f09dba0 feat(notifications): added notification system w/ interwoven refactoring 2024-11-16 19:41:19 +11:00
DecDuck 62ea9a116b fix(ws): fixed websocket authentication 2024-11-16 18:28:38 +11:00
DecDuck f7d767d73e feat(sessions): cleanup and raw accessors 2024-11-16 18:23:44 +11:00
DecDuck 26a31f6d56 feat(session): under the hood organisation and consolidation 2024-11-16 18:20:14 +11:00
DecDuck 5358f1f52c fix: properly disconnect websockets from task handler 2024-11-16 17:27:27 +11:00
DecDuck bc0c47c487 feat: new ws handler 2024-11-16 17:03:52 +11:00
DecDuck 8463e35a10 fix: admin invitation w/ system user 2024-11-16 17:03:04 +11:00
DecDuck 2859005ad4 fix: split prisma schemas 2024-11-16 16:30:22 +11:00
DecDuck 44c60280ef refactor: rename admin socket session map 2024-11-16 16:27:38 +11:00
DecDuck 9011cf5c83 refactor: split prisma schemas 2024-11-16 16:24:23 +11:00
DecDuck 2c21a235b2 feat: introduction of 'system user' 2024-11-16 16:18:15 +11:00
DecDuck 87230fb0e7 refactor: more consistent naming for object handler 2024-11-16 16:11:20 +11:00
DecDuck 4488ae269b feat(ui): smoother bar in admin task ui 2024-11-16 16:08:41 +11:00
DecDuck bfafe02d48 feat(ui): user widget now redirects to actual page 2024-11-16 16:08:23 +11:00
DecDuck d7160abc47 feat(registration): require lowercase usernames 2024-11-16 16:08:02 +11:00
DecDuck 76bceb121f feat: content length header for chunk downloads 2024-11-10 22:14:01 +11:00
DecDuck 952ece8c83 fix(client reg): prisma create footprint 2024-11-09 17:25:35 +11:00
DecDuck 33d37700e1 fix(admin library): results are returned alphabetically 2024-11-08 21:31:22 +11:00
DecDuck a815542604 feat(game page): more subtle design improvements 2024-11-08 21:23:31 +11:00
DecDuck e796b465d1 feat(game page): slightly improved game page 2024-11-08 20:59:17 +11:00
DecDuck b511b40d7c fix(invitations): fix types 2024-11-08 20:44:38 +11:00
DecDuck 599da0e348 feat(invitations): completed admin UI, with minor changes to backend 2024-11-07 23:23:49 +11:00
DecDuck c7b675f841 fix(invitations): fix expires requirement in the admin endpoint 2024-11-07 20:07:53 +11:00
DecDuck be6c30dfee chore(invitations): add expires field 2024-11-07 19:07:05 +11:00
DecDuck 7d72a86876 feat(client cap): client capability framework + peer API configuration 2024-11-06 12:25:00 +11:00
DecDuck adb4b7381e chore(utils): consolidate type utils 2024-11-06 11:49:08 +11:00
DecDuck f2e018277b feat(type utils): add enum dictionary type 2024-11-06 11:38:49 +11:00
DecDuck 9c4b6f35bb feat(ca): generate a server certificate for mtls APIs 2024-11-06 11:38:32 +11:00
DecDuck b9ae26cb27 chore: remove client API deadweight 2024-11-06 09:55:38 +11:00
DecDuck ce0a9ab538 chore: update prisma version 2024-11-06 09:29:28 +11:00
DecDuck 8999303f0a refactor(ca): change name of store file 2024-11-06 09:20:02 +11:00
DecDuck 69e4c2592b feat(client api): keep track of last connected 2024-11-06 09:17:03 +11:00
DecDuck 1d5e1bda85 chore(app settings): remove log statements 2024-11-05 19:03:47 +11:00
DecDuck 39fe9d55fd feat(library manager): automatically create library folder if it doesn't exist 2024-11-05 19:03:14 +11:00
DecDuck a8a152e578 feat(library ui): add header 2024-11-05 19:01:22 +11:00
DecDuck 74fa671b69 refactor(icons): move icons into dedicated folder 2024-11-05 18:39:49 +11:00
DecDuck 7b0756c6bd feat(registration): add title to tab 2024-11-05 13:18:50 +11:00
quexeky 17971e0a5a docs: Updated README.md
Removed non-existent Volunteer section in the TOC

Signed-off-by: quexeky <git@quexeky.dev>
2024-11-05 12:39:09 +11:00
quexeky d3d93b03de docs: Added SECURITY.md
Signed-off-by: quexeky <git@quexeky.dev>
2024-11-05 12:39:09 +11:00
DecDuck 22366221b2 docs(readme): update information and setup guide 2024-11-05 12:22:49 +11:00
quexeky b0ef675e7e docs: Updated README.md
Removed some existing incorrect statements that had not been adapted fully. Still need to continue updating the contributing guide

Signed-off-by: quexeky <git@quexeky.dev>
2024-11-05 12:09:15 +11:00
quexeky cd0d2bfdea docs: updated CONTRIBUTING.md
Signed-off-by: quexeky <git@quexeky.dev>
2024-11-05 12:04:46 +11:00
DecDuck 4273a20180 build only ci 2024-11-05 11:09:16 +11:00
DecDuck c4a419f2e4 update deploy template 2024-11-05 11:02:35 +11:00
DecDuck 3a51c9cc9c migrate bcrypt to bcryptjs 2024-11-05 10:56:34 +11:00
DecDuck c3914cc1ed remove bcrypt (debug) 2024-11-05 10:49:48 +11:00
DecDuck 69f341b329 Delete .gitlab-ci.yml 2024-11-04 22:29:47 +00:00
quexeky b03d790247 Added "Work in Progress" to CONTRIBUTING.md
Signed-off-by: quexeky <git@quexeky.dev>
2024-11-05 09:29:09 +11:00
quexeky df41dd1c6f Relative link from README.md to CONTRIBUTING.md
Signed-off-by: quexeky <git@quexeky.dev>
2024-11-05 09:27:19 +11:00
DecDuck ad25d3e462 fix registry authentication 2024-11-05 09:26:21 +11:00
quexeky 8097dd6721 Update styling
Signed-off-by: quexeky <git@quexeky.dev>
2024-11-05 09:25:45 +11:00
DecDuck 803752e745 move to raw docker 2024-11-05 09:23:44 +11:00
DecDuck 6328c24537 copy autodevops configuration 2024-11-05 09:19:59 +11:00
quexeky f40f8c87f4 Updated image
Signed-off-by: quexeky <git@quexeky.dev>
2024-11-05 09:16:19 +11:00
DecDuck 886beb62ea use autodevops build stage 2024-11-05 09:14:48 +11:00
DecDuck 0f80fcd830 disable tls in build 2024-11-05 09:11:30 +11:00
DecDuck 52315d09da use configuration from docs for ci/cd 2024-11-05 09:09:10 +11:00
DecDuck 62a111b0fc fixed docker daemon location 2024-11-05 09:07:26 +11:00
DecDuck 7194d35cf5 use gitlab ci variable declaration 2024-11-05 09:03:35 +11:00
DecDuck 03b0b0c38b manual ci/cd 2024-11-05 09:01:27 +11:00
DecDuck b744671e57 move to yarn v2 2024-11-04 22:55:29 +11:00
DecDuck a8f58eba7c remove canvas from dependencies 2024-11-04 22:38:05 +11:00
DecDuck 46d35adfdb back to yarn, with nuxt telemetry force disabled
I think Nuxt prompts have been messing with the installs
2024-11-04 22:15:36 +11:00
quexeky eb66c5c07a Resizing fix to icon?
Signed-off-by: quexeky <git@quexeky.dev>
2024-11-04 22:00:39 +11:00
quexeky 13bfad4966 Forgot to remove a piece
Signed-off-by: quexeky <git@quexeky.dev>
2024-11-04 21:59:39 +11:00
quexeky e47944a3b0 Some updates to README.md and CONTRIBUTING.md
Signed-off-by: quexeky <git@quexeky.dev>
2024-11-04 21:59:12 +11:00
DecDuck 9cb2d6d02f migrate to pnpm due to ci/cd issues with yarn 2024-11-04 21:52:31 +11:00
DecDuck 36568c3845 verbose yarn install 2024-11-04 21:31:32 +11:00
DecDuck a208fbedbd run yarn install in CI/CD non interactively 2024-11-04 21:21:32 +11:00
DecDuck 584bcf1cdf removed yarn.lock 2024-11-04 21:15:49 +11:00
DecDuck c5d00b4766 docker based deployment 2024-11-04 20:50:35 +11:00
DecDuck 5fe2036f0b immutable application settings framework 2024-11-02 11:32:36 +11:00
DecDuck 583301ff40 slight fixes to register logic 2024-10-31 20:28:29 +11:00
quexeky 88c95d6bf7 Updated tailwind config 2024-10-30 09:17:20 +11:00
DecDuck 848a611751 server side and user client side completed for registration 2024-10-28 22:16:29 +11:00
DecDuck 2e44ef3501 user mobile header 2024-10-27 15:52:30 +11:00
DecDuck ecb381e1ca break into single column store on lg devices 2024-10-27 15:30:26 +11:00
DecDuck b2ab827a55 add proper carousel to store page
uses the VueCarousel library to add an actual carousel to the store page
for the images. uses responsive styles
2024-10-27 15:21:31 +11:00
DecDuck 46551f9330 bump droplet and add vue carousel 2024-10-27 15:07:39 +11:00
DecDuck e4339c34ec Update file chunk.get.ts 2024-10-26 05:46:28 +00:00
DecDuck 7d2a1c6952 starting docs infra 2024-10-25 13:15:46 +11:00
DecDuck 24a0d118f2 slight bug fixes and clean up 2024-10-24 22:12:01 +11:00
DecDuck ef13b68592 better server side signin redirects
this makes it so if a user requests a page (not API route) and isn't
signed in, it automatically redirects them to the sign in page (doesn't
show a flash of the error page)
2024-10-23 12:55:38 +11:00
DecDuck c4a3e4e9a7 failed gracefully on invalid chunk index 2024-10-23 12:36:09 +11:00
DecDuck 7f4db0c1dc slight patch to rename query to be more consistent 2024-10-23 12:13:30 +11:00
DecDuck 3dd6062af4 added download chunk endpoint 2024-10-23 12:03:31 +11:00
DecDuck 6e2dc89670 Add LICENSE 2024-10-22 22:40:13 +00:00
DecDuck 93bc143dac additional polish and QoL features 2024-10-22 09:43:00 +11:00
DecDuck 03a37f72aa fixed manifest generation 2024-10-21 21:50:55 +11:00
DecDuck 7e176262cc more cleaning 2024-10-21 21:50:27 +11:00
DecDuck e1c1d7ea39 fixed task system 2024-10-21 21:50:21 +11:00
DecDuck c355f6fdbb cleanup & polish 2024-10-21 21:49:51 +11:00
DecDuck 0a715fef08 ability to fetch client certs for p2p 2024-10-21 10:14:13 +11:00
DecDuck 395219d0cb patch for no version check in manifest generation 2024-10-20 20:38:28 +11:00
DecDuck eb3f9f91ca check for no version in manifest generation 2024-10-20 20:31:07 +11:00
DecDuck cf578bd005 patch metadata handler 2024-10-20 19:44:00 +11:00
DecDuck 1f575b2bc0 small fixes & SSR disabled
SSR was causing weird issues where error pages would flash because the
user wasn't logged in. I'm disabling it for now, but I will eventually
look into ways to fix the issue and re-enable it.
2024-10-17 21:04:32 +11:00
DecDuck 91b7e1071c more client routes to support Drop app update 2024-10-15 20:05:38 +11:00
DecDuck 329c74d3ce game version re-ordering 2024-10-14 20:34:23 +11:00
DecDuck 8674ac7211 beginnings of download implementation 2024-10-12 17:34:09 +11:00
DecDuck 328b9ba46c fixes to store page for mobile clients 2024-10-12 17:33:31 +11:00
DecDuck 9b7ee4e746 upload images to games 2024-10-12 12:09:14 +11:00
DecDuck 27070b6a4c almst complete admin ui and initial store designs 2024-10-11 22:45:02 +11:00
DecDuck 46c8f0c48a version importing 2024-10-11 17:16:26 +11:00
DecDuck a7c33e7d43 completed game importing; partial work on version importing 2024-10-11 00:37:08 +11:00
DecDuck 718f5ba514 task API
The Task API allows for an easy way to create long-lived tasks that
require reporting back to user with progress/logs. It will be used in
the upcoming game importing.
2024-10-10 16:13:10 +11:00
DecDuck f3672f81dd patch signin 2024-10-10 13:39:43 +11:00
DecDuck 6b5e48d6fe admin ui shell 2024-10-09 15:43:55 +11:00
DecDuck 486bce8bc7 finished object endpoints
Added writing (tested) and deleting (untested) endpoints
2024-10-09 15:08:55 +11:00
DecDuck 435551c207 object storage + full permission system + testing
Object storage now works fully, with the permission system. It still
needs additional external endpoints for updating and deleting objects
from the API, but it is otherwise complete. Further tasks include
writing an S3 adapter.
2024-10-09 14:43:06 +11:00
DecDuck de388a937a object storage interface + utility functions
New ObjectBackend class that requires implementors to specify a few
basic functions, and it handles the permission logic on top of that.
Hopefully there is enough abstraction to suite further use cases!
2024-10-09 13:47:28 +11:00
DecDuck 4fa771a0b5 update dependencies and add note about optional dependencies 2024-10-09 02:35:59 +11:00
DecDuck 6ba5cdddc5 bump @drop/droplet version for windows developers 2024-10-09 02:26:21 +11:00
DecDuck d4e2dc8cb6 finalised client APIs and authentication method 2024-10-09 00:37:11 +11:00
DecDuck 425934d3ef Update README.md 2024-10-09 00:20:07 +11:00
DecDuck c4d81135a2 migrate to new droplet ca system 2024-10-08 21:45:44 +11:00
DecDuck 2b4382d013 handshakes 2024-10-08 18:08:34 +11:00
DecDuck 7523e536b5 another stage of client authentication 2024-10-08 16:13:46 +11:00
DecDuck 909432a6ce client initiate 2024-10-08 13:17:30 +11:00
DecDuck ceacd8469d README update 2024-10-08 00:56:15 +11:00
DecDuck 7869043c28 refactoring 2024-10-08 00:41:05 +11:00
DecDuck bfafd2a044 ca groundwork 2024-10-07 22:35:54 +11:00
DecDuck 1bd19ad917 more ui 2024-10-04 15:35:03 +10:00
DecDuck e52f072091 ui groundwork 2024-10-04 14:43:02 +10:00
DecDuck 22ac7f6b15 metadata engine 2024-10-04 13:01:06 +10:00
DecDuck 196f87c219 initial work on metadata system 2024-09-29 11:08:49 +10:00
DecDuck e1a789fa36 initial commit 2024-09-28 19:12:11 +10:00
1284 changed files with 15636 additions and 118830 deletions
-2
View File
@@ -3,5 +3,3 @@ DATABASE_URL="postgres://drop:drop@127.0.0.1:5432/drop"
GIANT_BOMB_API_KEY=""
EXTERNAL_URL="http://localhost:3000"
NUXT_PORT=4000
@@ -21,20 +21,17 @@ jobs:
with:
submodules: true
- name: Install pnpm
uses: pnpm/action-setup@v4
- name: Setup Node.js environment
uses: actions/setup-node@v4
with:
node-version: lts/*
cache: "pnpm"
cache: "yarn"
- name: Install dependencies
run: pnpm install
run: yarn install --immutable --network-timeout 1000000
- name: Typecheck
run: pnpm run typecheck
run: yarn typecheck
lint:
name: Lint
@@ -45,17 +42,14 @@ jobs:
with:
submodules: true
- name: Install pnpm
uses: pnpm/action-setup@v4
- name: Setup Node.js environment
uses: actions/setup-node@v4
with:
node-version: lts/*
cache: "pnpm"
cache: "yarn"
- name: Install dependencies
run: pnpm install
run: yarn install --immutable --network-timeout 1000000
- name: Lint
run: pnpm run lint
run: yarn lint
@@ -8,20 +8,10 @@ on:
schedule:
- cron: "0 2 * * *" # run at 2 AM UTC
env:
REGISTRY_IMAGE: ghcr.io/drop-oss/drop
jobs:
build:
strategy:
fail-fast: false
matrix:
include:
- platform: linux/amd64
runner: ubuntu-latest
- platform: linux/arm64
runner: ubuntu-24.04-arm
runs-on: ${{ matrix.runner }}
web:
name: Push website Docker image to registry
runs-on: ubuntu-latest
permissions:
packages: write
contents: read
@@ -35,30 +25,6 @@ jobs:
ref: ${{ github.ref }}
token: ${{ secrets.GITHUB_TOKEN }}
- name: Prepare
run: |
platform=${{ matrix.platform }}
echo "PLATFORM_PAIR=${platform//\//-}" >> $GITHUB_ENV
- name: Docker meta
id: meta
uses: docker/metadata-action@v5
with:
images: ${{ env.REGISTRY_IMAGE }}
- name: Login to Docker Hub
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Set up QEMU
uses: docker/setup-qemu-action@v3
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Determine final version
id: get_final_ver
run: |
@@ -77,58 +43,22 @@ jobs:
echo "Drop's release tag will be: $FINAL_VER"
echo "final_ver=$FINAL_VER" >> $GITHUB_OUTPUT
- name: Build and push by digest
id: build
uses: docker/build-push-action@v6
- name: Set up QEMU
uses: docker/setup-qemu-action@v3
- name: Set up Docker Buildx
id: buildx
uses: docker/setup-buildx-action@v3
with:
platforms: ${{ matrix.platform }}
labels: ${{ steps.meta.outputs.labels }}
tags: ${{ env.REGISTRY_IMAGE }}
outputs: type=image,push-by-digest=true,name-canonical=true,push=true
provenance: mode=max
sbom: true
build-args: |
BUILD_DROP_VERSION=${{ steps.get_final_ver.outputs.final_ver }}
BUILD_GIT_REF=${{ github.sha }}
buildkitd-flags: --debug
- name: Export digest
run: |
mkdir -p ${{ runner.temp }}/digests
digest="${{ steps.build.outputs.digest }}"
touch "${{ runner.temp }}/digests/${digest#sha256:}"
- name: Upload digest
uses: actions/upload-artifact@v4
with:
name: digests-${{ env.PLATFORM_PAIR }}
path: ${{ runner.temp }}/digests/*
if-no-files-found: error
retention-days: 1
merge:
runs-on: ubuntu-latest
needs:
- build
permissions:
packages: write
contents: read
steps:
- name: Download digests
uses: actions/download-artifact@v4
with:
path: ${{ runner.temp }}/digests
pattern: digests-*
merge-multiple: true
- name: Login to Docker Hub
- name: Log in to the Container registry
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Extract metadata (tags, labels) for Docker
id: meta
uses: docker/metadata-action@v5
@@ -147,12 +77,33 @@ jobs:
# set latest tag for stable releases
type=raw,value=latest,enable=${{ github.event_name == 'release' && github.event.release.prerelease == false }}
- name: Create manifest list and push
working-directory: ${{ runner.temp }}/digests
run: |
docker buildx imagetools create $(jq -cr '.tags | map("-t " + .) | join(" ")' <<< "$DOCKER_METADATA_OUTPUT_JSON") \
$(printf '${{ env.REGISTRY_IMAGE }}@sha256:%s ' *)
- name: Cache
uses: actions/cache@v4
id: cache
with:
path: cache-mount
key: cache-mount-${{ hashFiles('Dockerfile') }}
- name: Inspect image
run: |
docker buildx imagetools inspect ${{ env.REGISTRY_IMAGE }}:${{ steps.meta.outputs.version }}
- name: Restore Docker cache mounts
uses: reproducible-containers/buildkit-cache-dance@v3
with:
builder: ${{ steps.setup-buildx.outputs.name }}
cache-dir: cache-mount
dockerfile: Dockerfile
skip-extraction: ${{ steps.cache.outputs.cache-hit }}
- name: Build and push image
id: build-and-push
uses: docker/build-push-action@v6
with:
context: .
push: true
provenance: mode=max
sbom: true
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
platforms: linux/amd64,linux/arm64
cache-from: type=gha
cache-to: type=gha,mode=max
build-args: |
BUILD_DROP_VERSION=${{ steps.get_final_ver.outputs.final_ver }}
+1 -3
View File
@@ -34,6 +34,4 @@ deploy-template/*
# generated prisma client
/prisma/client
/prisma/validate
/server/internal/proto
/prisma/validate
+54
View File
@@ -0,0 +1,54 @@
variables:
GIT_SUBMODULE_STRATEGY: recursive
stages:
- build
services:
- docker:24.0.5-dind
before_script:
- docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" "$CI_REGISTRY"
build:
stage: build
image: docker:latest
variables:
IMAGE_NAME: $CI_REGISTRY_IMAGE/$CI_COMMIT_REF_NAME:$CI_COMMIT_SHORT_SHA
LATEST_IMAGE_NAME: $CI_REGISTRY_IMAGE/$CI_COMMIT_REF_NAME:latest
PUBLISH_IMAGE_NAME: $CI_REGISTRY_IMAGE:$CI_COMMIT_TAG
PUBLISH_LATEST_IMAGE_NAME: $CI_REGISTRY_IMAGE:latest
script:
- docker build -t $IMAGE_NAME .
- docker image tag $IMAGE_NAME $LATEST_IMAGE_NAME
- docker push $IMAGE_NAME
- docker push $LATEST_IMAGE_NAME
- |
if [ $CI_COMMIT_TAG ]; then
docker image tag $IMAGE_NAME $PUBLISH_IMAGE_NAME
docker image tag $IMAGE_NAME $PUBLISH_LATEST_IMAGE_NAME
docker push $PUBLISH_IMAGE_NAME $PUBLISH_LATEST_IMAGE_NAME
fi
build-arm64:
stage: build
image: arm64v8/docker:latest
tags:
- aarch64
variables:
IMAGE_NAME: $CI_REGISTRY_IMAGE/$CI_COMMIT_REF_NAME:$CI_COMMIT_SHORT_SHA-arm64
LATEST_IMAGE_NAME: $CI_REGISTRY_IMAGE/$CI_COMMIT_REF_NAME:latest-arm64
PUBLISH_IMAGE_NAME: $CI_REGISTRY_IMAGE:$CI_COMMIT_TAG-arm64
PUBLISH_LATEST_IMAGE_NAME: $CI_REGISTRY_IMAGE:latest-arm64
script:
- docker build -t $IMAGE_NAME . --platform=linux/arm64
- docker image tag $IMAGE_NAME $LATEST_IMAGE_NAME
- docker push $IMAGE_NAME
- docker push $LATEST_IMAGE_NAME
- |
if [ $CI_COMMIT_TAG ]; then
docker image tag $IMAGE_NAME $PUBLISH_IMAGE_NAME
docker image tag $IMAGE_NAME $PUBLISH_LATEST_IMAGE_NAME
docker push $PUBLISH_IMAGE_NAME
docker push $PUBLISH_LATEST_IMAGE_NAME
fi
+3
View File
@@ -0,0 +1,3 @@
[submodule "drop-base"]
path = drop-base
url = https://github.com/Drop-OSS/drop-base.git
+1
View File
@@ -0,0 +1 @@
drop-base/
+28 -26
View File
@@ -1,35 +1,37 @@
{
"spellchecker.ignoreWordsList": ["mTLS", "Wireguard"],
"sqltools.connections": [
{
"previewLimit": 50,
"server": "localhost",
"port": 5432,
"driver": "PostgreSQL",
"name": "drop",
"database": "drop",
"username": "drop",
"password": "drop"
}
],
// allow autocomplete for ArkType expressions like "string | num"
"editor.quickSuggestions": {
"strings": "on"
},
"i18n-ally.extract.autoDetect": true,
"i18n-ally.extract.ignored": ["string >= 14", "string.alphanumeric >= 5"],
"i18n-ally.extract.ignoredByFiles": {
"components/NewsArticleCreateButton.vue": ["[", "`", "Enter"],
"pages/admin/library/sources/index.vue": ["Filesystem"],
"server/api/v1/auth/signin/simple.post.ts": ["boolean | undefined"]
},
"i18n-ally.keepFulfilled": true,
"i18n-ally.keystyle": "nested",
"i18n-ally.localesPaths": ["i18n", "i18n/locales"],
// prioritize ArkType's "type" for autoimports
"typescript.preferences.autoImportSpecifierExcludeRegexes": ["^(node:)?os$"],
// i18n Ally settings
"i18n-ally.sortKeys": true,
"prisma.pinToPrisma6": false,
"spellchecker.ignoreWordsList": ["mTLS", "Wireguard"],
"sqltools.connections": [
{
"database": "drop",
"driver": "PostgreSQL",
"name": "drop",
"password": "drop",
"port": 5432,
"previewLimit": 50,
"server": "localhost",
"username": "drop"
}
"i18n-ally.keepFulfilled": true,
"i18n-ally.extract.autoDetect": true,
"i18n-ally.localesPaths": ["i18n", "i18n/locales"],
"i18n-ally.keystyle": "nested",
"i18n-ally.extract.ignored": [
"string >= 14",
"string.alphanumeric >= 5",
"/api/v1/admin/import/version/preload?id=${encodeURIComponent(\n gameId,\n )}&version=${encodeURIComponent(version)}"
],
"typescript.experimental.useTsgo": false,
// prioritize ArkType's "type" for autoimports
"typescript.preferences.autoImportSpecifierExcludeRegexes": ["^(node:)?os$"]
"i18n-ally.extract.ignoredByFiles": {
"pages/admin/library/sources/index.vue": ["Filesystem"],
"components/NewsArticleCreateButton.vue": ["[", "`", "Enter"],
"server/api/v1/auth/signin/simple.post.ts": ["boolean | undefined"]
}
}
+271
View File
@@ -0,0 +1,271 @@
# CONTRIBUTING GUIDELINES
Drop is a community-driven project. Contribution is welcome, encouraged, and appreciated.
It is also essential for the development of the project.
First, please take a moment to review our [code of conduct](CODE_OF_CONDUCT.md).
These guidelines are an attempt at better addressing pending
issues and pull requests. Please read them closely.
Foremost, be so kind as to [search](#use-the-search-luke). This ensures any contribution
you would make is not already covered.
<!-- TOC updateonsave:true depthfrom:2 -->
- [Reporting Issues](#reporting-issues)
- [You have a problem](#you-have-a-problem)
- [You have a suggestion](#you-have-a-suggestion)
- [Development](#development)
- [Note: `--optional` flag is **REQUIRED**](#note-optional-flag-is-required)
- [Tech Stack](#tech-stack)
- [Submitting Pull Requests](#submitting-pull-requests)
- [Getting started](#getting-started)
- [You have a solution](#you-have-a-solution)
- [You have an addition](#you-have-an-addition)
- [Use the Search, Luke](#use-the-search-luke)
- [Translation](#translation)
- [Commit Guidelines](#commit-guidelines)
- [Format](#format)
- [Style](#style)
<!-- /TOC -->
## Reporting Issues
### You have a problem
Please be so kind as to [search](#use-the-search-luke) for any open issue already covering
your problem.
If you find one, comment on it, so we know more people are experiencing it.
<!--
TODO: Add Troubleshooting
If not, look at the [Troubleshooting](https://github.com/Drop-OSS/docs/Troubleshooting)
page for instructions on how to gather data to better debug your problem.
-->
If you cannot find an existing issue, you can go ahead and create an issue with as much
detail as you can provide.
It should include the data gathered as indicated above, along with the following:
1. How to reproduce the problem
2. What the correct behavior should be
3. What the actual behavior is
Please copy to anyone relevant (e.g. plugin maintainers) by mentioning their GitHub handle
(starting with `@`) in your message.
We will do our very best to help you.
### You have a suggestion
Please be so kind as to [search](#use-the-search-luke) for any open issue already covering
your suggestion.
If you find one, comment on it, so we know more people are supporting it.
If not, you can go ahead and create an issue. Please copy to anyone relevant (e.g. plugin
maintainers) by mentioning their GitHub handle (starting with `@`) in your message.
## Development
To get started with development, you need `yarn` and `docker compose` installed (or know how to set up a PostgreSQL database).
Steps:
1. Run `git submodule update --init --recursive` to setup submodules
1. Copy the `.env.example` to `.env` and add any api keys you need to use (e.g. for the Giant Bomb API)
- You can find other configuration options in the [documentation](https://docs.droposs.org/)
1. Create the `.data` directory with `mkdir .data`
1. Ensure that your user owns the `.data` directory with `sudo chown -R $(id -u $(whoami))`
1. Open up a terminal and navigate to `dev-tools`, and run `docker compose up`
1. Open up another terminal in the root directory of the project and run `yarn` and then `yarn prisma migrate dev` to setup the database
1. Run `yarn dev` to start the development server
As part of the first-time bootstrap, Drop creates an invitation with the fixed id of 'admin'. So, to create an admin account, go to:
http://localhost:3000/auth/register?id=admin
### Tech Stack
This repo uses the Nuxt 3 + TailwindCSS stack, with the `yarn` package manager.
For the database, Drop uses Prisma connected to PostgreSQL.
## Submitting Pull Requests
### Getting started
You should be familiar with the basics of
[contributing on GitHub](https://help.github.com/articles/using-pull-requests)
<!--and have a fork
[properly set up](https://github.com/drop/docs/Contribution-Technical-Practices).
-->
You MUST always create PRs with _a dedicated branch_ based on the latest upstream tree.
If you create your own PR, please make sure you do it right. Also be so kind as to reference
any issue that would be solved in the PR description body,
[for instance](https://help.github.com/articles/closing-issues-via-commit-messages/)
_"Fixes #XXXX"_ for issue number XXXX.
### You have a solution
Please be so kind as to [search](#use-the-search-luke) for any open issue already covering
your [problem](#you-have-a-problem), and any pending/merged/rejected PR covering your solution.
If the solution is already reported, try it out and +1 the pull request if the
solution works ok. On the other hand, if you think your solution is better, post
it with reference to the other one so we can have both solutions to compare.
If not, then go ahead and submit a PR. Please copy to anyone relevant (e.g. plugin
maintainers) by mentioning their GitHub handle (starting with `@`) in your message.
### You have an addition
We are absolutely accepting more contributions or features to drop, but please, make sure
that it is reasonable. Contributions that only cover a very small niche are likely to not
be added.
Please be so kind as to [search](#use-the-search-luke) for any pending, merged or rejected Pull Requests
covering or related to what you want to add.
If you find one, try it out and work with the author on a common solution.
If not, then go ahead and submit a PR. Please copy to anyone relevant (e.g. plugin
maintainers) by mentioning their GitHub handle (starting with `@`) in your message.
For any extensive change, such as API changes, you will have to find testers to +1 your PR.
---
## Use the Search, Luke
_May the Force (of past experiences) be with you_
GitHub offers [many search features](https://help.github.com/articles/searching-github/)
to help you check whether a similar contribution to yours already exists. Please search
before making any contribution, it avoids duplicates and eases maintenance. Trust me,
that works 90% of the time.
You can also take a look at the [FAQ](https://github.com/Drop-OSS/docs/wiki/FAQ)
to be sure your contribution has not already come up.
If all fails, your thing has probably not been reported yet, so you can go ahead
and [create an issue](#reporting-issues) or [submit a PR](#submitting-pull-requests).
---
## Translation
If you want to help translate Drop, we would love to have your help! You can do so on our [weblate instance](https://translate.droposs.org/engage/drop/). Please make sure to **read** the [message format syntax](https://vue-i18n.intlify.dev/guide/essentials/syntax.html) page before starting. We use this special syntax to enable high quality translations, and failure to do so may result in your translations **causing errors** in Drop.
## Commit Guidelines
Drop uses the [Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0/)
specification. The automatic changelog tool uses these to automatically generate
a changelog based on the commit messages. Here's a guide to writing a commit message
to allow this:
### Format
```
type(scope)!: subject
```
- `type`: the type of the commit is one of the following:
- `feat`: new features.
- `fix`: bug fixes.
- `docs`: documentation changes.
- `refactor`: refactor of a particular code section without introducing
new features or bug fixes.
- `style`: code style improvements.
- `perf`: performance improvements.
- `test`: changes to the test suite.
- `ci`: changes to the CI system.
- `build`: changes to the build system.
- `chore`: for other changes that don't match previous types. This doesn't appear
in the changelog.
- `scope`: section of the codebase that the commit makes changes to. If it makes changes to
many sections, or if no section in particular is modified, leave blank without the parentheses.
Examples:
- Commit that changes the `git` plugin:
```
feat(git): add alias for `git commit`
```
- Commit that changes many plugins:
```
style: fix inline declaration of arrays
```
For changes to plugins or themes, the scope should be the plugin or theme name:
- ✅ `fix(agnoster): commit subject`
- ❌ `fix(theme/agnoster): commit subject`
- `!`: this goes after the `scope` (or the `type` if scope is empty), to indicate that the commit
introduces breaking changes.
Optionally, you can specify a message that the changelog tool will display to the user to indicate
what's changed and what they can do to deal with it. You can use multiple lines to type this message;
the changelog parser will keep reading until the end of the commit message or until it finds an empty
line.
Example (made up):
```
style(agnoster)!: change dirty git repo glyph
BREAKING CHANGE: the glyph to indicate when a git repository is dirty has
changed from a Powerline character to a standard UTF-8 emoji. You can
change it back by setting `ZSH_THEME_DIRTY_GLYPH`.
Fixes #420
Co-authored-by: Username <email>
```
- `subject`: a brief description of the changes. This will be displayed in the changelog. If you need
to specify other details, you can use the commit body, but it won't be visible.
Formatting tricks: the commit subject may contain:
- Links to related issues or PRs by writing `#issue`. This will be highlighted by the changelog tool:
```
feat(archlinux): add support for aura AUR helper (#9467)
```
- Formatted inline code by using backticks: the text between backticks will also be highlighted by
the changelog tool:
```
feat(shell-proxy): enable unexported `DEFAULT_PROXY` setting (#9774)
```
### Style
Try to keep the first commit line short. It's harder to do using this commit style but try to be
concise, and if you need more space, you can use the commit body. Try to make sure that the commit
subject is clear and precise enough that users will know what changed by just looking at the changelog.
---
<!--
## Volunteer
Very nice!! :)
Please have a look at the [Volunteer](https://github.com/ohmyzsh/ohmyzsh/wiki/Volunteers)
page for instructions on where to start and more.
-->
## Reference
This contributing guide is adapted from the
[oh-my-zsh contribution guide](https://github.com/ohmyzsh/ohmyzsh/blob/master/CONTRIBUTING.md).
If there are any issues with this, please email admin@deepcore.dev.
+56
View File
@@ -0,0 +1,56 @@
# syntax=docker/dockerfile:1
### Unified deps builder
# FROM node:lts-alpine AS deps
# WORKDIR /app
# COPY package.json yarn.lock ./
# RUN --mount=type=cache,target=/root/.yarn YARN_CACHE_FOLDER=/root/.yarn yarn install --network-timeout 1000000 --ignore-scripts
### Build for app
FROM node:lts-alpine AS build-system
# setup workdir - has to be the same filepath as app because fuckin' Prisma
WORKDIR /app
ENV NODE_ENV=production
ENV NUXT_TELEMETRY_DISABLED=1
# ENV YARN_CACHE_FOLDER=/root/.yarn
# add git so drop can determine its git ref at build
# pnpm for build
RUN apk add --no-cache git pnpm
# copy deps and rest of project files
# COPY --from=deps /app/node_modules ./node_modules
COPY . .
ARG BUILD_DROP_VERSION
ARG BUILD_GIT_REF
# build
RUN pnpm import
RUN pnpm install --shamefully-hoist
RUN pnpm run build
# RUN --mount=type=cache,target=/root/.yarn yarn postinstall && yarn build
### create run environment for Drop
FROM node:lts-alpine AS run-system
WORKDIR /app
ENV NODE_ENV=production
ENV NUXT_TELEMETRY_DISABLED=1
# RUN --mount=type=cache,target=/root/.yarn YARN_CACHE_FOLDER=/root/.yarn yarn add --network-timeout 1000000 --no-lockfile --ignore-scripts prisma@6.11.1
RUN apk add --no-cache pnpm
RUN pnpm install prisma@6.11.1
# init prisma to download all required files
RUN pnpm prisma init
COPY --from=build-system /app/package.json ./
COPY --from=build-system /app/.output ./app
COPY --from=build-system /app/prisma ./prisma
COPY --from=build-system /app/build ./startup
ENV LIBRARY="/library"
ENV DATA="/data"
CMD ["sh", "/app/startup/launch.sh"]
View File
+1 -1
View File
@@ -2,4 +2,4 @@
To report a vulnerability, please DO NOT create an issue for it
as this may lead to the vulnerability being exploited before it
can be fixed. Instead, please email [security@droposs.org](mailto:security@droposs.org)
can be fixed. Instead, please email [security@deepcore.dev](mailto:security@deepcore.dev)
+13 -2
View File
@@ -29,11 +29,10 @@ await updateUser();
const user = useUser();
const apiDetails = await $dropFetch("/api/v1");
const clientMode = isClientRequest();
const showExternalUrlWarning = ref(false);
function checkExternalUrl() {
if (!import.meta.client || clientMode) return;
if (!import.meta.client) return;
const realOrigin = window.location.origin.trim();
const chosenOrigin = apiDetails.external.trim();
const ignore = window.localStorage.getItem("ignoreExternalUrl");
@@ -52,3 +51,15 @@ if (user.value?.admin) {
});
}
</script>
<style scoped>
/* You can customise the default animation here. */
::view-transition-old(root) {
animation: 90ms cubic-bezier(0.4, 0, 1, 1) both fade-out;
}
::view-transition-new(root) {
animation: 210ms cubic-bezier(0, 0, 0.2, 1) 90ms both fade-in;
}
</style>
-1
View File
@@ -1 +0,0 @@
/bin
-19
View File
@@ -1,19 +0,0 @@
package core
import (
"context"
"fmt"
"os"
"github.com/jackc/pgx/v5"
)
func connect() {
conn, err := pgx.Connect(context.Background(), os.Getenv("DATABASE_URL"))
if err != nil {
fmt.Fprintf(os.Stderr, "Unable to connect to database: %v\n", err)
os.Exit(1)
}
defer conn.Close(context.Background())
}
-10
View File
@@ -1,10 +0,0 @@
module drop/core
go 1.26.1
require (
github.com/jackc/pgpassfile v1.0.0 // indirect
github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect
github.com/jackc/pgx/v5 v5.9.1 // indirect
golang.org/x/text v0.29.0 // indirect
)
-15
View File
@@ -1,15 +0,0 @@
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM=
github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg=
github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 h1:iCEnooe7UlwOQYpKFhBabPMi4aNAfoODPEFNiAnClxo=
github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM=
github.com/jackc/pgx/v5 v5.9.1 h1:uwrxJXBnx76nyISkhr33kQLlUqjv7et7b9FjCen/tdc=
github.com/jackc/pgx/v5 v5.9.1/go.mod h1:mal1tBGAFfLHvZzaYh77YS/eC6IX9OWbRV1QIIM0Jn4=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
golang.org/x/text v0.29.0 h1:1neNs90w9YzJ9BocxfsQNHKuAT4pkghyXc4nhZ6sJvk=
golang.org/x/text v0.29.0/go.mod h1:7MhJOA9CD2qZyOKYazxdYMF85OwPdEr9jTtBpO7ydH4=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
-5
View File
@@ -1,5 +0,0 @@
module drop
go 1.26.1
require github.com/gorilla/mux v1.8.1
-2
View File
@@ -1,2 +0,0 @@
github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY=
github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ=
-3
View File
@@ -1,3 +0,0 @@
go 1.26.1
use ./core
-9
View File
@@ -1,9 +0,0 @@
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/jackc/puddle/v2 v2.2.2/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4=
github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk=
github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U=
golang.org/x/mod v0.27.0/go.mod h1:rWI627Fq0DEoudcK+MBkNkCe0EetEaDSwJJkCcjpazc=
golang.org/x/sync v0.17.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI=
golang.org/x/tools v0.36.0/go.mod h1:WBDiHKJK8YgLHlcQPYQzNCkUxUypCaa5ZegCVutKm+s=
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
-37
View File
@@ -1,37 +0,0 @@
package main
import (
"fmt"
"log"
"net/http"
"strings"
"github.com/gorilla/mux"
)
func handler(res http.ResponseWriter, req *http.Request) {
fmt.Fprintf(res, "G'day there mate")
}
func routingMiddleware(h http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
url := *r.URL
url.Path = strings.TrimSuffix(r.URL.Path, "/")
r.URL = &url
h.ServeHTTP(w, r)
})
}
func main() {
r := mux.NewRouter().StrictSlash(true)
r.Use(routingMiddleware)
r.HandleFunc("/api/v1", handler)
srv := &http.Server{
Addr: ":3433",
Handler: r,
}
log.Printf("starting drop server on :3433")
srv.ListenAndServe()
}
+544
View File
@@ -0,0 +1,544 @@
## Release 0.2.0-beta
### Fixes
- fix recursive dirs util #02d6346
- Fix username length requirement #0a5a649
- remove dynamic imports #0f10626
- fix for missing developers or publishers #25fc957
- split prisma schemas #2859005
- results are returned alphabetically #33d3770
- update prisma schemas #36776cc
- removed global flag #43e32b4
- properly disconnect websockets from task handler #5358f1f
- follow best practices #54c5d55
- future lenience #5c78b20
- fix width of token breaking things #61d88c3
- fixed websocket authentication #62ea9a1
- fix delta manifest generation #6df560c
- admin invitation w/ system user #8463e35
- properly import icons #8945196
- prisma create footprint #952ece8
- game panel now always shows 3 lines exactly #9c2249e
- remove unnecessary import #a361c38
- fix disconnect code #a8f2106
- fix types #b511b40
- add drop-base as git submodule #b75ebd1
- Update README.md with discord link #c6bb21d
- fix expires requirement in the admin endpoint #c7b675f
- fix always being created as admin #c7eb11a
- moved icons and created PlatformClient so we can use the enum on the frontend #cada630
- recurse submodules #db103de
- fix FATAL: "root"... message #dbb315a
- only show versions that are directories #ef8f3ae
### Features
- update prisma & delete games #089c3e0
- manual handshake #12e3125
- fetch game endpoint #1f4d075
- under the hood organisation and consolidation #26a31f6
- 'no images' slide on image carousel #28baabc
- improve feedback when metadata fails #2c19e13
- introduction of 'system user' #2c21a23
- change name, description and icon #2cfe75a
- 'manual' metadata provider #2f52a16
- add disabled state #38fc6b8
- overhauled version importing #39d7ce7
- automatically create library folder if it doesn't exist #39fe9d5
- smoother bar in admin task ui #4488ae2
- add noWrapper option #4f9b949
- add version metadata route #5393db3
- completed admin UI, with minor changes to backend #599da0e
- adjust gradient #5a1f841
- keep track of last connected #69e4c25
- added notification system w/ interwoven refactoring #6e6f09d
- content length header for chunk downloads #76bceb1
- add title to tab #7b0756c
- add button to open in admin panel #7b3b919
- client capability framework + peer API configuration #7d72a86
- customisable image carousel and new layout #937954f
- support more types #9b12d45
- generate a server certificate for mtls APIs #9c4b6f3
- new endpoints, ui and beginnings of main store page #9cbdcbc
- backend #a309651
- more subtle design improvements #a815542
- add aden's carousel pagination design #a86045c
- add header #a8a152e
- client side search #b50e27f
- new ws handler #bc0c47c
- user widget now redirects to actual page #bfafe02
- require lowercase usernames #d7160ab
- more ui improvements #e408ac5
- add modifying game descriptions #e505e58
- mobile nav #e5cf13f
- slightly improved game page #e796b46
- game carousel #ecc819e
- add enum dictionary type #f2e0182
- improved ux #f3ed0f6
- cleanup and raw accessors #f7d767d
- add support for overriding UMU id #fd4a7d1
- add .sh for linux #fe9373a
### Other Changes
- quexeky <git@quexeky.dev>
- fixed manifest generation #03a37f7
- manual ci/cd #03b0b0c
- ability to fetch client certs for p2p #0a715fe
- disable tls in build #0f80fcd
- Updated README.md #17971e0
- Merge pull request #18 from Drop-OSS/develop
- initial work on metadata system #196f87c
- more ui #1bd19ad
- remove log statements #1d5e1bd
- small fixes & SSR disabled #1f575b2
- update information and setup guide #2236622
- metadata engine #22ac7f6
- Update CONTRIBUTING.md #2309407
- slight bug fixes and clean up #24a0d11
- almst complete admin ui and initial store designs #27070b6
- handshakes #2b4382d
- user mobile header #2e44ef3
- more consistent naming for globals #305de9f
- replaced markdown-it with micromark #31e8359
- fixes to store page for mobile clients #328b9ba
- game version re-ordering #329c74d
- verbose yarn install #36568c3
- patch for no version check in manifest generation #395219d
- migrate bcrypt to bcryptjs #3a51c9c
- added download chunk endpoint #3dd6062
- Update README.md #425934d
- build only ci #4273a20
- object storage + full permission system + testing #435551c
- rename admin socket session map #44c6028
- bump droplet and add vue carousel #46551f9
- version importing #46c8f0c
- back to yarn, with nuxt telemetry force disabled #46d35ad
- finished object endpoints #486bce8
- update dependencies and add note about optional dependencies #4fa771a
- use configuration from docs for ci/cd #52315d0
- slight fixes to register logic #583301f
- removed yarn.lock #584bcf1
- Version bump #5f29c28
- immutable application settings framework #5fe2036
- fixed docker daemon location #62a111b
- copy autodevops configuration #6328c24
- Delete .gitlab-ci.yml #69f341b
- admin ui shell #6b5e48d
- bump @drop/droplet version for windows developers #6ba5cdd
- Add LICENSE #6e2dc89
- custom dind #716eac7
- task API #718f5ba
- use gitlab ci variable declaration #7194d35
- move icons into dedicated folder #74fa671
- another stage of client authentication #7523e53
- refactoring #7869043
- moved windows logo into logos dir #789d3ba
- updated text colours across app #7a88f4c
- starting docs infra #7d2a1c6
- more cleaning #7e17626
- slight patch to rename query to be more consistent #7f4db0c
- move to raw docker #803752e
- server side and user client side completed for registration #848a611
- beginnings of download implementation #8674ac7
- more consistent naming for object handler #87230fb
- use autodevops build stage #886beb6
- Updated tailwind config #88c95d6
- change name of store file #8999303
- split prisma schemas #9011cf5
- client initiate #909432a
- more client routes to support Drop app update #91b7e10
- additional polish and QoL features #93bc143
- upload images to games #9b7ee4e
- migrate to pnpm due to ci/cd issues with yarn #9cb2d6d
- run yarn install in CI/CD non interactively #a208fbe
- completed game importing; partial work on version importing #a7c33e7
- remove canvas from dependencies #a8f58eb
- fix registry authentication #ad25d3e
- consolidate type utils #adb4b73
- Updated README.md #b0ef675
- add proper carousel to store page #b2ab827
- move to yarn v2 #b744671
- remove client API deadweight #b9ae26c
- add expires field #be6c30d
- ca groundwork #bfafd2a
- cleanup & polish #c355f6f
- remove bcrypt (debug) #c3914cc
- non rounded bottom #c4391d3
- failed gracefully on invalid chunk index #c4a3e4e
- update deploy template #c4a419f
- migrate to new droplet ca system #c4d8113
- docker based deployment #c5d00b4
- updated CONTRIBUTING.md #cd0d2bf
- update prisma version #ce0a9ab
- README update #ceacd84
- patch metadata handler #cf578bd
- Added SECURITY.md #d3d93b0
- finalised client APIs and authentication method #d4e2dc8
- Update README.md #db916bf
- object storage interface + utility functions #de388a9
- initial commit #e1a789f
- fixed task system #e1c1d7e
- Update file chunk.get.ts #e4339c3
- ui groundwork #e52f072
- Update changelog #eadcaa1
- check for no version in manifest generation #eb3f9f9
- break into single column store on lg devices #ecb381e
- better server side signin redirects #ef13b68
- patch signin #f3672f8
_changelog generated by_ [go-conventional-commits](https://github.com/joselitofilho/go-conventional-commits)
## Release 0.2.0-beta
### Fixes
- fix recursive dirs util #02d6346
- Fix username length requirement #0a5a649
- remove dynamic imports #0f10626
- fix for missing developers or publishers #25fc957
- split prisma schemas #2859005
- results are returned alphabetically #33d3770
- update prisma schemas #36776cc
- removed global flag #43e32b4
- properly disconnect websockets from task handler #5358f1f
- follow best practices #54c5d55
- future lenience #5c78b20
- fix width of token breaking things #61d88c3
- fixed websocket authentication #62ea9a1
- fix delta manifest generation #6df560c
- admin invitation w/ system user #8463e35
- properly import icons #8945196
- prisma create footprint #952ece8
- game panel now always shows 3 lines exactly #9c2249e
- remove unnecessary import #a361c38
- fix disconnect code #a8f2106
- fix types #b511b40
- add drop-base as git submodule #b75ebd1
- Update README.md with discord link #c6bb21d
- fix expires requirement in the admin endpoint #c7b675f
- fix always being created as admin #c7eb11a
- moved icons and created PlatformClient so we can use the enum on the frontend #cada630
- recurse submodules #db103de
- fix FATAL: "root"... message #dbb315a
- only show versions that are directories #ef8f3ae
### Features
- update prisma & delete games #089c3e0
- manual handshake #12e3125
- fetch game endpoint #1f4d075
- under the hood organisation and consolidation #26a31f6
- 'no images' slide on image carousel #28baabc
- improve feedback when metadata fails #2c19e13
- introduction of 'system user' #2c21a23
- change name, description and icon #2cfe75a
- 'manual' metadata provider #2f52a16
- add disabled state #38fc6b8
- overhauled version importing #39d7ce7
- automatically create library folder if it doesn't exist #39fe9d5
- smoother bar in admin task ui #4488ae2
- add noWrapper option #4f9b949
- add version metadata route #5393db3
- completed admin UI, with minor changes to backend #599da0e
- adjust gradient #5a1f841
- keep track of last connected #69e4c25
- added notification system w/ interwoven refactoring #6e6f09d
- content length header for chunk downloads #76bceb1
- add title to tab #7b0756c
- add button to open in admin panel #7b3b919
- client capability framework + peer API configuration #7d72a86
- customisable image carousel and new layout #937954f
- support more types #9b12d45
- generate a server certificate for mtls APIs #9c4b6f3
- new endpoints, ui and beginnings of main store page #9cbdcbc
- backend #a309651
- more subtle design improvements #a815542
- add aden's carousel pagination design #a86045c
- add header #a8a152e
- client side search #b50e27f
- new ws handler #bc0c47c
- user widget now redirects to actual page #bfafe02
- require lowercase usernames #d7160ab
- more ui improvements #e408ac5
- add modifying game descriptions #e505e58
- mobile nav #e5cf13f
- slightly improved game page #e796b46
- game carousel #ecc819e
- add enum dictionary type #f2e0182
- improved ux #f3ed0f6
- cleanup and raw accessors #f7d767d
- add support for overriding UMU id #fd4a7d1
- add .sh for linux #fe9373a
### Other Changes
- quexeky <git@quexeky.dev>
- fixed manifest generation #03a37f7
- manual ci/cd #03b0b0c
- ability to fetch client certs for p2p #0a715fe
- disable tls in build #0f80fcd
- Updated README.md #17971e0
- Merge pull request #18 from Drop-OSS/develop
- initial work on metadata system #196f87c
- more ui #1bd19ad
- remove log statements #1d5e1bd
- small fixes & SSR disabled #1f575b2
- update information and setup guide #2236622
- metadata engine #22ac7f6
- Update CONTRIBUTING.md #2309407
- slight bug fixes and clean up #24a0d11
- almst complete admin ui and initial store designs #27070b6
- handshakes #2b4382d
- user mobile header #2e44ef3
- more consistent naming for globals #305de9f
- replaced markdown-it with micromark #31e8359
- fixes to store page for mobile clients #328b9ba
- game version re-ordering #329c74d
- verbose yarn install #36568c3
- patch for no version check in manifest generation #395219d
- migrate bcrypt to bcryptjs #3a51c9c
- added download chunk endpoint #3dd6062
- Update README.md #425934d
- build only ci #4273a20
- object storage + full permission system + testing #435551c
- rename admin socket session map #44c6028
- bump droplet and add vue carousel #46551f9
- version importing #46c8f0c
- back to yarn, with nuxt telemetry force disabled #46d35ad
- finished object endpoints #486bce8
- update dependencies and add note about optional dependencies #4fa771a
- use configuration from docs for ci/cd #52315d0
- slight fixes to register logic #583301f
- removed yarn.lock #584bcf1
- Version bump #5f29c28
- immutable application settings framework #5fe2036
- fixed docker daemon location #62a111b
- copy autodevops configuration #6328c24
- Delete .gitlab-ci.yml #69f341b
- admin ui shell #6b5e48d
- bump @drop/droplet version for windows developers #6ba5cdd
- Add LICENSE #6e2dc89
- custom dind #716eac7
- task API #718f5ba
- use gitlab ci variable declaration #7194d35
- move icons into dedicated folder #74fa671
- another stage of client authentication #7523e53
- refactoring #7869043
- moved windows logo into logos dir #789d3ba
- updated text colours across app #7a88f4c
- starting docs infra #7d2a1c6
- more cleaning #7e17626
- slight patch to rename query to be more consistent #7f4db0c
- move to raw docker #803752e
- server side and user client side completed for registration #848a611
- beginnings of download implementation #8674ac7
- more consistent naming for object handler #87230fb
- use autodevops build stage #886beb6
- Updated tailwind config #88c95d6
- change name of store file #8999303
- split prisma schemas #9011cf5
- client initiate #909432a
- more client routes to support Drop app update #91b7e10
- additional polish and QoL features #93bc143
- upload images to games #9b7ee4e
- migrate to pnpm due to ci/cd issues with yarn #9cb2d6d
- run yarn install in CI/CD non interactively #a208fbe
- completed game importing; partial work on version importing #a7c33e7
- remove canvas from dependencies #a8f58eb
- fix registry authentication #ad25d3e
- consolidate type utils #adb4b73
- Updated README.md #b0ef675
- add proper carousel to store page #b2ab827
- move to yarn v2 #b744671
- remove client API deadweight #b9ae26c
- add expires field #be6c30d
- ca groundwork #bfafd2a
- cleanup & polish #c355f6f
- remove bcrypt (debug) #c3914cc
- non rounded bottom #c4391d3
- failed gracefully on invalid chunk index #c4a3e4e
- update deploy template #c4a419f
- migrate to new droplet ca system #c4d8113
- docker based deployment #c5d00b4
- updated CONTRIBUTING.md #cd0d2bf
- update prisma version #ce0a9ab
- README update #ceacd84
- patch metadata handler #cf578bd
- Added SECURITY.md #d3d93b0
- finalised client APIs and authentication method #d4e2dc8
- Update README.md #db916bf
- object storage interface + utility functions #de388a9
- initial commit #e1a789f
- fixed task system #e1c1d7e
- Update file chunk.get.ts #e4339c3
- ui groundwork #e52f072
- Update changelog #eadcaa1
- check for no version in manifest generation #eb3f9f9
- break into single column store on lg devices #ecb381e
- better server side signin redirects #ef13b68
- patch signin #f3672f8
_changelog generated by_ [go-conventional-commits](https://github.com/joselitofilho/go-conventional-commits)
## Release 0.1.0-beta
### Fixes
- remove dynamic imports #0f10626
- fix for missing developers or publishers #25fc957
- split prisma schemas #2859005
- results are returned alphabetically #33d3770
- properly disconnect websockets from task handler #5358f1f
- follow best practices #54c5d55
- future lenience #5c78b20
- fixed websocket authentication #62ea9a1
- fix delta manifest generation #6df560c
- admin invitation w/ system user #8463e35
- properly import icons #8945196
- prisma create footprint #952ece8
- game panel now always shows 3 lines exactly #9c2249e
- remove unnecessary import #a361c38
- fix types #b511b40
- fix expires requirement in the admin endpoint #c7b675f
- moved icons and created PlatformClient so we can use the enum on the frontend #cada630
- only show versions that are directories #ef8f3ae
### Features
- update prisma & delete games #089c3e0
- fetch game endpoint #1f4d075
- under the hood organisation and consolidation #26a31f6
- introduction of 'system user' #2c21a23
- automatically create library folder if it doesn't exist #39fe9d5
- smoother bar in admin task ui #4488ae2
- add version metadata route #5393db3
- completed admin UI, with minor changes to backend #599da0e
- keep track of last connected #69e4c25
- added notification system w/ interwoven refactoring #6e6f09d
- content length header for chunk downloads #76bceb1
- add title to tab #7b0756c
- add button to open in admin panel #7b3b919
- client capability framework + peer API configuration #7d72a86
- generate a server certificate for mtls APIs #9c4b6f3
- new endpoints, ui and beginnings of main store page #9cbdcbc
- more subtle design improvements #a815542
- add header #a8a152e
- client side search #b50e27f
- new ws handler #bc0c47c
- user widget now redirects to actual page #bfafe02
- require lowercase usernames #d7160ab
- more ui improvements #e408ac5
- slightly improved game page #e796b46
- game carousel #ecc819e
- add enum dictionary type #f2e0182
- cleanup and raw accessors #f7d767d
- add support for overriding UMU id #fd4a7d1
### Other Changes
- quexeky <git@quexeky.dev>
- fixed manifest generation #03a37f7
- manual ci/cd #03b0b0c
- ability to fetch client certs for p2p #0a715fe
- disable tls in build #0f80fcd
- Updated README.md #17971e0
- initial work on metadata system #196f87c
- more ui #1bd19ad
- remove log statements #1d5e1bd
- small fixes & SSR disabled #1f575b2
- update information and setup guide #2236622
- metadata engine #22ac7f6
- Update CONTRIBUTING.md #2309407
- slight bug fixes and clean up #24a0d11
- almst complete admin ui and initial store designs #27070b6
- handshakes #2b4382d
- user mobile header #2e44ef3
- more consistent naming for globals #305de9f
- replaced markdown-it with micromark #31e8359
- fixes to store page for mobile clients #328b9ba
- game version re-ordering #329c74d
- verbose yarn install #36568c3
- patch for no version check in manifest generation #395219d
- migrate bcrypt to bcryptjs #3a51c9c
- added download chunk endpoint #3dd6062
- Update README.md #425934d
- build only ci #4273a20
- object storage + full permission system + testing #435551c
- rename admin socket session map #44c6028
- bump droplet and add vue carousel #46551f9
- version importing #46c8f0c
- back to yarn, with nuxt telemetry force disabled #46d35ad
- finished object endpoints #486bce8
- update dependencies and add note about optional dependencies #4fa771a
- use configuration from docs for ci/cd #52315d0
- slight fixes to register logic #583301f
- removed yarn.lock #584bcf1
- Version bump #5f29c28
- immutable application settings framework #5fe2036
- fixed docker daemon location #62a111b
- copy autodevops configuration #6328c24
- Delete .gitlab-ci.yml #69f341b
- admin ui shell #6b5e48d
- bump @drop/droplet version for windows developers #6ba5cdd
- Add LICENSE #6e2dc89
- task API #718f5ba
- use gitlab ci variable declaration #7194d35
- move icons into dedicated folder #74fa671
- another stage of client authentication #7523e53
- refactoring #7869043
- moved windows logo into logos dir #789d3ba
- updated text colours across app #7a88f4c
- starting docs infra #7d2a1c6
- more cleaning #7e17626
- slight patch to rename query to be more consistent #7f4db0c
- move to raw docker #803752e
- server side and user client side completed for registration #848a611
- beginnings of download implementation #8674ac7
- more consistent naming for object handler #87230fb
- use autodevops build stage #886beb6
- Updated tailwind config #88c95d6
- change name of store file #8999303
- split prisma schemas #9011cf5
- client initiate #909432a
- more client routes to support Drop app update #91b7e10
- additional polish and QoL features #93bc143
- upload images to games #9b7ee4e
- migrate to pnpm due to ci/cd issues with yarn #9cb2d6d
- run yarn install in CI/CD non interactively #a208fbe
- completed game importing; partial work on version importing #a7c33e7
- remove canvas from dependencies #a8f58eb
- fix registry authentication #ad25d3e
- consolidate type utils #adb4b73
- Updated README.md #b0ef675
- add proper carousel to store page #b2ab827
- move to yarn v2 #b744671
- remove client API deadweight #b9ae26c
- add expires field #be6c30d
- ca groundwork #bfafd2a
- cleanup & polish #c355f6f
- remove bcrypt (debug) #c3914cc
- non rounded bottom #c4391d3
- failed gracefully on invalid chunk index #c4a3e4e
- update deploy template #c4a419f
- migrate to new droplet ca system #c4d8113
- docker based deployment #c5d00b4
- updated CONTRIBUTING.md #cd0d2bf
- update prisma version #ce0a9ab
- README update #ceacd84
- patch metadata handler #cf578bd
- Added SECURITY.md #d3d93b0
- finalised client APIs and authentication method #d4e2dc8
- Update README.md #db916bf
- object storage interface + utility functions #de388a9
- initial commit #e1a789f
- fixed task system #e1c1d7e
- Update file chunk.get.ts #e4339c3
- ui groundwork #e52f072
- check for no version in manifest generation #eb3f9f9
- break into single column store on lg devices #ecb381e
- better server side signin redirects #ef13b68
- patch signin #f3672f8
_changelog generated by_ [go-conventional-commits](https://github.com/joselitofilho/go-conventional-commits)
-1
View File
@@ -1 +0,0 @@
use flake
-4
View File
@@ -1,4 +0,0 @@
/target
logs/
.vscode
.direnv
-3396
View File
File diff suppressed because it is too large Load Diff
-27
View File
@@ -1,27 +0,0 @@
[package]
name = "downpour"
version = "0.1.0"
edition = "2024"
[dependencies]
anyhow = "1.0.100"
async-trait = "0.1.89"
chrono = "0.4.43"
clap = { version = "4.5.54", features = ["derive"] }
console = "0.16.2"
dialoguer = "0.12.0"
dirs = "6.0.0"
droplet-rs = { path = "../libraries/droplet" }
fern = { version = "0.7.1", features = ["colored"] }
futures = "0.3.31"
indicatif = "0.18.3"
log = "0.4.29"
opendal = { version = "0.55.0", features = ["services-s3"] }
rand = "0.9.3"
reqwest = { version = "0.13.1", features = ["json"] }
serde = { version = "1.0.228", features = ["derive"] }
serde_json = "1.0.148"
tokio = { version = "1.48.0", features = ["fs", "macros"] }
tokio-util = { version = "0.7.18", features = ["compat"] }
url = "2.5.8"
webbrowser = "1.0.6"
-3
View File
@@ -1,3 +0,0 @@
# CLI (`downpour`)
The cli way to access Drop. Used for admin tasks that require local access, like uploading game content.
-96
View File
@@ -1,96 +0,0 @@
{
"nodes": {
"flake-utils": {
"inputs": {
"systems": "systems"
},
"locked": {
"lastModified": 1731533236,
"narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=",
"owner": "numtide",
"repo": "flake-utils",
"rev": "11707dc2f618dd54ca8739b309ec4fc024de578b",
"type": "github"
},
"original": {
"owner": "numtide",
"repo": "flake-utils",
"type": "github"
}
},
"nixpkgs": {
"locked": {
"lastModified": 1768564909,
"narHash": "sha256-Kell/SpJYVkHWMvnhqJz/8DqQg2b6PguxVWOuadbHCc=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "e4bae1bd10c9c57b2cf517953ab70060a828ee6f",
"type": "github"
},
"original": {
"owner": "NixOS",
"ref": "nixos-unstable",
"repo": "nixpkgs",
"type": "github"
}
},
"nixpkgs_2": {
"locked": {
"lastModified": 1744536153,
"narHash": "sha256-awS2zRgF4uTwrOKwwiJcByDzDOdo3Q1rPZbiHQg/N38=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "18dd725c29603f582cf1900e0d25f9f1063dbf11",
"type": "github"
},
"original": {
"owner": "NixOS",
"ref": "nixpkgs-unstable",
"repo": "nixpkgs",
"type": "github"
}
},
"root": {
"inputs": {
"flake-utils": "flake-utils",
"nixpkgs": "nixpkgs",
"rust-overlay": "rust-overlay"
}
},
"rust-overlay": {
"inputs": {
"nixpkgs": "nixpkgs_2"
},
"locked": {
"lastModified": 1768704795,
"narHash": "sha256-Y33TAp2BHEcuspYvcmBXXD0qdvjftv73PwyKTDOjoSY=",
"owner": "oxalica",
"repo": "rust-overlay",
"rev": "4b7472a78857ac789fb26616040f55cfcbd36c6e",
"type": "github"
},
"original": {
"owner": "oxalica",
"repo": "rust-overlay",
"type": "github"
}
},
"systems": {
"locked": {
"lastModified": 1681028828,
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
"owner": "nix-systems",
"repo": "default",
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
"type": "github"
},
"original": {
"owner": "nix-systems",
"repo": "default",
"type": "github"
}
}
},
"root": "root",
"version": 7
}
-52
View File
@@ -1,52 +0,0 @@
{
description = "Drop-OSS app development environment";
inputs = {
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
flake-utils.url = "github:numtide/flake-utils";
rust-overlay.url = "github:oxalica/rust-overlay";
};
outputs =
{
self,
nixpkgs,
flake-utils,
rust-overlay,
}:
flake-utils.lib.eachDefaultSystem (
system:
let
overlays = [ (import rust-overlay) ];
pkgs = import nixpkgs {
inherit system overlays;
};
libraries = with pkgs; [
glib
glibc
openssl
];
in
{
devShells.default = pkgs.mkShell {
nativeBuildInputs = with pkgs; [
pkg-config
git
rust-bin.nightly.latest.default
rust-analyzer
cargo-expand
];
buildInputs = libraries;
shellHook = ''
export LD_LIBRARY_PATH="${
pkgs.lib.makeLibraryPath libraries
}:$LD_LIBRARY_PATH"
echo "Downpour development environment loaded"
'';
};
}
);
}
-2
View File
@@ -1,2 +0,0 @@
[toolchain]
channel = "nightly"
-10
View File
@@ -1,10 +0,0 @@
# Downpour CLI spec
`downpour [command] --opts`
## Commands:
- new <path/s3 name> <public endpoint> - creates/initalizes a depot at the endpoint. Creates manifest.json and speedtest
- connect <s3 endpoint> <key> <secret> [name] - connects to an s3 endpoint and saves the endpoint to some sort of credentials file. Name is either as provided or the hostname of the endpoint
- upload <game id> <localpath> <path/s3 name> - uploads game as described before. Should fail if depot isn't initialized with new from above
- copy <game id> <version id> <src path/s3 name> <dest path/s3 name> - copies between two depots
- mark [exists/absent] <game id> <version id> <path/s3 name> - modifies depot's manifest.json to show content exists or is absent without copying (for third party copies)
- rename <public endpoint> <new public endpoint> - renames an endpoint [NEEDS API ROUTES - can't do yet]
- delete <public endpoint> - delete an endpoint [NEEDS API ROUTES - can't do yet]
-69
View File
@@ -1,69 +0,0 @@
use clap::{Args, Parser, Subcommand, ValueEnum};
use crate::{commands::connect::config_option::ConfigOptionCli, interactive_variable};
#[derive(Parser)]
#[command(version, about, long_about = None)]
pub struct Cli {
#[command(subcommand)]
pub command: Commands,
/// Specify data file path
#[arg(short, long)]
pub data: Option<String>,
}
#[derive(Subcommand)]
pub enum Commands {
/// Configures downpour endpoints
Connect {
#[arg(short, long)]
name: Option<String>,
#[command(subcommand)]
option: ConfigOptionCli,
},
/// Uploads new game version to depot
Upload {
#[clap(flatten)]
info: UploadInfoCli,
#[arg(short, long)]
/// Alias of a given connection
name: Option<String>,
},
}
#[derive(Args)]
pub struct UploadInfo {
pub path: String,
pub game_id: String,
pub version_id: String,
}
#[derive(Args)]
pub struct UploadInfoCli {
/// Relative path to new version files
#[arg(short, long, default_value_t = String::from("."))]
pub path: String,
/// ID of game to attach to
#[arg(short, long)]
pub game_id: Option<String>,
/// Version ID to attach to
#[arg(short, long)]
pub version_id: Option<String>,
}
impl UploadInfoCli {
pub fn interactive_configure(self) -> UploadInfo {
let path = self.path;
interactive_variable!(self, game_id, "Game ID");
interactive_variable!(self, version_id, "Version ID");
UploadInfo {
path,
game_id,
version_id,
}
}
}
#[derive(ValueEnum, Copy, Clone, Debug, PartialEq, Eq)]
pub enum UploadStyle {
S3,
}
-152
View File
@@ -1,152 +0,0 @@
use crate::{
commands::connect::{
config_option::{ConfigOption, ConfigOptionCli},
configurable::Configure,
speedtest::{SPEEDTEST_PATH, Speedtest},
},
manifest::DepotManifest,
};
use dialoguer::{Confirm, theme::ColorfulTheme};
use futures::AsyncWriteExt;
use indicatif::{ProgressBar, ProgressStyle};
use log::{debug, info};
use opendal::Operator;
use serde::{Deserialize, Serialize};
use std::{collections::HashMap, fs, ops::Not};
use tokio_util::compat::FuturesAsyncWriteCompatExt;
const CONFIG_DIR: &str = "downpour/config.json";
#[derive(Serialize, Deserialize)]
pub struct Config {
configurations: HashMap<String, ConfigOption>,
active: Option<String>,
}
impl Config {
pub fn new() -> Self {
Self {
configurations: HashMap::new(),
active: None,
}
}
pub fn exists(&self, name: &String) -> bool {
self.configurations.contains_key(name)
}
pub fn save(&self) -> anyhow::Result<()> {
let json = serde_json::to_string(self)?;
let save_path = dirs::config_dir()
.expect("Apparently your home directory doesn't exist") // Should probably formalise that error
.join(CONFIG_DIR);
fs::create_dir_all(save_path.parent().unwrap())?;
fs::write(save_path, json)?;
Ok(())
}
pub fn read() -> Self {
let save_path = dirs::config_dir()
.expect("Apparently your home directory doesn't exist") // Should probably formalise that error
.join(CONFIG_DIR);
if fs::exists(&save_path)
.unwrap_or_else(|_| panic!("Could not read save path {:#?}", &save_path))
{
serde_json::from_str(&fs::read_to_string(save_path).unwrap()).unwrap()
} else {
Config::new()
}
}
pub fn add_item(&mut self, name: String, object: ConfigOption) {
if matches!(object, ConfigOption::S3(..)) {
self.active = Some(name.clone())
}
self.configurations.insert(name, object);
self.save().expect("Failed to save config");
}
pub fn get_active(&self) -> Option<&ConfigOption> {
if let Some(active) = &self.active {
self.configurations.get(active)
} else {
None
}
}
pub fn get<T: AsRef<str>>(&self, name: T) -> Option<&ConfigOption> {
self.configurations.get(name.as_ref())
}
}
pub async fn manage_configuration(
config: &mut Config,
name: Option<String>,
option: ConfigOptionCli,
) -> anyhow::Result<()> {
let mut name = name;
if let Some(name) = &name
&& config.exists(name)
{
let confirm = Confirm::with_theme(&ColorfulTheme::default())
.with_prompt(format!(
"An entry already exists with the name \"{}\". Would you like to overwrite it?",
name
))
.interact()?;
if !confirm {
return Err(anyhow::anyhow!("User cancelled action"));
}
}
let config_option = match option {
ConfigOptionCli::S3(s3_config_cli) => s3_config_cli.clone().configure(&mut name).await?,
};
let name = name.expect("Default name was not provided by ConfigOption. This is a bug");
config.add_item(name, config_option.clone());
let operator = config_option.build()?;
generate_manifest(&operator).await?;
info!("Finished uploading manifest");
generate_speedtest(&operator).await?;
info!("Finished uploading speedtest");
Ok(())
}
async fn generate_speedtest(operator: &Operator) -> anyhow::Result<()> {
// Workaround to operator.exists("...") also logging a 404 warning
let lister = operator.list_with(SPEEDTEST_PATH).limit(1).await?;
if lister.is_empty().not() {
info!("Speedtest already exists on Depot. Skipping speedtest upload...");
return Ok(());
}
let mut writer = operator
.writer(SPEEDTEST_PATH)
.await?
.into_futures_async_write()
.compat_write();
let progress_bar = ProgressBar::new(10_000).with_style(
ProgressStyle::default_bar()
.template("[{elapsed_precise}] [ETA {eta}] {bar} {percent_precise}%")
.unwrap(),
);
let mut reader = Speedtest::new(|progress| {
let progress_int = (progress * 100f32).round() as u64;
progress_bar.set_position(progress_int);
});
let written = tokio::io::copy(&mut reader, &mut writer).await?;
progress_bar.finish();
debug!("Wrote {} bytes to {:?}", written, operator.info());
writer.into_inner().close().await?;
debug!("Closed writer");
Ok(())
}
async fn generate_manifest(operator: &Operator) -> anyhow::Result<()> {
let lister = operator.list_with("manifest.json").limit(1).await?;
if lister.is_empty().not() {
info!("Manifest already exists on Depot. Skipping manifest upload...");
return Ok(());
}
let data = DepotManifest::new();
operator
.write("manifest.json", serde_json::to_string(&data)?)
.await?;
Ok(())
}
-27
View File
@@ -1,27 +0,0 @@
use clap::Subcommand;
use opendal::{Operator, layers::LoggingLayer};
use serde::{Deserialize, Serialize};
use crate::{
commands::connect::s3::{S3Config, S3ConfigCli},
operator_builder::OperatorBuilder,
};
#[derive(Subcommand, Clone)]
pub enum ConfigOptionCli {
// Connect to any S3-compatible endpoint
S3(S3ConfigCli),
}
#[derive(Serialize, Deserialize, Clone)]
pub enum ConfigOption {
S3(S3Config),
}
impl ConfigOption {
pub fn build(&self) -> anyhow::Result<Operator> {
Ok(match self {
ConfigOption::S3(s3_config) => s3_config.build()?,
}
.layer(LoggingLayer::default()))
}
}
-5
View File
@@ -1,5 +0,0 @@
use crate::commands::connect::config_option::ConfigOption;
pub trait Configure {
async fn configure(self, name: &mut Option<String>) -> anyhow::Result<ConfigOption>;
}
-47
View File
@@ -1,47 +0,0 @@
use std::str::FromStr;
use dialoguer::{Input, theme::ColorfulTheme};
#[macro_export]
macro_rules! interactive_variable {
($value:ident, $var:ident, $prompt:expr) => {
let $var = if let Some($var) = $value.$var {
$var
} else {
$crate::commands::connect::interactive::query_variable($prompt).unwrap()
};
};
}
#[macro_export]
macro_rules! interactive_optional_variable {
($value:ident, $var:ident, $prompt:expr) => {
let $var = if let Some($var) = $value.$var {
Some($var)
} else {
$crate::commands::connect::interactive::query_optional_variable($prompt).unwrap()
};
};
}
pub fn query_variable<T: Clone + FromStr + ToString>(prompt: impl ToString) -> dialoguer::Result<T>
where
<T as FromStr>::Err: ToString,
{
Input::with_theme(&ColorfulTheme::default())
.with_prompt(prompt.to_string())
.interact_text()
}
pub fn query_optional_variable<T: Clone + FromStr + ToString>(
prompt: impl ToString,
) -> dialoguer::Result<Option<T>>
where
<T as FromStr>::Err: ToString,
{
let input: T = Input::with_theme(&ColorfulTheme::default())
.with_prompt(prompt.to_string())
.allow_empty(true)
.interact_text()?;
if input.to_string().is_empty() {
return Ok(None);
}
Ok(Some(input))
}
-7
View File
@@ -1,7 +0,0 @@
pub mod config;
pub mod configurable;
pub mod s3;
#[macro_use]
pub mod interactive;
pub mod config_option;
pub mod speedtest;
-67
View File
@@ -1,67 +0,0 @@
use clap::Args;
use opendal::Operator;
use serde::{Deserialize, Serialize};
use crate::{
commands::connect::{config_option::ConfigOption, configurable::Configure},
interactive_variable,
operator_builder::OperatorBuilder,
};
#[derive(Args, Clone)]
pub struct S3ConfigCli {
key_id: Option<String>,
secret_key: Option<String>,
endpoint: Option<String>,
region: Option<String>,
bucket_name: Option<String>,
root: Option<String>,
}
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct S3Config {
key_id: String,
secret_key: String,
endpoint: String,
region: String,
bucket_name: String,
root: Option<String>,
}
impl Configure for S3ConfigCli {
async fn configure(self, name: &mut Option<String>) -> anyhow::Result<ConfigOption> {
interactive_variable!(self, key_id, "S3 Key ID");
interactive_variable!(self, secret_key, "S3 Secret Key");
interactive_variable!(self, region, "S3 Region");
interactive_variable!(self, bucket_name, "S3 Bucket Name");
interactive_variable!(self, endpoint, "S3 Endpoint");
if let None = name {
*name = Some(endpoint.clone());
}
Ok(ConfigOption::S3(S3Config {
secret_key,
key_id,
region,
bucket_name,
endpoint,
root: self.root,
}))
}
}
impl OperatorBuilder for S3Config {
fn build(&self) -> anyhow::Result<Operator> {
let builder = opendal::services::S3::default()
.access_key_id(&self.key_id)
.secret_access_key(&self.secret_key)
.region(&self.region)
.endpoint(&self.endpoint)
.root(self.root.as_deref().unwrap_or("/"))
.bucket(&self.bucket_name)
.disable_config_load();
let op: Operator = Operator::new(builder)?.finish();
Ok(op)
}
}
-41
View File
@@ -1,41 +0,0 @@
use rand::{RngCore, SeedableRng, rng, rngs::StdRng};
use tokio::io::AsyncRead;
#[derive(Clone, Debug)]
pub struct Speedtest<F: Fn(f32)> {
core: rand::rngs::StdRng,
to_write: usize,
callback: Box<F>,
}
pub const SPEEDTEST_BYTES: usize = 64 * 1024 * 1024;
pub const SPEEDTEST_PATH: &str = "speedtest";
impl<F: Fn(f32)> AsyncRead for Speedtest<F> {
fn poll_read(
self: std::pin::Pin<&mut Self>,
_cx: &mut std::task::Context<'_>,
buf: &mut tokio::io::ReadBuf<'_>,
) -> std::task::Poll<std::io::Result<()>> {
let mut s = self;
let to_write = buf.remaining().min(s.to_write);
let filled = {
let fill_slice = buf.initialize_unfilled_to(to_write);
s.core.fill_bytes(fill_slice);
fill_slice.len()
};
s.to_write = s.to_write.saturating_sub(filled);
(s.callback)((1f32 - (s.to_write as f32 / SPEEDTEST_BYTES as f32)) * 100f32);
buf.advance(filled);
std::task::Poll::Ready(Ok(()))
}
}
impl<F: Fn(f32)> Speedtest<F> {
pub fn new(callback: F) -> Self {
Self {
core: StdRng::from_rng(&mut rng()),
to_write: SPEEDTEST_BYTES,
callback: Box::new(callback),
}
}
}
-2
View File
@@ -1,2 +0,0 @@
pub mod connect;
pub mod upload;
-79
View File
@@ -1,79 +0,0 @@
use std::path::Path;
use crate::{
cli::UploadInfo,
commands::connect::{config::Config, config_option::ConfigOption},
manifest::{ClosureFactory, CompressionOption, DepotManifest, generate_v2_manifest},
operator_builder::OperatorBuilder,
};
use futures::AsyncWriteExt;
use log::info;
use opendal::{FuturesAsyncWriter, Operator};
use tokio_util::compat::{Compat, FuturesAsyncWriteCompatExt};
pub async fn upload(
upload_info: &UploadInfo,
config: Config,
name: &Option<String>,
) -> anyhow::Result<()> {
let game_id = upload_info.game_id.clone();
let path = upload_info.path.clone();
let version_id = upload_info.version_id.clone();
let operator = get_operator(config, name)?;
let mut existing_depot_manifest = get_depot_manifest(&operator).await?;
info!("Uploading chunks");
let v2_manifest = generate_v2_manifest(
Path::new(&path),
ClosureFactory::new(
async move |id: String| {
info!("Uploading chunk id {id}");
let writer = operator
.writer(&format!("{game_id}/{version_id}/{id}"))
.await
.unwrap()
.into_futures_async_write()
.compat_write();
writer
},
|writer: Compat<FuturesAsyncWriter>| async {
writer.into_inner().close().await.unwrap();
},
),
)
.await?;
info!("Finished uploading chunks");
existing_depot_manifest.append(
upload_info.game_id.to_string(),
upload_info.version_id.to_string(),
CompressionOption::None,
);
Ok(())
}
async fn get_depot_manifest(operator: &Operator) -> Result<DepotManifest, anyhow::Error> {
let existing_depot_manifest = operator.read("manifest.json").await?.to_bytes();
let existing_depot_manifest: DepotManifest =
serde_json::from_slice(existing_depot_manifest.as_ref())?;
Ok(existing_depot_manifest)
}
fn get_operator(config: Config, name: &Option<String>) -> anyhow::Result<Operator> {
let operator = match if let Some(name) = name {
config
.get(name)
.ok_or(anyhow::anyhow!("Name does not exist"))?
} else {
config.get_active().ok_or(anyhow::anyhow!(
"No active connection set. Please specify with --name"
))?
} {
ConfigOption::S3(s3_config) => s3_config.build()?,
};
Ok(operator)
}
-1
View File
@@ -1 +0,0 @@
pub mod interface;
-53
View File
@@ -1,53 +0,0 @@
use fern::colors::{Color, ColoredLevelConfig};
use log::LevelFilter;
use std::env;
use std::fs;
use std::io;
pub fn configure_logging() -> anyhow::Result<()> {
let log_level = env::var("RUST_LOG")
.unwrap_or_else(|_| "info".to_string())
.parse::<LevelFilter>()?;
let log_dir = env::var("LOG_FILE_DIR").unwrap_or_else(|_| "logs".to_string());
fs::create_dir_all(&log_dir)?;
let colors = ColoredLevelConfig::new()
.error(Color::Red)
.warn(Color::Yellow)
.info(Color::Blue)
.debug(Color::Green)
.trace(Color::Magenta);
fern::Dispatch::new()
.chain(
fern::Dispatch::new()
.format(move |out, message, record| {
out.finish(format_args!(
"[{}] {}: {}",
chrono::Local::now().format("%H:%M:%S%.3f"),
colors.color(record.level()),
message
))
})
.chain(io::stdout()),
)
.chain(
fern::Dispatch::new()
.format(|out, message, record| {
out.finish(format_args!(
"[{}] {} {} - {}",
chrono::Local::now().format("%Y-%m-%d %H:%M:%S%.3f"),
record.level(),
record.target(),
message
))
})
.chain(fern::log_file(format!("{}/app.log", log_dir))?),
)
.level(log_level)
.apply()?;
Ok(())
}
-34
View File
@@ -1,34 +0,0 @@
#![feature(async_fn_traits)]
use crate::commands::connect::config::manage_configuration;
use crate::{
cli::{Cli, Commands},
commands::connect::config::Config,
commands::upload,
};
use clap::Parser;
mod cli;
mod commands;
mod logging;
mod manifest;
mod operator_builder;
#[tokio::main]
async fn main() -> anyhow::Result<()> {
crate::logging::configure_logging()?;
let cli = Cli::parse();
let mut config = Config::read();
match cli.command {
Commands::Connect { name, option } => {
manage_configuration(&mut config, name, option).await?
}
Commands::Upload { info, name } => {
let info = info.interactive_configure();
upload::interface::upload(&info, config, &name).await?;
}
};
Ok(())
}
-114
View File
@@ -1,114 +0,0 @@
use std::{collections::HashMap, path::Path};
use async_trait::async_trait;
use droplet_rs::manifest::{Manifest, ManifestWriterFactory, generate_manifest_rusty};
use indicatif::{ProgressBar, ProgressStyle};
use log::info;
use serde::{Deserialize, Serialize};
use tokio::io::AsyncWrite;
#[derive(Serialize, Deserialize)]
pub struct DepotManifest {
content: HashMap<String, DepotManifestGameData>,
}
#[derive(Serialize, Deserialize)]
struct DepotManifestGameData {
version_id: String,
compression: CompressionOption,
}
#[derive(Serialize, Deserialize)]
pub enum CompressionOption {
None,
Gzip,
Zstd,
}
impl DepotManifest {
pub fn new() -> Self {
Self {
content: HashMap::new(),
}
}
pub fn append(&mut self, game_id: String, version_id: String, compression: CompressionOption) {
self.content.insert(
game_id,
DepotManifestGameData {
version_id,
compression,
},
);
}
}
pub struct ClosureFactory<Writer, Factory, Closer>
where
Writer: AsyncWrite + Unpin,
Factory: AsyncFn(String) -> Writer,
Closer: AsyncFn(Writer),
{
writer: Factory,
closer: Closer,
}
#[async_trait]
impl<
W: AsyncWrite + Unpin + Send + Sync,
F: AsyncFn(String) -> W + Send + Sync + 'static,
C: AsyncFn(W) + Send + Sync,
> ManifestWriterFactory for ClosureFactory<W, F, C>
where
for<'a> F::CallRefFuture<'a>: Send,
for<'b> C::CallRefFuture<'b>: Send,
{
type Writer = W;
async fn create(&self, id: String) -> anyhow::Result<Self::Writer> {
let func = &self.writer;
let output = func(id).await;
Ok(output)
}
async fn close(&self, writer: Self::Writer) -> anyhow::Result<()> {
let func = &self.closer;
func(writer).await;
Ok(())
}
}
impl<
W: AsyncWrite + Unpin + Send + Sync,
F: AsyncFn(String) -> W + Send + Sync + 'static,
C: AsyncFn(W) + Sync,
> ClosureFactory<W, F, C>
where
for<'a> F::CallRefFuture<'a>: Send,
for<'b> C::CallRefFuture<'b>: Send,
{
pub fn new(f: F, c: C) -> Self {
Self {
writer: f,
closer: c,
}
}
}
pub async fn generate_v2_manifest<Factory>(dir: &Path, factory: Factory) -> anyhow::Result<Manifest>
where
Factory: ManifestWriterFactory,
{
let progress_bar = ProgressBar::new(10_000).with_style(
ProgressStyle::default_bar()
.template("[{elapsed_precise}] [ETA {eta}] {bar} {percent_precise}%")
.unwrap(),
);
generate_manifest_rusty(
dir,
|progress| {
let progress_int = (progress * 100f32).round() as u64;
progress_bar.set_position(progress_int);
},
|log| progress_bar.suspend(|| info!("{}", log)),
Some(&factory),
None,
)
.await
}
-5
View File
@@ -1,5 +0,0 @@
use opendal::Operator;
pub trait OperatorBuilder {
fn build(&self) -> anyhow::Result<Operator>;
}
@@ -53,17 +53,10 @@ import type { Component } from "vue";
const notifications = useNotifications();
const { t } = useI18n();
const navigation: Ref<
(NavigationItem & { icon: Component; count?: number })[]
> = computed(() => [
const navigation: (NavigationItem & { icon: Component; count?: number })[] = [
{ label: t("home"), route: "/account", icon: HomeIcon, prefix: "/account" },
{
label: t("account.home.title"),
route: "/account",
icon: HomeIcon,
prefix: "/account",
},
{
label: t("account.security.title"),
label: t("security"),
route: "/account/security",
prefix: "/account/security",
icon: LockClosedIcon,
@@ -74,12 +67,6 @@ const navigation: Ref<
prefix: "/account/devices",
icon: DevicePhoneMobileIcon,
},
{
label: t("account.token.title"),
route: "/account/tokens",
prefix: "/account/tokens",
icon: CodeBracketIcon,
},
{
label: t("account.notifications.notifications"),
route: "/account/notifications",
@@ -87,13 +74,19 @@ const navigation: Ref<
icon: BellIcon,
count: notifications.value.length,
},
{
label: t("account.token.title"),
route: "/account/tokens",
prefix: "/account/tokens",
icon: CodeBracketIcon,
},
{
label: t("account.settings"),
route: "/account/settings",
prefix: "/account/settings",
icon: WrenchScrewdriverIcon,
},
]);
];
const currentPageIndex = useCurrentNavigationIndex(navigation.value);
const currentPageIndex = useCurrentNavigationIndex(navigation);
</script>
@@ -4,14 +4,7 @@
:href="`/auth/oidc?redirect=${route.query.redirect ?? '/'}`"
class="transition rounded-md grow inline-flex items-center justify-center bg-white/10 px-3.5 py-2.5 text-sm font-semibold text-white shadow-xs hover:bg-white/20"
>
<i18n-t
keypath="auth.signin.signinWithExternalProvider"
tag="span"
scope="global"
>
<template #externalProvider>{{
providerName || $t("auth.signin.externalProvider")
}}</template>
<i18n-t keypath="auth.signin.externalProvider" tag="span" scope="global">
<template #arrow>
<span aria-hidden="true">{{ $t("chars.arrow") }}</span>
</template>
@@ -22,6 +15,4 @@
<script setup lang="ts">
const route = useRoute();
const { providerName = undefined } = defineProps<{ providerName?: string }>();
</script>
@@ -12,7 +12,7 @@
v-model="username"
name="username"
type="username"
autocomplete="username webauthn"
autocomplete="username"
required
class="block w-full rounded-md border-0 py-1.5 px-3 shadow-sm bg-zinc-950/20 text-zinc-300 ring-1 ring-inset ring-zinc-800 placeholder:text-zinc-400 focus:ring-2 focus:ring-inset focus:ring-blue-600 sm:text-sm sm:leading-6"
/>
@@ -86,78 +86,36 @@
<script setup lang="ts">
import { XCircleIcon } from "@heroicons/vue/20/solid";
import {
startAuthentication,
browserSupportsWebAuthn,
} from "@simplewebauthn/browser";
import { FetchError } from "ofetch";
import type { UserModel } from "~/prisma/client/models";
const username = ref("");
const password = ref("");
const rememberMe = ref(false);
const loading = ref(false);
async function passkeyAutofill() {
let silentWebauthnOptions;
try {
silentWebauthnOptions = await $dropFetch("/api/v1/auth/passkey/start", {
method: "POST",
});
} catch {
return;
}
const result = await startAuthentication({
optionsJSON: silentWebauthnOptions,
useBrowserAutofill: true,
});
loading.value = true;
await $dropFetch("/api/v1/auth/passkey/finish", {
method: "POST",
body: result,
});
await completeSignin();
}
onMounted(async () => {
if (browserSupportsWebAuthn()) {
try {
await passkeyAutofill();
} catch (response) {
const message = (response as FetchError).message || t("errors.unknown");
error.value = message;
} finally {
loading.value = false;
}
}
});
const error = ref<string | undefined>();
const router = useRouter();
const route = useRoute();
const router = useRouter();
const { t } = useI18n();
async function signin_wrapper() {
function signin_wrapper() {
loading.value = true;
try {
await signin();
} catch (e) {
if (e instanceof FetchError) {
error.value = e.data.message || t("errors.unknown");
} else {
error.value = e as string;
}
} finally {
loading.value = false;
}
signin()
.then(() => {
router.push(route.query.redirect?.toString() ?? "/");
})
.catch((response) => {
const message = response.statusMessage || t("errors.unknown");
error.value = message;
})
.finally(() => {
loading.value = false;
});
}
async function signin() {
const { result } = await $dropFetch("/api/v1/auth/signin/simple", {
await $dropFetch("/api/v1/auth/signin/simple", {
method: "POST",
body: {
username: username.value,
@@ -165,11 +123,7 @@ async function signin() {
rememberMe: rememberMe.value,
},
});
if (result == "2fa") {
router.push({ query: route.query, path: "/auth/mfa" });
return;
}
await completeSignin();
const user = useUser();
user.value = await $dropFetch<UserModel | null>("/api/v1/user");
}
</script>
@@ -4,10 +4,9 @@
v-for="(_, i) in amount"
:key="i"
:class="[
carousel.currentSlide === i ? 'bg-blue-600 w-6' : 'bg-zinc-700 w-3',
carousel.currentSlide == i ? 'bg-blue-600 w-6' : 'bg-zinc-700 w-3',
'transition-all cursor-pointer h-2 rounded-full',
]"
@click="slideTo(i)"
/>
</div>
</template>
@@ -19,8 +18,8 @@ const carousel = inject(injectCarousel)!;
const amount = carousel.maxSlide - carousel.minSlide + 1;
function slideTo(index: number) {
const offsetIndex = index + carousel.minSlide;
carousel.nav.slideTo(offsetIndex);
}
// function slideTo(index: number) {
// const offsetIndex = index + carousel.minSlide;
// carousel.nav.slideTo(offsetIndex);
// }
</script>
@@ -10,18 +10,9 @@
d="M203.371.916c-26.013-2.078-76.686 1.963-124.73 9.946L67.3 12.749C35.421 18.062 18.2 21.766 6.004 25.934 1.244 27.561.828 27.778.874 28.61c.07 1.214.828 1.121 9.595-1.176 9.072-2.377 17.15-3.92 39.246-7.496C123.565 7.986 157.869 4.492 195.942 5.046c7.461.108 19.25 1.696 19.17 2.582-.107 1.183-7.874 4.31-25.75 10.366-21.992 7.45-35.43 12.534-36.701 13.884-2.173 2.308-.202 4.407 4.442 4.734 2.654.187 3.263.157 15.593-.78 35.401-2.686 57.944-3.488 88.365-3.143 46.327.526 75.721 2.23 130.788 7.584 19.787 1.924 20.814 1.98 24.557 1.332l.066-.011c1.201-.203 1.53-1.825.399-2.335-2.911-1.31-4.893-1.604-22.048-3.261-57.509-5.556-87.871-7.36-132.059-7.842-23.239-.254-33.617-.116-50.627.674-11.629.54-42.371 2.494-46.696 2.967-2.359.259 8.133-3.625 26.504-9.81 23.239-7.825 27.934-10.149 28.304-14.005.417-4.348-3.529-6-16.878-7.066Z"
/>
</svg>
<ApplicationLogo aria-hidden="true" class="h-6" />
<DropLogo aria-hidden="true" class="h-6" />
<span class="text-blue-400 font-display font-bold text-xl uppercase">
<template v-if="serverName">
{{ serverName }}
</template>
<template v-else>
{{ $t("drop.drop") }}
</template>
{{ $t("drop.drop") }}
</span>
</div>
</template>
<script setup lang="ts">
const { serverName } = await $dropFetch("/api/v1");
</script>
@@ -10,6 +10,6 @@ const props = defineProps<{
}>();
const url = computed(() => {
return `/api/v1/emoji/${twemoji.convert.toCodePoint(props.emoji)}`;
return `/twemoji/${twemoji.convert.toCodePoint(props.emoji)}.svg`;
});
</script>
@@ -44,9 +44,7 @@ const props = defineProps<{
width?: number;
}>();
const {
store: { showGamePanelTextDecoration },
} = await $dropFetch(`/api/v1/settings`);
const { showGamePanelTextDecoration } = await $dropFetch(`/api/v1/settings`);
const currentComponent = ref<HTMLDivElement>();
@@ -1,7 +1,7 @@
<!-- eslint-disable vue/no-v-html -->
<template>
<div v-if="game!">
<div class="grow flex flex-col xl:flex-row gap-y-8">
<div class="grow flex flex-row gap-y-8">
<div class="grow w-full h-full px-6 py-4 flex flex-col">
<div
class="flex flex-col lg:flex-row lg:justify-between items-start lg:items-center gap-2"
@@ -10,12 +10,10 @@
<!-- icon image -->
<img :src="coreMetadataIconUrl" class="size-20" />
<div>
<h1
class="text-2xl xl:text-5xl font-bold font-display text-zinc-100"
>
<h1 class="text-5xl font-bold font-display text-zinc-100">
{{ game.mName }}
</h1>
<p class="mt-1 text-sm xl:text-lg text-zinc-400">
<p class="mt-1 text-lg text-zinc-400">
{{ game.mShortDescription }}
</p>
</div>
@@ -30,28 +28,7 @@
</div>
<div class="grid grid-cols-1 lg:grid-cols-3 gap-4 pt-8">
<SelectorMultiItem
v-model="currentTags"
:items="tags"
:create="createTag"
/>
<div class="flex flex-col">
<label
for="releaseDate"
class="text-sm/6 font-medium text-zinc-100"
>
{{ $t("library.admin.game.editReleaseDate") }}
</label>
<div class="mt-2">
<input
id="releaseDate"
v-model="releaseDate"
type="date"
name="releaseDate"
class="block w-full rounded-md bg-zinc-800 px-3 py-1.5 text-base text-zinc-100 outline outline-1 -outline-offset-1 outline-zinc-700 placeholder:text-zinc-400 focus:outline focus:outline-2 focus:-outline-offset-2 focus:outline-blue-600 sm:text-sm/6"
/>
</div>
</div>
<MultiItemSelector v-model="currentTags" :items="tags" />
</div>
<!-- image carousel pick -->
@@ -467,7 +444,7 @@
</template>
<script setup lang="ts">
import type { GameModel } from "~/prisma/client/models";
import type { GameModel, GameTagModel } from "~/prisma/client/models";
import { micromark } from "micromark";
import {
CheckIcon,
@@ -477,7 +454,6 @@ import {
} from "@heroicons/vue/24/solid";
import type { SerializeObject } from "nitropack";
import type { H3Error } from "h3";
import type { AdminFetchGameType } from "~/server/api/v1/admin/game/[id]/index.get";
const showUploadModal = ref(false);
const showAddCarouselModal = ref(false);
@@ -485,9 +461,8 @@ const showAddImageDescriptionModal = ref(false);
const showEditCoreMetadata = ref(false);
const mobileShowFinalDescription = ref(true);
const game = defineModel<SerializeObject<AdminFetchGameType>>({
required: true,
});
type ModelType = SerializeObject<GameModel & { tags: Array<GameTagModel> }>;
const game = defineModel<ModelType>() as Ref<ModelType>;
if (!game.value)
throw createError({
statusCode: 500,
@@ -497,9 +472,8 @@ if (!game.value)
const currentTags = ref<{ [key: string]: boolean }>(
Object.fromEntries(game.value.tags.map((e) => [e.id, true])),
);
const rawTags = await $dropFetch("/api/v1/admin/tags");
const tags = ref(
rawTags.map((e) => ({ name: e.name, param: e.id }) satisfies StoreSortOption),
const tags = (await $dropFetch("/api/v1/admin/tags")).map(
(e) => ({ name: e.name, param: e.id }) satisfies StoreSortOption,
);
watch(
@@ -510,49 +484,18 @@ watch(
params: {
id: game.value.id,
},
body: {
tags: Object.entries(v)
.filter((v) => v[1])
.map((v) => v[0]),
},
body: { tags: Object.keys(v) },
failTitle: "Failed to update game tags",
});
},
{ deep: true },
);
const releaseDate = ref(
game.value.mReleased
? new Date(game.value.mReleased).toISOString().substring(0, 10)
: "",
);
watch(releaseDate, async (newDate) => {
const body: PatchGameBody = {};
if (newDate) {
const parsed = new Date(newDate);
if (!isNaN(parsed.getTime())) {
body.mReleased = parsed;
}
}
await $dropFetch(`/api/v1/admin/game/:id`, {
method: "PATCH",
params: {
id: game.value.id,
},
body,
failTitle: "Failed to update release date",
});
});
const { t } = useI18n();
// I don't know why I split these fields off.
const coreMetadataName = ref(game.value.mName);
const coreMetadataDescription = ref(game.value.mShortDescription);
const coreMetadataIconUrl = ref(useObject(game.value.mIconObjectId));
const coreMetadataIconFileUpload = ref<FileList | undefined>();
const coreMetadataLoading = ref(false);
@@ -618,6 +561,7 @@ function coreMetadataUpdate_wrapper() {
);
})
.then((newGame) => {
console.log(newGame);
if (!newGame) return;
Object.assign(game.value, newGame);
coreMetadataIconUrl.value = useObject(newGame.mIconObjectId);
@@ -825,15 +769,4 @@ async function updateImageCarousel() {
);
}
}
async function createTag(value: string): Promise<string> {
const tag = await $dropFetch(`/api/v1/admin/tags`, {
method: "POST",
body: {
name: value,
},
});
tags.value.push({ name: tag.name, param: tag.id });
return tag.id;
}
</script>
+196
View File
@@ -0,0 +1,196 @@
<!-- eslint-disable vue/no-v-html -->
<template>
<div v-if="game && unimportedVersions">
<div class="grow flex flex-row gap-y-8">
<div class="grow w-full h-full px-6 py-4 flex flex-col"></div>
<div
class="lg:overflow-y-auto lg:border-l lg:border-zinc-800 lg:block lg:inset-y-0 lg:z-50 lg:w-[30vw] flex flex-col gap-y-8 px-6 py-4"
>
<!-- version manager -->
<div>
<!-- version priority -->
<div>
<div class="border-b border-zinc-800 pb-3">
<div
class="flex flex-wrap items-center justify-between sm:flex-nowrap"
>
<h3
class="text-base font-semibold font-display leading-6 text-zinc-100"
>
{{ $t("library.admin.versionPriority") }}
<!-- import games button -->
<NuxtLink
:href="canImport ? `/admin/library/${game.id}/import` : ''"
type="button"
:class="[
canImport
? 'bg-blue-600 hover:bg-blue-700'
: 'bg-blue-800/50',
'inline-flex w-fit items-center gap-x-2 rounded-md px-3 py-1 text-sm font-semibold font-display text-white shadow-sm focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-blue-600',
]"
>
{{
canImport
? $t("library.admin.import.version.import")
: $t("library.admin.import.version.noVersions")
}}
</NuxtLink>
</h3>
</div>
</div>
<div class="mt-4 text-center w-full text-sm text-zinc-600">
{{ $t("lowest") }}
</div>
<draggable
:list="game.versions"
handle=".handle"
class="mt-2 space-y-4"
@update="() => updateVersionOrder()"
>
<template
#item="{ element: item }: { element: GameVersionModel }"
>
<div
class="w-full inline-flex items-center px-4 py-2 bg-zinc-800 rounded justify-between"
>
<div class="text-zinc-100 font-semibold">
{{ item.versionName }}
</div>
<div class="text-zinc-400">
{{ item.delta ? $t("library.admin.version.delta") : "" }}
</div>
<div class="inline-flex items-center gap-x-2">
<component
:is="PLATFORM_ICONS[item.platform]"
class="size-6 text-blue-600"
/>
<Bars3Icon
class="cursor-move w-6 h-6 text-zinc-400 handle"
/>
<button @click="() => deleteVersion(item.versionName)">
<TrashIcon class="w-5 h-5 text-red-600" />
</button>
</div>
</div>
</template>
</draggable>
<div
v-if="game.versions.length == 0"
class="text-center font-bold text-zinc-400 my-3"
>
{{ $t("library.admin.version.noVersionsAdded") }}
</div>
<div class="mt-2 text-center w-full text-sm text-zinc-600">
{{ $t("highest") }}
</div>
</div>
</div>
</div>
</div>
</div>
<div v-else class="grow w-full flex items-center justify-center">
<div class="flex flex-col items-center">
<ExclamationCircleIcon
class="h-12 w-12 text-red-600"
aria-hidden="true"
/>
<div class="mt-3 text-center sm:mt-5">
<h1 class="text-3xl font-semibold font-display leading-6 text-zinc-100">
{{ $t("library.admin.offlineTitle") }}
</h1>
<div class="mt-4">
<p class="text-sm text-zinc-400 max-w-md">
{{ $t("library.admin.offline") }}
</p>
</div>
</div>
</div>
</div>
</template>
<script setup lang="ts">
import type { GameModel, GameVersionModel } from "~/prisma/client/models";
import { Bars3Icon, TrashIcon } from "@heroicons/vue/24/solid";
import type { SerializeObject } from "nitropack";
import type { H3Error } from "h3";
import { ExclamationCircleIcon } from "@heroicons/vue/24/outline";
// TODO implement UI for this page
const props = defineProps<{ unimportedVersions: string[] }>();
const { t } = useI18n();
const hasDeleted = ref(false);
const canImport = computed(
() => hasDeleted.value || props.unimportedVersions.length > 0,
);
type GameAndVersions = GameModel & { versions: GameVersionModel[] };
const game = defineModel<SerializeObject<GameAndVersions>>() as Ref<
SerializeObject<GameAndVersions>
>;
if (!game.value)
throw createError({
statusCode: 500,
statusMessage: "Game not provided to editor component",
});
async function updateVersionOrder() {
try {
const newVersions = await $dropFetch("/api/v1/admin/game/version", {
method: "PATCH",
body: {
id: game.value.id,
versions: game.value.versions.map((e) => e.versionName),
},
});
game.value.versions = newVersions;
} catch (e) {
createModal(
ModalType.Notification,
{
title: t("errors.version.order.title"),
description: t("errors.version.order.desc", {
error: (e as H3Error)?.statusMessage ?? t("errors.unknown"),
}),
buttonText: t("common.close"),
},
(e, c) => c(),
);
}
}
async function deleteVersion(versionName: string) {
try {
await $dropFetch("/api/v1/admin/game/version", {
method: "DELETE",
body: {
id: game.value.id,
versionName: versionName,
},
});
game.value.versions.splice(
game.value.versions.findIndex((e) => e.versionName === versionName),
1,
);
hasDeleted.value = true;
} catch (e) {
createModal(
ModalType.Notification,
{
title: t("errors.version.delete.title"),
description: t("errors.version.delete.desc", {
error: (e as H3Error)?.statusMessage ?? t("errors.unknown"),
}),
buttonText: t("common.close"),
},
(e, c) => c(),
);
}
}
</script>
@@ -1,9 +1,6 @@
<template>
<div class="flex flex-row items-center gap-x-2">
<img
:src="rawIcon ? game.icon : useObject(game.icon)"
class="w-12 h-12 rounded-sm object-cover"
/>
<img :src="game.icon" class="w-12 h-12 rounded-sm object-cover" />
<div class="flex flex-col items-left">
<h1 class="font-semibold font-display text-lg text-zinc-100">
{{ game.name }}
@@ -21,8 +18,7 @@
<script setup lang="ts">
import type { GameMetadataSearchResult } from "~/server/internal/metadata/types";
const { game, rawIcon = true } = defineProps<{
const { game } = defineProps<{
game: Omit<GameMetadataSearchResult, "year"> & { sourceName?: string };
rawIcon?: boolean;
}>();
</script>
@@ -1,6 +1,6 @@
<template>
<div>
<SelectorLanguageListbox />
<LanguageSelectorListbox />
<NuxtLink
class="mt-1 transition text-blue-500 hover:text-blue-600 text-sm"
to="https://translate.droposs.org/engage/drop/"
@@ -1,6 +1,6 @@
<template>
<span class="text-xs font-mono text-zinc-400 inline-flex items-top gap-x-2"
><span v-if="!short" class="text-zinc-500">{{ log.time }}</span>
><span v-if="!short" class="text-zinc-500">{{ log.timestamp }}</span>
<span
:class="[
colours[log.level] || 'text-green-400',
@@ -8,8 +8,9 @@
]"
>{{ log.level }}</span
>
<span v-if="log.prefix" class="text-zinc-200"> {{ log.prefix }}</span>
<pre :class="[short ? 'line-clamp-1' : '', 'mt-[1px]']">{{ log.msg }}</pre>
<pre :class="[short ? 'line-clamp-1' : '', 'mt-[1px]']">{{
log.message
}}</pre>
</span>
</template>
@@ -11,7 +11,66 @@
</div>
<div class="mt-2">
<form @submit.prevent="() => addGame()">
<SelectorGame v-model="currentGame" :search="search" />
<Listbox v-model="currentGame" as="div">
<ListboxLabel
class="block text-sm font-medium leading-6 text-zinc-100"
>{{ $t("library.admin.import.selectGameSearch") }}</ListboxLabel
>
<div class="relative mt-2">
<ListboxButton
class="relative w-full cursor-default rounded-md bg-zinc-950 py-1.5 pl-3 pr-10 text-left text-zinc-100 shadow-sm ring-1 ring-inset ring-zinc-800 focus:outline-none focus:ring-2 focus:ring-blue-600 sm:text-sm sm:leading-6"
>
<GameSearchResultWidget
v-if="currentGame"
:game="currentGame"
/>
<span v-else class="block truncate text-zinc-600">
{{ $t("library.admin.import.selectGamePlaceholder") }}
</span>
<span
class="pointer-events-none absolute inset-y-0 right-0 flex items-center pr-2"
>
<ChevronUpDownIcon
class="h-5 w-5 text-gray-400"
aria-hidden="true"
/>
</span>
</ListboxButton>
<transition
leave-active-class="transition ease-in duration-100"
leave-from-class="opacity-100"
leave-to-class="opacity-0"
>
<ListboxOptions
class="absolute z-10 mt-1 max-h-60 w-full overflow-auto rounded-md bg-zinc-900 py-1 text-base shadow-lg ring-1 ring-black ring-opacity-5 focus:outline-none sm:text-sm"
>
<ListboxOption
v-for="result in metadataGames"
:key="result.id"
v-slot="{ active }"
as="template"
:value="result"
>
<li
:class="[
active ? 'bg-blue-600 text-white' : 'text-zinc-100',
'relative cursor-default select-none py-2 pl-3 pr-9',
]"
>
<GameSearchResultWidget :game="result" />
</li>
</ListboxOption>
<p
v-if="metadataGames.length == 0"
class="w-full text-center p-2 uppercase font-display text-zinc-700 font-bold"
>
{{ $t("library.admin.metadata.companies.addGame.noGames") }}
</p>
</ListboxOptions>
</transition>
</div>
</Listbox>
<div class="mt-6 flex items-center justify-between gap-3">
<label
id="published-label"
@@ -104,11 +163,18 @@
<script setup lang="ts">
import { ref } from "vue";
import type { GameModel } from "~/prisma/client/models";
import { DialogTitle } from "@headlessui/vue";
import {
DialogTitle,
Listbox,
ListboxButton,
ListboxLabel,
ListboxOption,
ListboxOptions,
} from "@headlessui/vue";
import type { GameMetadataSearchResult } from "~/server/internal/metadata/types";
import { FetchError } from "ofetch";
import type { SerializeObject } from "nitropack";
import { XCircleIcon } from "@heroicons/vue/24/solid";
import type { GameMetadataSearchResult } from "~/server/internal/metadata/types";
const props = defineProps<{
companyId: string;
@@ -123,11 +189,26 @@ const emit = defineEmits<{
];
}>();
const games = await $dropFetch("/api/v1/admin/game");
const metadataGames = computed(() =>
games
.filter((e) => !(props.exclude ?? []).includes(e.id))
.map(
(e) =>
({
id: e.id,
name: e.mName,
icon: useObject(e.mIconObjectId),
description: e.mShortDescription,
}) satisfies Omit<GameMetadataSearchResult, "year">,
),
);
const { t } = useI18n();
const open = defineModel<boolean>({ required: true });
const currentGame = ref<GameMetadataSearchResult>();
const currentGame = ref<(typeof metadataGames.value)[number]>();
const developed = ref(false);
const published = ref(false);
const addGameLoading = ref(false);
@@ -162,10 +243,4 @@ async function addGame() {
open.value = false;
}
}
async function search(query: string) {
return await $dropFetch("/api/v1/admin/search/game?type=Game", {
query: { q: query },
});
}
</script>
@@ -59,6 +59,7 @@ const emit = defineEmits<{
const open = defineModel<boolean>({ required: true });
const { t } = useI18n();
const collectionName = ref("");
const createCollectionLoading = ref(false);
const collections = await useCollections();
@@ -73,7 +74,6 @@ async function createCollection() {
const response = await $dropFetch("/api/v1/collection", {
method: "POST",
body: { name: collectionName.value },
failTitle: "Failed to create collection",
});
// Add the game if provided
@@ -83,7 +83,6 @@ async function createCollection() {
>(`/api/v1/collection/${response.id}/entry`, {
method: "POST",
body: { id: props.gameId },
failTitle: "Failed to add game to collection",
});
response.entries.push(entry);
}
@@ -95,6 +94,20 @@ async function createCollection() {
open.value = false;
emit("created", response.id);
} catch (error) {
console.error("Failed to create collection:", error);
const err = error as { statusMessage?: string };
createModal(
ModalType.Notification,
{
title: t("errors.library.collection.create.title"),
description: t("errors.library.collection.create.desc", [
err?.statusMessage ?? t("errors.unknown"),
]),
},
(_, c) => c(),
);
} finally {
createCollectionLoading.value = false;
}
@@ -119,10 +119,10 @@
<div class="flex h-6 shrink-0 items-center">
<div class="group grid size-4 grid-cols-1">
<input
:id="`acl-${acl}`"
id="acl"
v-model="currentACLs[acl]"
aria-describedby="acl-description"
:name="`acl-${acl}`"
name="acl"
type="checkbox"
class="col-start-1 row-start-1 appearance-none rounded-sm border checked:border-blue-600 checked:bg-blue-600 indeterminate:border-blue-600 indeterminate:bg-blue-600 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-blue-600 disabled:border-gray-300 disabled:bg-gray-100 disabled:checked:bg-gray-100 border-white/10 bg-white/5 dark:checked:border-blue-500 dark:checked:bg-blue-500 dark:indeterminate:border-blue-500 dark:indeterminate:bg-blue-500 dark:focus-visible:outline-blue-500 dark:disabled:border-white/5 dark:disabled:bg-white/10 dark:disabled:checked:bg-white/10 forced-colors:appearance-auto"
/>
@@ -150,7 +150,7 @@
</div>
<div class="text-sm/6">
<label
:for="`acl-${acl}`"
for="acl"
class="font-display font-medium text-white"
>{{ acl }}</label
>
@@ -22,7 +22,7 @@
class="bg-red-600 text-white hover:bg-red-500"
@click="() => deleteCollection()"
>
{{ $t("common.delete") }}
{{ $t("delete") }}
</LoadingButton>
<button
class="inline-flex items-center rounded-md bg-zinc-800 px-3 py-2 text-sm font-semibold font-display text-white hover:bg-zinc-700"
@@ -22,7 +22,7 @@
class="bg-red-600 text-white hover:bg-red-500"
@click="() => deleteArticle()"
>
{{ $t("common.delete") }}
{{ $t("delete") }}
</LoadingButton>
<button
class="inline-flex items-center rounded-md bg-zinc-800 px-3 py-2 text-sm font-semibold font-display text-white hover:bg-zinc-700"
@@ -22,7 +22,7 @@
class="bg-red-600 text-white hover:bg-red-500"
@click="() => deleteUser()"
>
{{ $t("common.delete") }}
{{ $t("delete") }}
</LoadingButton>
<button
class="inline-flex items-center rounded-md bg-zinc-800 px-3 py-2 text-sm font-semibold font-display text-white hover:bg-zinc-700"
+115
View File
@@ -0,0 +1,115 @@
<template>
<div>
<div class="inline-flex gap-1 items-center flex-wrap">
<span
v-for="item in enabledItems"
:key="item.param"
class="inline-flex items-center gap-x-0.5 rounded-md bg-blue-600/10 px-2 py-1 text-xs font-medium text-blue-500 ring-1 ring-blue-800 ring-inset"
>
{{ item.name }}
<button
type="button"
class="group relative -mr-1 size-3.5 rounded-xs hover:bg-blue-600/20"
@click="() => remove(item.param)"
>
<span class="sr-only">{{ $t("common.remove") }}</span>
<svg
viewBox="0 0 14 14"
class="size-3.5 stroke-blue-500 group-hover:stroke-blue-400"
>
<path d="M4 4l6 6m0-6l-6 6" />
</svg>
<span class="absolute -inset-1" />
</button>
</span>
<span
v-if="enabledItems.length == 0"
class="font-display uppercase text-xs font-bold text-zinc-700"
>
{{ $t("common.noSelected") }}
</span>
</div>
<Combobox as="div" @update:model-value="add">
<div class="relative mt-2">
<ComboboxInput
class="block w-full rounded-md bg-zinc-900 py-1.5 pr-12 pl-3 text-base text-zinc-100 outline-1 -outline-offset-1 outline-zinc-700 placeholder:text-zinc-500 focus:outline-2 focus:-outline-offset-2 focus:outline-blue-600 sm:text-sm/6"
:display-value="(item) => (item as StoreSortOption)?.name"
placeholder="Start typing..."
@change="search = $event.target.value"
@blur="search = ''"
/>
<ComboboxButton
class="absolute inset-y-0 right-0 flex items-center rounded-r-md px-2 focus:outline-hidden"
>
<ChevronDownIcon class="size-5 text-gray-400" aria-hidden="true" />
</ComboboxButton>
<ComboboxOptions
v-if="filteredItems.length > 0 || search.length > 0"
class="absolute mt-1 max-h-60 w-full overflow-auto rounded-md bg-zinc-900 py-1 text-base shadow-lg ring-1 ring-white/5 focus:outline-hidden sm:text-sm"
>
<ComboboxOption
v-for="item in filteredItems"
:key="item.param"
v-slot="{ active }"
:value="item.param"
as="template"
>
<li
:class="[
'relative cursor-default py-2 pr-9 pl-3 select-none',
active
? 'bg-blue-600 text-white outline-hidden'
: 'text-zinc-100',
]"
>
<span class="block truncate">
{{ item.name }}
</span>
</li>
</ComboboxOption>
</ComboboxOptions>
</div>
</Combobox>
</div>
</template>
<script setup lang="ts">
import { ChevronDownIcon } from "@heroicons/vue/20/solid";
import {
Combobox,
ComboboxButton,
ComboboxInput,
ComboboxOption,
ComboboxOptions,
} from "@headlessui/vue";
const props = defineProps<{
items: Array<StoreSortOption>;
}>();
const model = defineModel<{ [key: string]: boolean }>();
const search = ref("");
const filteredItems = computed(() =>
props.items.filter(
(item) =>
!model.value?.[item.param] &&
item.name.toLowerCase().includes(search.value.toLowerCase()),
),
);
const enabledItems = computed(() =>
props.items.filter((e) => model.value?.[e.param]),
);
function add(item: string) {
search.value = "";
model.value ??= {};
model.value[item] = true;
}
function remove(item: string) {
model.value ??= {};
model.value[item] = false;
}
</script>
@@ -24,6 +24,7 @@
>
{{ name }}
</NuxtLink>
<!-- todo -->
</div>
</div>
<div class="ml-4 flex shrink-0">
@@ -43,12 +44,9 @@
<script setup lang="ts">
import { XMarkIcon } from "@heroicons/vue/24/solid";
import type { SerializeObject } from "nitropack";
import type { NotificationModel } from "~/prisma/client/models";
const props = defineProps<{
notification: SerializeObject<NotificationModel>;
}>();
const props = defineProps<{ notification: NotificationModel }>();
async function deleteMe() {
await $dropFetch(`/api/v1/notifications/:id`, {
@@ -32,7 +32,7 @@
class="absolute z-10 mt-1 max-h-56 w-full overflow-auto rounded-md bg-zinc-900 py-1 text-base shadow-lg ring-1 ring-zinc-950 ring-opacity-5 focus:outline-none sm:text-sm"
>
<ListboxOption
v-for="[name, value] in values"
v-for="[name, value] in Object.entries(values)"
:key="value"
v-slot="{ active, selected }"
as="template"
@@ -82,11 +82,10 @@ import {
ListboxOptions,
} from "@headlessui/vue";
import { CheckIcon, ChevronUpDownIcon } from "@heroicons/vue/20/solid";
import { Platform } from "~/prisma/client/enums";
const model = defineModel<Platform | undefined>();
const model = defineModel<PlatformClient | undefined>();
const typedModel = computed<Platform | null>({
const typedModel = computed<PlatformClient | null>({
get() {
return model.value || null;
},
@@ -96,5 +95,5 @@ const typedModel = computed<Platform | null>({
},
});
const values = Object.entries(Platform);
const values = Object.fromEntries(Object.entries(PlatformClient));
</script>

Some files were not shown because too many files have changed in this diff Show More