├── .codebeatignore
├── .gitattributes
├── .gitignore
├── .idea
├── codeStyles
│ ├── Project.xml
│ └── codeStyleConfig.xml
├── eslintPlugin.xml
├── inspectionProfiles
│ └── Project_Default.xml
├── jsLibraryMappings.xml
├── misc.xml
└── vcs.xml
├── .snyk
├── .travis.yml
├── CONFIG.md
├── DEPLOY.md
├── INSTALL.md
├── LICENSE
├── README.md
├── SAAS.md
├── TESTS.md
├── assets
├── intellij-logo-text.svg
└── vpdb-logo-text.svg
├── config
├── settings.browserstack.js
├── settings.dist.js
├── settings.protractor.js
└── settings.test.js
├── data
├── assets
│ ├── avatars
│ │ ├── UncleReamus.png
│ │ ├── aaronjames.jpg
│ │ ├── freezy.jpg
│ │ ├── fuzzel.jpg
│ │ ├── grizz.jpg
│ │ ├── jf.jpg
│ │ ├── jimmyfingers.jpg
│ │ ├── jpsalas.png
│ │ ├── koadic.gif
│ │ ├── lordhiryu.jpg
│ │ ├── noah.jpg
│ │ ├── randr.jpg
│ │ ├── rosve.jpg
│ │ ├── teppotee.png
│ │ ├── tipoto.jpg
│ │ ├── toxie.png
│ │ └── unclewilly.jpg
│ ├── backglass
│ │ ├── Attack from Mars (Bally 1995)-pngcrush.png
│ │ ├── Attack from Mars (Bally 1995)-tinypng.png
│ │ ├── Attack from Mars (Bally 1995).png
│ │ ├── Big Bang Bar (Capcom 1996).png
│ │ ├── Black Rose (Bally 1992).png
│ │ ├── Bram Stoker's Dracula (Williams 1993).png
│ │ ├── Bride Of Pinbot (Williams 1991).png
│ │ ├── Cactus Canyon (Midway 1998).png
│ │ ├── Centaur (Bally 1981).png
│ │ ├── Cirqus Voltaire (Bally 1997).png
│ │ ├── Creature from the Black Lagoon (Bally 1992).png
│ │ ├── Demolition Man (Williams 1994).png
│ │ ├── Dr Dude (Midway 1990).png
│ │ ├── Elvira and the Party Monsters (Bally 1995).png
│ │ ├── Funhouse (Williams 1990).png
│ │ ├── Getaway - High Speed II (Williams 1992).png
│ │ ├── Indiana Jones (Stern 2008).png
│ │ ├── Indianapolis 500 (Midway 1995).png
│ │ ├── Lord Of The Rings (Stern 2003).png
│ │ ├── Medieval Madness (Williams 1997).png
│ │ ├── Monster Bash (Williams 1998).png
│ │ ├── STTNG (Williams 1993).png
│ │ ├── Scared Stiff (Williams 1996).png
│ │ ├── Tales of the Arabian Nights (Williams 1996).png
│ │ ├── Terminator 2 - Judgment Day (Williams 1991).png
│ │ ├── The Adams Family (Williams 1992).png
│ │ ├── The Simpsons Pinball Party (Stern 2003).png
│ │ ├── Tommy The Pinball Wizard (Data East 1994).png
│ │ ├── Twilight Zone (Bally 1993).png
│ │ ├── Whitewater (Williams 1993).png
│ │ ├── Who Dunnit (Bally 1995).png
│ │ ├── World Cup Soccer (Midway 1994).png
│ │ └── thumb
│ │ │ ├── Attack from Mars (Bally 1995).png
│ │ │ ├── Big Bang Bar (Capcom 1996).png
│ │ │ ├── Black Rose (Bally 1992).png
│ │ │ ├── Bram Stoker's Dracula (Williams 1993).png
│ │ │ ├── Bride Of Pinbot (Williams 1991).png
│ │ │ ├── Cactus Canyon (Midway 1998).png
│ │ │ ├── Centaur (Bally 1981).png
│ │ │ ├── Cirqus Voltaire (Bally 1997).png
│ │ │ ├── Creature from the Black Lagoon (Bally 1992).png
│ │ │ ├── Demolition Man (Williams 1994).png
│ │ │ ├── Dr Dude (Midway 1990).png
│ │ │ ├── Elvira and the Party Monsters (Bally 1995).png
│ │ │ ├── Funhouse (Williams 1990).png
│ │ │ ├── Getaway - High Speed II (Williams 1992).png
│ │ │ ├── Indiana Jones (Stern 2008).png
│ │ │ ├── Indianapolis 500 (Midway 1995).png
│ │ │ ├── Lord Of The Rings (Stern 2003).png
│ │ │ ├── Medieval Madness (Williams 1997).png
│ │ │ ├── Monster Bash (Williams 1998).png
│ │ │ ├── STTNG (Williams 1993).png
│ │ │ ├── Scared Stiff (Williams 1996).png
│ │ │ ├── Tales of the Arabian Nights (Williams 1996).png
│ │ │ ├── Terminator 2 - Judgment Day (Williams 1991).png
│ │ │ ├── The Adams Family (Williams 1992).png
│ │ │ ├── The Simpsons Pinball Party (Stern 2003).png
│ │ │ ├── Tommy The Pinball Wizard (Data East 1994).png
│ │ │ ├── Twilight Zone (Bally 1993).png
│ │ │ ├── Whitewater (Williams 1993).png
│ │ │ ├── Who Dunnit (Bally 1995).png
│ │ │ └── World Cup Soccer (Midway 1994).png
│ ├── cabinet
│ │ ├── afm35.png
│ │ ├── centaur.png
│ │ ├── cv-platinum-1.png
│ │ ├── cv-platinum-2.png
│ │ ├── cv-platinum-3.png
│ │ ├── ij.png
│ │ ├── mb_pckiller.png
│ │ └── t2chrome.png
│ ├── directb2s
│ │ └── thumbs
│ │ │ ├── cc-monster-bash--williams-1998-.png
│ │ │ └── monster-bash-illuminated.png
│ ├── flyer
│ │ └── thumb
│ │ │ └── Monster Bash (Williams 1998).jpg
│ ├── instructioncard
│ │ ├── Monster Bash (Williams 1998).swf
│ │ └── thumb
│ │ │ └── Monster Bash (Williams 1998).png
│ ├── logo
│ │ ├── afm.png
│ │ ├── cv.png
│ │ ├── ij.png
│ │ ├── mb.png
│ │ ├── sttng.png
│ │ ├── t2chrome.png
│ │ ├── tm-bop.png
│ │ ├── totan.png
│ │ └── ww.png
│ └── packs
│ │ ├── stern-2000s.png
│ │ └── williams-1990s.png
├── ipdb.json
└── rom-types.json
├── deploy
├── ci
│ ├── codeship.sh
│ └── travis.sh
├── elastic
│ ├── README.md
│ └── logstash
│ │ ├── 10-nginx-filter.conf
│ │ └── 11-json-filter.conf
├── hooks
│ ├── common
│ ├── post-receive-production
│ └── post-receive-staging
├── nginx
│ ├── compile.sh
│ ├── mime.types
│ ├── nginx.conf
│ ├── sites
│ │ ├── api.nginx
│ │ ├── developer.conf
│ │ ├── preview.nginx
│ │ └── storage.nginx
│ └── snippets
│ │ ├── cors.nginx
│ │ ├── letsencrypt.nginx
│ │ ├── security.nginx
│ │ └── ssl.nginx
├── nodemon
│ └── dev.json
├── pm2
│ ├── production.json
│ └── staging.json
├── scripts
│ ├── vpdb_production_deploy
│ ├── vpdb_reset_to_production
│ └── vpdb_staging_deploy
└── tools
│ ├── dropdb.js
│ ├── finish.js
│ └── wait.js
├── doc
├── api
│ ├── authentication.md
│ ├── index.md
│ ├── pagination.md
│ ├── tests.md
│ └── v1
│ │ ├── _includes
│ │ └── moderated_entity.raml
│ │ ├── _schemas
│ │ ├── auth.json
│ │ ├── build.json
│ │ ├── comment.json
│ │ ├── game.json
│ │ ├── moderate-entity.json
│ │ ├── release.json
│ │ ├── tag.json
│ │ ├── user-authenticate.json
│ │ ├── user-chpass.json
│ │ ├── user-create-local.json
│ │ ├── user-register.json
│ │ ├── user-token-confirmation.json
│ │ ├── user-update-profile.json
│ │ └── user.json
│ │ ├── _securitySchemes
│ │ └── jwt.raml
│ │ ├── _traits
│ │ ├── eventlog.raml
│ │ ├── moderated_list.raml
│ │ ├── paginated.raml
│ │ ├── protected.raml
│ │ ├── sorted.raml
│ │ └── validated.raml
│ │ ├── auth
│ │ ├── auth.raml
│ │ └── http
│ │ │ ├── local-req.json
│ │ │ ├── local-res-200.json
│ │ │ ├── local-res-400.json
│ │ │ ├── local-res-401.json
│ │ │ ├── storage-req.json
│ │ │ └── storage-res-200.json
│ │ ├── backglasses
│ │ ├── backglasses.raml
│ │ └── http
│ │ │ ├── create-req.json
│ │ │ ├── create-res-201.json
│ │ │ ├── create-res-422.json
│ │ │ ├── del-req.json
│ │ │ ├── del-res-204.json
│ │ │ ├── del-res-403.json
│ │ │ ├── list-req.json
│ │ │ ├── list-res-200.json
│ │ │ ├── update-req.json
│ │ │ ├── update-res-200.json
│ │ │ ├── view-req.json
│ │ │ └── view-res-200.json
│ │ ├── builds
│ │ ├── builds.raml
│ │ └── http
│ │ │ ├── create-req.json
│ │ │ ├── create-res-201.json
│ │ │ ├── create-res-422.json
│ │ │ ├── del-res-401.json
│ │ │ ├── del-res-403.json
│ │ │ ├── list-req.json
│ │ │ ├── list-res-200.json
│ │ │ ├── update-req.json
│ │ │ ├── update-res-200.json
│ │ │ ├── update-res-422.json
│ │ │ ├── view-req.json
│ │ │ └── view-res-200.json
│ │ ├── events
│ │ ├── events.raml
│ │ └── http
│ │ │ ├── list-game-req.json
│ │ │ ├── list-game-res-200.json
│ │ │ ├── list-release-req.json
│ │ │ ├── list-release-res-200.json
│ │ │ ├── list-req.json
│ │ │ └── list-res-200.json
│ │ ├── files
│ │ ├── files.raml
│ │ └── http
│ │ │ ├── blockmatch-req.json
│ │ │ ├── blockmatch-res-200.json
│ │ │ ├── view-req.json
│ │ │ └── view-res-200.json
│ │ ├── game_requests
│ │ ├── game_requests.raml
│ │ └── http
│ │ │ ├── create-req.json
│ │ │ ├── create-res-201.json
│ │ │ ├── create-res-422.json
│ │ │ ├── del-req.json
│ │ │ ├── del-res-204.json
│ │ │ ├── del-res-403.json
│ │ │ ├── update-req.json
│ │ │ └── update-res-200.json
│ │ ├── games
│ │ ├── backglasses.raml
│ │ ├── games.raml
│ │ ├── http
│ │ │ ├── create-backglass-req.json
│ │ │ ├── create-backglass-res-201.json
│ │ │ ├── create-rating-req.json
│ │ │ ├── create-rating-res-201.json
│ │ │ ├── create-rating-res-400.json
│ │ │ ├── create-rating-res-422.json
│ │ │ ├── create-req.json
│ │ │ ├── create-res-201.json
│ │ │ ├── create-rom-req.json
│ │ │ ├── create-rom-res-201.json
│ │ │ ├── create-rom-res-422.json
│ │ │ ├── create-star-req.json
│ │ │ ├── create-star-res-201.json
│ │ │ ├── delete-req.json
│ │ │ ├── delete-res-204.json
│ │ │ ├── delete-res-400.json
│ │ │ ├── delete-star-req.json
│ │ │ ├── delete-star-res-204.json
│ │ │ ├── list-backglasses-req.json
│ │ │ ├── list-backglasses-res-200.json
│ │ │ ├── list-media-req.json
│ │ │ ├── list-media-res-200.json
│ │ │ ├── list-req.json
│ │ │ ├── list-res-200.json
│ │ │ ├── release-name-req.json
│ │ │ ├── release-name-res-200.json
│ │ │ ├── search-res-400.json
│ │ │ ├── update-rating-req.json
│ │ │ ├── update-rating-res-200.json
│ │ │ ├── update-req.json
│ │ │ ├── update-res-200.json
│ │ │ ├── update-res-422.json
│ │ │ ├── view-rating-req.json
│ │ │ ├── view-rating-res-200.json
│ │ │ ├── view-rating-res-404.json
│ │ │ ├── view-star-req.json
│ │ │ ├── view-star-res-200.json
│ │ │ └── view-star-res-404.json
│ │ ├── media.raml
│ │ ├── rating.raml
│ │ ├── release-name.raml
│ │ ├── roms.raml
│ │ └── star.raml
│ │ ├── index.raml
│ │ ├── media
│ │ ├── http
│ │ │ ├── create-req.json
│ │ │ ├── create-res-201.json
│ │ │ ├── create-res-422.json
│ │ │ ├── del-req.json
│ │ │ ├── del-res-204.json
│ │ │ └── del-res-403.json
│ │ └── media.raml
│ │ ├── plans
│ │ ├── http
│ │ │ ├── list-req.json
│ │ │ └── list-res-200.json
│ │ └── plans.raml
│ │ ├── releases
│ │ ├── comments.raml
│ │ ├── http
│ │ │ ├── create-comment-req.json
│ │ │ ├── create-comment-res-201.json
│ │ │ ├── create-rating-req.json
│ │ │ ├── create-rating-res-201.json
│ │ │ ├── create-req.json
│ │ │ ├── create-res-201.json
│ │ │ ├── create-res-422.json
│ │ │ ├── create-star-req.json
│ │ │ ├── create-star-res-201.json
│ │ │ ├── create-star-res-400.json
│ │ │ ├── create-version-req.json
│ │ │ ├── create-version-res-201.json
│ │ │ ├── create-version-res-403.json
│ │ │ ├── create-version-res-422.json
│ │ │ ├── del-res-401.json
│ │ │ ├── delete-star-req.json
│ │ │ ├── delete-star-res-204.json
│ │ │ ├── list-req.json
│ │ │ ├── list-res-200.json
│ │ │ ├── list-res-401.json
│ │ │ ├── update-rating-req.json
│ │ │ ├── update-rating-res-200.json
│ │ │ ├── update-req.json
│ │ │ ├── update-res-200.json
│ │ │ ├── update-version-req.json
│ │ │ ├── update-version-res-200.json
│ │ │ ├── update-version-res-403.json
│ │ │ ├── update-version-res-422.json
│ │ │ ├── validate-file-req.json
│ │ │ ├── validate-file-res-200.json
│ │ │ ├── view-rating-req.json
│ │ │ ├── view-rating-res-200.json
│ │ │ ├── view-req.json
│ │ │ ├── view-res-200.json
│ │ │ ├── view-star-req.json
│ │ │ ├── view-star-res-200.json
│ │ │ └── view-star-res-404.json
│ │ ├── rating.raml
│ │ ├── releases.md
│ │ ├── releases.raml
│ │ └── star.raml
│ │ ├── roms
│ │ ├── http
│ │ │ ├── create-req.json
│ │ │ ├── create-res-201.json
│ │ │ ├── del-req.json
│ │ │ ├── del-res-204.json
│ │ │ ├── list-req.json
│ │ │ ├── list-res-200.json
│ │ │ ├── view-req.json
│ │ │ └── view-res-200.json
│ │ └── roms.raml
│ │ ├── tags
│ │ ├── http
│ │ │ ├── create-req.json
│ │ │ ├── create-res-201.json
│ │ │ ├── create-res-422.json
│ │ │ ├── del-res-401.json
│ │ │ ├── del-res-403.json
│ │ │ ├── list-req.json
│ │ │ └── list-res-200.json
│ │ └── tags.raml
│ │ ├── tokens
│ │ ├── http
│ │ │ ├── create-req.json
│ │ │ ├── create-res-201.json
│ │ │ ├── create-res-401.json
│ │ │ ├── create-res-403.json
│ │ │ ├── del-req.json
│ │ │ ├── del-res-204.json
│ │ │ ├── list-req.json
│ │ │ ├── list-res-200.json
│ │ │ ├── patch-req.json
│ │ │ ├── patch-res-200.json
│ │ │ ├── patch-res-422.json
│ │ │ ├── view-req.json
│ │ │ └── view-res-200.json
│ │ └── tokens.raml
│ │ ├── user
│ │ ├── http
│ │ │ ├── confirm-token-req.json
│ │ │ ├── confirm-token-res-200.json
│ │ │ ├── confirm-token-res-404.json
│ │ │ ├── update-create-local-req.json
│ │ │ ├── update-password-req.json
│ │ │ ├── update-profile-req.json
│ │ │ ├── update-profile-res-200.json
│ │ │ ├── view-req.json
│ │ │ ├── view-res-200.json
│ │ │ └── view-res-401.json
│ │ └── user.raml
│ │ └── users
│ │ ├── http
│ │ ├── create-star-req.json
│ │ ├── create-star-res-201.json
│ │ ├── del-res-401.json
│ │ ├── del-res-403.json
│ │ ├── delete-star-req.json
│ │ ├── delete-star-res-204.json
│ │ ├── list-req.json
│ │ ├── list-res-200.json
│ │ ├── list-res-401.json
│ │ ├── list-res-403.json
│ │ ├── post-req.json
│ │ ├── post-res-201.json
│ │ ├── post-res-422.json
│ │ ├── search-as-admin-res-200.json
│ │ ├── search-as-member-req.json
│ │ ├── search-as-member-res-200.json
│ │ ├── update-req.json
│ │ ├── update-res-200.json
│ │ ├── update-res-401.json
│ │ ├── update-res-403.json
│ │ ├── update-res-422.json
│ │ ├── view-req.json
│ │ ├── view-res-200.json
│ │ ├── view-res-401.json
│ │ ├── view-res-403.json
│ │ ├── view-star-req.json
│ │ ├── view-star-res-200.json
│ │ └── view-star-res-404.json
│ │ └── star.raml
├── code
│ ├── index.md
│ ├── performance.md
│ ├── recipes.md
│ ├── storage.md
│ └── webapp.md
├── home.md
├── logo_IntelliJIDEA.png
├── storage
│ ├── index.md
│ └── v1
│ │ ├── _securitySchemes
│ │ └── jwt.raml
│ │ ├── _traits
│ │ ├── protected.raml
│ │ └── rate-limited.raml
│ │ ├── auth
│ │ └── auth.raml
│ │ ├── files
│ │ └── files.raml
│ │ └── index.raml
├── styleguide.md
└── text-logo.png
├── package-lock.json
├── package.json
├── renovate.json
├── src
├── app
│ ├── authentication
│ │ ├── authentication.api.router.ts
│ │ ├── authentication.api.scope.spec.js
│ │ ├── authentication.api.spec.js
│ │ ├── authentication.api.ts
│ │ ├── authentication.storage.router.ts
│ │ ├── authentication.storage.spec.js
│ │ ├── authentication.storage.ts
│ │ ├── authentication.util.ts
│ │ ├── index.ts
│ │ └── strategies
│ │ │ ├── github.strategy.ts
│ │ │ ├── google.strategy.ts
│ │ │ ├── ips.strategy.ts
│ │ │ └── strategy.ts
│ ├── backglasses
│ │ ├── backglass.api.acl.spec.js
│ │ ├── backglass.api.router.ts
│ │ ├── backglass.api.scope.spec.js
│ │ ├── backglass.api.spec.js
│ │ ├── backglass.api.ts
│ │ ├── backglass.document.d.ts
│ │ ├── backglass.schema.ts
│ │ ├── backglass.serializer.ts
│ │ ├── index.ts
│ │ └── version
│ │ │ ├── backglass.version.api.spec.js
│ │ │ ├── backglass.version.api.ts
│ │ │ ├── backglass.version.d.ts
│ │ │ ├── backglass.version.schema.ts
│ │ │ └── backglass.version.serializer.ts
│ ├── builds
│ │ ├── build.api.acl.spec.js
│ │ ├── build.api.cache.spec.js
│ │ ├── build.api.scope.spec.js
│ │ ├── build.api.spec.js
│ │ ├── build.api.ts
│ │ ├── build.document.d.ts
│ │ ├── build.router.ts
│ │ ├── build.schema.ts
│ │ ├── build.serializer.ts
│ │ ├── index.ts
│ │ └── initial-data
│ │ │ └── builds.ts
│ ├── clients
│ │ └── README.md
│ ├── comments
│ │ ├── comment.api.acl.spec.js
│ │ ├── comment.api.router.ts
│ │ ├── comment.api.scope.spec.js
│ │ ├── comment.api.spec.js
│ │ ├── comment.api.ts
│ │ ├── comment.document.d.ts
│ │ ├── comment.schema.ts
│ │ ├── comment.serializer.ts
│ │ └── index.ts
│ ├── common
│ │ ├── acl.ts
│ │ ├── api.cache.ts
│ │ ├── api.endpoint.ts
│ │ ├── api.endpoints.ts
│ │ ├── api.error.ts
│ │ ├── api.router.ts
│ │ ├── api.spec.js
│ │ ├── api.ts
│ │ ├── email-templates
│ │ │ ├── backglass-approved.handlebars
│ │ │ ├── backglass-refused.handlebars
│ │ │ ├── backglass-submitted.handlebars
│ │ │ ├── email-update-confirmation.handlebars
│ │ │ ├── game-request-denied.handlebars
│ │ │ ├── game-request-processed.handlebars
│ │ │ ├── moderator-backglass-auto-approved.handlebars
│ │ │ ├── moderator-backglass-submitted.handlebars
│ │ │ ├── moderator-release-auto-approved.handlebars
│ │ │ ├── moderator-release-submitted.handlebars
│ │ │ ├── password-reset-request.handlebars
│ │ │ ├── password-reset-success.handlebars
│ │ │ ├── registration-confirmation.handlebars
│ │ │ ├── release-approved.handlebars
│ │ │ ├── release-author-new-file.handlebars
│ │ │ ├── release-author-new-release.handlebars
│ │ │ ├── release-author-new-version.handlebars
│ │ │ ├── release-commented.handlebars
│ │ │ ├── release-moderation-commented.handlebars
│ │ │ ├── release-refused.handlebars
│ │ │ ├── release-submitted.handlebars
│ │ │ ├── user-merged-deleted.handlebars
│ │ │ ├── user-merged-kept.handlebars
│ │ │ ├── validation-release-broken.handlebars
│ │ │ ├── validation-release-playable.handlebars
│ │ │ ├── validation-release-verified.handlebars
│ │ │ ├── welcome-local.handlebars
│ │ │ └── welcome-oauth.handlebars
│ │ ├── gitinfo.ts
│ │ ├── ipdb.spec.js
│ │ ├── ipdb.ts
│ │ ├── logger.ts
│ │ ├── mailer.ts
│ │ ├── metrics.ts
│ │ ├── middleware
│ │ │ ├── authentication.middleware.ts
│ │ │ ├── error.handler.middleware.ts
│ │ │ ├── logger.middleware.ts
│ │ │ ├── notfound.handler.middleware.ts
│ │ │ ├── rest.middleware.ts
│ │ │ └── website.middleware.ts
│ │ ├── mongoose
│ │ │ ├── file.reference.plugin.ts
│ │ │ ├── game.reference.plugin.ts
│ │ │ ├── id.reference.validator.plugin.ts
│ │ │ ├── metrics.plugin.ts
│ │ │ ├── moderation.plugin.ts
│ │ │ ├── moderation.serializer.ts
│ │ │ ├── moderation.spec.js
│ │ │ ├── pretty.id.plugin.ts
│ │ │ ├── sortable.title.plugin.ts
│ │ │ └── util.ts
│ │ ├── profiler.ts
│ │ ├── quota.spec.js
│ │ ├── quota.ts
│ │ ├── scope.ts
│ │ ├── serializer.ts
│ │ ├── settings.ts
│ │ ├── settings.validator.ts
│ │ ├── slackbot.ts
│ │ ├── typings
│ │ │ ├── config.d.ts
│ │ │ ├── context.d.ts
│ │ │ ├── models.d.ts
│ │ │ └── serializers.d.ts
│ │ ├── visualpinball.table.ts
│ │ └── xml.parser.ts
│ ├── files
│ │ ├── file.api.acl.spec.js
│ │ ├── file.api.router.ts
│ │ ├── file.api.scope.spec.js
│ │ ├── file.api.spec.js
│ │ ├── file.api.ts
│ │ ├── file.blockmatch.api.ts
│ │ ├── file.blockmatch.spec.js
│ │ ├── file.document.d.ts
│ │ ├── file.mimetypes.ts
│ │ ├── file.schema.ts
│ │ ├── file.serializer.ts
│ │ ├── file.storage.acl.spec.js
│ │ ├── file.storage.router.ts
│ │ ├── file.storage.spec.js
│ │ ├── file.storage.ts
│ │ ├── file.ts
│ │ ├── file.types.ts
│ │ ├── file.util.ts
│ │ ├── file.variations.d.ts
│ │ ├── index.ts
│ │ ├── metadata
│ │ │ ├── archive.metadata.ts
│ │ │ ├── archive.spec.js
│ │ │ ├── directb2s.metadata.ts
│ │ │ ├── directb2s.spec.js
│ │ │ ├── image.metadata.ts
│ │ │ ├── image.spec.js
│ │ │ ├── index.ts
│ │ │ ├── metadata.ts
│ │ │ ├── video.metadata.ts
│ │ │ ├── video.spec.js
│ │ │ └── vpt.metadata.ts
│ │ └── processor
│ │ │ ├── README.md
│ │ │ ├── directb2s.optimization.processor.ts
│ │ │ ├── directb2s.thumb.processor.ts
│ │ │ ├── image.optimization.processor.ts
│ │ │ ├── image.variation.processor.ts
│ │ │ ├── processor.manager.ts
│ │ │ ├── processor.queue.ts
│ │ │ ├── processor.ts
│ │ │ ├── processor.worker.ts
│ │ │ ├── video.optimization.processor.ts
│ │ │ ├── video.screenshot.processor.ts
│ │ │ ├── video.thumb.processor.ts
│ │ │ ├── vpt.blockindex.processor.ts
│ │ │ └── vpt.gltf.processor.ts
│ ├── game-requests
│ │ ├── game.request.api.acl.spec.js
│ │ ├── game.request.api.router.ts
│ │ ├── game.request.api.scope.spec.js
│ │ ├── game.request.api.spec.js
│ │ ├── game.request.api.ts
│ │ ├── game.request.document.d.ts
│ │ ├── game.request.schema.ts
│ │ ├── game.request.serializer.ts
│ │ └── index.ts
│ ├── games
│ │ ├── game.api.acl.spec.js
│ │ ├── game.api.cache.config.ts
│ │ ├── game.api.cache.spec.js
│ │ ├── game.api.router.ts
│ │ ├── game.api.scope.spec.js
│ │ ├── game.api.spec.js
│ │ ├── game.api.ts
│ │ ├── game.document.d.ts
│ │ ├── game.restrictions.spec.js
│ │ ├── game.schema.ts
│ │ ├── game.serializer.ts
│ │ ├── game.ts
│ │ └── index.ts
│ ├── index.ts
│ ├── log-event
│ │ ├── index.ts
│ │ ├── log.event.api.acl.spec.js
│ │ ├── log.event.api.router.ts
│ │ ├── log.event.api.scope.spec.js
│ │ ├── log.event.api.ts
│ │ ├── log.event.document.d.ts
│ │ ├── log.event.schema.ts
│ │ ├── log.event.serializer.ts
│ │ ├── log.event.spec.js
│ │ └── log.event.util.ts
│ ├── log-user
│ │ ├── index.ts
│ │ ├── log.user.api.ts
│ │ ├── log.user.document.d.ts
│ │ ├── log.user.schema.ts
│ │ ├── log.user.serializer.ts
│ │ └── log.user.util.ts
│ ├── media
│ │ ├── index.ts
│ │ ├── media.api.acl.spec.js
│ │ ├── media.api.scope.spec.js
│ │ ├── media.api.spec.js
│ │ ├── medium.api.router.ts
│ │ ├── medium.api.ts
│ │ ├── medium.category.ts
│ │ ├── medium.document.d.ts
│ │ ├── medium.schema.ts
│ │ └── medium.serializer.ts
│ ├── misc
│ │ ├── index.ts
│ │ ├── misc.api.acl.spec.js
│ │ ├── misc.api.cache.spec.js
│ │ ├── misc.api.router.ts
│ │ ├── misc.api.scope.spec.js
│ │ ├── misc.api.spec.js
│ │ └── misc.api.ts
│ ├── profile
│ │ ├── index.ts
│ │ ├── profile.api.acl.spec.js
│ │ ├── profile.api.cache.spec.js
│ │ ├── profile.api.router.ts
│ │ ├── profile.api.scope.spec.js
│ │ ├── profile.api.spec.js
│ │ └── profile.api.ts
│ ├── ratings
│ │ ├── index.ts
│ │ ├── rating.api.acl.spec.js
│ │ ├── rating.api.scope.spec.js
│ │ ├── rating.api.spec.js
│ │ ├── rating.api.ts
│ │ ├── rating.document.d.ts
│ │ └── rating.schema.ts
│ ├── releases
│ │ ├── index.ts
│ │ ├── release.abstract.api.ts
│ │ ├── release.api.acl.spec.js
│ │ ├── release.api.cache.config.ts
│ │ ├── release.api.cache.spec.js
│ │ ├── release.api.router.ts
│ │ ├── release.api.scope.spec.js
│ │ ├── release.api.spec.js
│ │ ├── release.api.ts
│ │ ├── release.document.d.ts
│ │ ├── release.flavors.ts
│ │ ├── release.list.query.builder.ts
│ │ ├── release.schema.ts
│ │ ├── release.serializer.ts
│ │ ├── release.storage.router.ts
│ │ ├── release.storage.spec.js
│ │ ├── release.storage.ts
│ │ ├── release.tableblock.d.ts
│ │ ├── release.tableblock.schema.ts
│ │ ├── release.ts
│ │ └── version
│ │ │ ├── file
│ │ │ ├── release.version.file.api.spec.js
│ │ │ ├── release.version.file.api.ts
│ │ │ ├── release.version.file.document.d.ts
│ │ │ ├── release.version.file.schema.ts
│ │ │ └── release.version.file.serializer.ts
│ │ │ ├── release.version.api.spec.js
│ │ │ ├── release.version.api.ts
│ │ │ ├── release.version.document.d.ts
│ │ │ ├── release.version.schema.ts
│ │ │ ├── release.version.serializer.ts
│ │ │ └── release.version.ts
│ ├── roms
│ │ ├── index.ts
│ │ ├── rom.api.acl.spec.js
│ │ ├── rom.api.router.ts
│ │ ├── rom.api.scope.spec.js
│ │ ├── rom.api.spec.js
│ │ ├── rom.api.ts
│ │ ├── rom.document.d.ts
│ │ ├── rom.schema.ts
│ │ └── rom.serializer.ts
│ ├── server.ts
│ ├── stars
│ │ ├── index.ts
│ │ ├── star.api.acl.spec.js
│ │ ├── star.api.scope.spec.js
│ │ ├── star.api.spec.js
│ │ ├── star.api.ts
│ │ ├── star.document.d.ts
│ │ └── star.schema.ts
│ ├── state.ts
│ ├── tags
│ │ ├── index.ts
│ │ ├── initial-data
│ │ │ └── tags.ts
│ │ ├── tag.api.acl.spec.js
│ │ ├── tag.api.cache.spec.js
│ │ ├── tag.api.router.ts
│ │ ├── tag.api.scope.spec.js
│ │ ├── tag.api.spec.js
│ │ ├── tag.api.ts
│ │ ├── tag.document.d.ts
│ │ ├── tag.schema.ts
│ │ └── tag.serializer.ts
│ ├── tokens
│ │ ├── index.ts
│ │ ├── token.api.acl.spec.js
│ │ ├── token.api.router.ts
│ │ ├── token.api.scope.spec.js
│ │ ├── token.api.spec.js
│ │ ├── token.api.ts
│ │ ├── token.document.d.ts
│ │ ├── token.schema.ts
│ │ └── token.serializer.ts
│ └── users
│ │ ├── authored-entity.d.ts
│ │ ├── content.author.d.ts
│ │ ├── content.author.schema.ts
│ │ ├── content.author.serializer.ts
│ │ ├── index.ts
│ │ ├── user.api.acl.spec.js
│ │ ├── user.api.cache.spec.js
│ │ ├── user.api.router.ts
│ │ ├── user.api.scope.spec.js
│ │ ├── user.api.spec.js
│ │ ├── user.api.ts
│ │ ├── user.doc.raml
│ │ ├── user.doc.type.raml
│ │ ├── user.document.d.ts
│ │ ├── user.schema.ts
│ │ ├── user.serializer.ts
│ │ └── user.util.ts
├── scripts
│ ├── 3dtest.ts
│ ├── check-db.ts
│ ├── clear-cache.ts
│ ├── import.production.logs.js
│ ├── migrate.ts
│ ├── migrations
│ │ ├── 01-cd4930d-rotate-portrait-playfields.js
│ │ ├── 02-278f5ff-reprocess-playfield-variations.js
│ │ ├── 03-ccf3248-rom-languages.js
│ │ ├── 04-6b42f90-copy-media.js
│ │ ├── 05-fbb8802-approve-all-moderation.js
│ │ ├── 06-a179f04-notification-preferences.js
│ │ ├── 07-5f3d113-flatten-media.js
│ │ ├── 08-f5ef268-notification-preferences.js
│ │ ├── 09-57509f6-notification-preferences.js
│ │ ├── 10-d8a3c5a-notification-preferences.js
│ │ ├── 11-3aca4ed-release-date.js
│ │ ├── 12-ba756ee-notification-preferences.js
│ │ ├── 13-c76ce0e-reprocess-db2s.js
│ │ ├── 14-e62b4f5-add-scopes-to-tokens.js
│ │ ├── 15-190a26a-refactor-provider-data.js
│ │ ├── 16-594782d-rename-token-from-application-to-provider.js
│ │ ├── 17-2f6507e-typescript-test.ts
│ │ ├── 18-25b2974-clear-cache.ts
│ │ ├── 19-cc60cb7-clear-cache.ts
│ │ ├── 20-ced39ae-generate-glb.ts
│ │ ├── 21-2b093cb-add-deleted-moderation.ts
│ │ ├── 22-efb6cd1-regenerate-backglass-thumbs.ts
│ │ └── 23-9525653-add-rom-types.ts
│ ├── normalize-doc-examples.js
│ ├── parse-rom-files.js
│ ├── reprocess-files.js
│ ├── reset-to-production.ts
│ ├── rollbar-deploy.ts
│ ├── scrape-ipdb.js
│ ├── table.html
│ ├── tslint.json
│ ├── update-top-100.ts
│ ├── upload-data.ts
│ ├── upload
│ │ ├── data.uploader.ts
│ │ ├── game.uploader.ts
│ │ ├── release.uploader.ts
│ │ ├── rom.uploader.ts
│ │ └── roms.json
│ └── validate-settings.ts
├── test
│ ├── api.client.js
│ ├── api.client.result.js
│ ├── file.helper.js
│ ├── fixtures
│ │ ├── afm.avi
│ │ ├── afm.f4v
│ │ ├── backglass.png
│ │ ├── dmd.rar
│ │ ├── dmd.zip
│ │ ├── empty.vpt
│ │ ├── hulk.zip
│ │ ├── release.asset.folder.rar
│ │ ├── release.asset.folder.zip
│ │ ├── release.asset.root.rar
│ │ ├── release.asset.root.zip
│ │ ├── small_100x100.png
│ │ ├── table-bumper.vpx
│ │ ├── table-empty.vpx
│ │ ├── table-flipper.vpx
│ │ ├── table-gate.vpx
│ │ ├── table-hit-target.vpx
│ │ ├── table-kicker.vpx
│ │ ├── table-light.vpx
│ │ ├── table-primitive.vpx
│ │ ├── table-ramp-surface.vpx
│ │ ├── table-ramp.vpx
│ │ ├── table-rubber.vpx
│ │ ├── table-sink.vpx
│ │ ├── table-spinner.vpx
│ │ ├── table-surface.vpx
│ │ ├── table-trigger.vpx
│ │ ├── table.vpt
│ │ └── test.mp3
│ ├── game.helper.js
│ ├── image.helper.js
│ ├── legacy
│ │ ├── auth-helper.js
│ │ ├── file-helper.js
│ │ ├── game-helper.js
│ │ ├── helper.js
│ │ ├── release-helper.js
│ │ └── superagent-test.js
│ ├── release.helper.js
│ └── three.helper.js
└── tslint.json
├── tsconfig.json
└── typings
├── acl
└── index.d.ts
└── mongoose
└── index.d.ts
/.codebeatignore:
--------------------------------------------------------------------------------
1 | .idea/**
2 | config/**
3 | data/**
4 | deploy/**
5 | doc/**
6 | scripts/**
7 | src/**/*.js
8 | src_/**
9 | test/**
10 | typings/**
--------------------------------------------------------------------------------
/.gitattributes:
--------------------------------------------------------------------------------
1 | *.ai binary
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | lib-cov
2 | *.seed
3 | *.log
4 | *.csv
5 | *.dat
6 | *.out
7 | *.pid
8 | *.gz
9 | *.iml
10 |
11 | pids
12 | logs
13 | /build
14 | /devsite
15 | /coverage
16 | /data/storage*
17 | /data/gen/games/backglass
18 | /data/gen/games/logo
19 | /gfx/export
20 | /gfx/mockups
21 | /gfx/favicon
22 | /gfx/svg-defs.svg
23 | /vpdb-svg
24 | /src/config/
25 |
26 | results
27 | .nyc_output
28 | config/settings.js
29 | src/scripts/credentials.js
30 |
31 | node_modules
32 |
33 | gitinfo.json
34 | raml.json
35 | postman*.json
36 |
37 | .restart
38 | .reload
39 | .idea/bashsupport_project.xml
40 | .idea/compiler.xml
41 | .idea/copyright/
42 | .idea/dictionaries/
43 | .idea/encodings.xml
44 | .idea/modules.xml
45 | .idea/scopes/
46 | .idea/uiDesigner.xml
47 | .idea/workspace.xml
48 | .idea/mongoSettings.xml
--------------------------------------------------------------------------------
/.idea/codeStyles/codeStyleConfig.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/.idea/eslintPlugin.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/.idea/inspectionProfiles/Project_Default.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/.idea/jsLibraryMappings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/.idea/misc.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/.idea/vcs.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/.travis.yml:
--------------------------------------------------------------------------------
1 | dist: trusty
2 | language: node_js
3 | sudo: false
4 | node_js:
5 | - 8
6 | services:
7 | - redis-server
8 | addons:
9 | apt:
10 | sources:
11 | - ubuntu-toolchain-r-test
12 | packages:
13 | - graphicsmagick
14 | - optipng
15 | - g++-4.8
16 | before_script:
17 | - wget http://fastdl.mongodb.org/linux/mongodb-linux-x86_64-3.6.4.tgz
18 | - tar -zxvf mongodb-linux-x86_64-3.6.4.tgz
19 | - mkdir -p ./data/db/27017
20 | - mkdir -p ./data/db/27000
21 | - ./mongodb-linux-x86_64-3.6.4/bin/mongod --fork --nopreallocj --dbpath ./data/db/27017 --syslog --port 27017
22 | - wget https://johnvansickle.com/ffmpeg/releases/ffmpeg-release-amd64-static.tar.xz -O /tmp/ffmpeg.tar.gz
23 | - wget http://www.rarlab.com/rar/rarlinux-x64-5.3.0.tar.gz -O /tmp/rar.tar.gz
24 | - mkdir bin
25 | - cd bin
26 | - tar -xvf /tmp/ffmpeg.tar.gz --strip 1 --no-anchored ffmpeg ffprobe
27 | - tar -xvf /tmp/rar.tar.gz --strip 1
28 | - cd ..
29 | - export PATH=$(pwd)/bin:$PATH
30 | - mkdir -p data/storage-test-protected
31 | - mkdir -p data/storage-test-public
32 | script:
33 | - deploy/ci/travis.sh
34 | env:
35 | global:
36 | - secure: he13bEicdzpoLGeoj+xaU2kIkKsw1/m+Ejcm5YanhGicECrCWVvFOu0O7vGHPDDj3s/xnTgBhhUPzIS3SdcIVqfTS+nP+CJNtzOm4zOdPvmfbfCvuIukLmCLtADrrz2HUxO1en1vfpH1trkUP5gwdo4vAGli7hOD4MsncRYaYio=
37 | - BUILDER="Travis CI"
38 | - CXX=g++-4.8
39 |
--------------------------------------------------------------------------------
/SAAS.md:
--------------------------------------------------------------------------------
1 | # Third Party Services
2 |
3 | VPDB uses a couple of services.
4 |
5 | ## Raygun
6 |
7 | [Raygun](https://raygun.com/) is a crash reporter. It is configured in the
8 | settings, more precisely at `vpdb.services.raygun`.
9 |
10 | ## Rollbar
11 |
12 | [Rollbar](https://rollbar.com) is another crash reporter. Like Raygun, it's configured in the
13 | settings at `vpdb.services.rollbar`.
14 |
15 | ## Sqreen
16 |
17 | [Sqreen](https://www.sqreen.io) provides several security-related features.
18 | You can enable Sqreen by setting the `SQREEN_ENABLED` environment variable to
19 | something truthy. Other configurations such as `SQREEN_TOKEN` are documented
20 | [here](https://docs.sqreen.io/sqreen-for-nodejs/nodejs-agent-installation/).
--------------------------------------------------------------------------------
/TESTS.md:
--------------------------------------------------------------------------------
1 | ## Tests
2 |
3 | We use [Mocha][mocha] for running backend API tests.
4 |
5 | A test run requires a clean environment. For this purpose, there is an included settings file at
6 | `config/settings-test.js` which is used when running tests. Basically it's a stripped-down config that uses a
7 | different database, runs on a different HTTP port and enables code coverage.
8 |
9 | If you want to execute the tests, run the server in test mode:
10 |
11 | npm run test:serve
12 |
13 | When running in test mode, a local test coverage report is generated in the `coverage` folder. It also
14 | drops all MongoDB collections and flushes Redis.
15 |
16 | In order to execute the tests, run:
17 |
18 | npm run test:run
19 |
20 | [mocha]: https://mochajs.org/
--------------------------------------------------------------------------------
/data/assets/avatars/UncleReamus.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vpdb/server/c790f6ff0f6572edc6ccfcb1cf8f853db2829c80/data/assets/avatars/UncleReamus.png
--------------------------------------------------------------------------------
/data/assets/avatars/aaronjames.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vpdb/server/c790f6ff0f6572edc6ccfcb1cf8f853db2829c80/data/assets/avatars/aaronjames.jpg
--------------------------------------------------------------------------------
/data/assets/avatars/freezy.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vpdb/server/c790f6ff0f6572edc6ccfcb1cf8f853db2829c80/data/assets/avatars/freezy.jpg
--------------------------------------------------------------------------------
/data/assets/avatars/fuzzel.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vpdb/server/c790f6ff0f6572edc6ccfcb1cf8f853db2829c80/data/assets/avatars/fuzzel.jpg
--------------------------------------------------------------------------------
/data/assets/avatars/grizz.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vpdb/server/c790f6ff0f6572edc6ccfcb1cf8f853db2829c80/data/assets/avatars/grizz.jpg
--------------------------------------------------------------------------------
/data/assets/avatars/jf.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vpdb/server/c790f6ff0f6572edc6ccfcb1cf8f853db2829c80/data/assets/avatars/jf.jpg
--------------------------------------------------------------------------------
/data/assets/avatars/jimmyfingers.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vpdb/server/c790f6ff0f6572edc6ccfcb1cf8f853db2829c80/data/assets/avatars/jimmyfingers.jpg
--------------------------------------------------------------------------------
/data/assets/avatars/jpsalas.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vpdb/server/c790f6ff0f6572edc6ccfcb1cf8f853db2829c80/data/assets/avatars/jpsalas.png
--------------------------------------------------------------------------------
/data/assets/avatars/koadic.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vpdb/server/c790f6ff0f6572edc6ccfcb1cf8f853db2829c80/data/assets/avatars/koadic.gif
--------------------------------------------------------------------------------
/data/assets/avatars/lordhiryu.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vpdb/server/c790f6ff0f6572edc6ccfcb1cf8f853db2829c80/data/assets/avatars/lordhiryu.jpg
--------------------------------------------------------------------------------
/data/assets/avatars/noah.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vpdb/server/c790f6ff0f6572edc6ccfcb1cf8f853db2829c80/data/assets/avatars/noah.jpg
--------------------------------------------------------------------------------
/data/assets/avatars/randr.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vpdb/server/c790f6ff0f6572edc6ccfcb1cf8f853db2829c80/data/assets/avatars/randr.jpg
--------------------------------------------------------------------------------
/data/assets/avatars/rosve.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vpdb/server/c790f6ff0f6572edc6ccfcb1cf8f853db2829c80/data/assets/avatars/rosve.jpg
--------------------------------------------------------------------------------
/data/assets/avatars/teppotee.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vpdb/server/c790f6ff0f6572edc6ccfcb1cf8f853db2829c80/data/assets/avatars/teppotee.png
--------------------------------------------------------------------------------
/data/assets/avatars/tipoto.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vpdb/server/c790f6ff0f6572edc6ccfcb1cf8f853db2829c80/data/assets/avatars/tipoto.jpg
--------------------------------------------------------------------------------
/data/assets/avatars/toxie.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vpdb/server/c790f6ff0f6572edc6ccfcb1cf8f853db2829c80/data/assets/avatars/toxie.png
--------------------------------------------------------------------------------
/data/assets/avatars/unclewilly.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vpdb/server/c790f6ff0f6572edc6ccfcb1cf8f853db2829c80/data/assets/avatars/unclewilly.jpg
--------------------------------------------------------------------------------
/data/assets/backglass/Attack from Mars (Bally 1995)-pngcrush.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vpdb/server/c790f6ff0f6572edc6ccfcb1cf8f853db2829c80/data/assets/backglass/Attack from Mars (Bally 1995)-pngcrush.png
--------------------------------------------------------------------------------
/data/assets/backglass/Attack from Mars (Bally 1995)-tinypng.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vpdb/server/c790f6ff0f6572edc6ccfcb1cf8f853db2829c80/data/assets/backglass/Attack from Mars (Bally 1995)-tinypng.png
--------------------------------------------------------------------------------
/data/assets/backglass/Attack from Mars (Bally 1995).png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vpdb/server/c790f6ff0f6572edc6ccfcb1cf8f853db2829c80/data/assets/backglass/Attack from Mars (Bally 1995).png
--------------------------------------------------------------------------------
/data/assets/backglass/Big Bang Bar (Capcom 1996).png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vpdb/server/c790f6ff0f6572edc6ccfcb1cf8f853db2829c80/data/assets/backglass/Big Bang Bar (Capcom 1996).png
--------------------------------------------------------------------------------
/data/assets/backglass/Black Rose (Bally 1992).png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vpdb/server/c790f6ff0f6572edc6ccfcb1cf8f853db2829c80/data/assets/backglass/Black Rose (Bally 1992).png
--------------------------------------------------------------------------------
/data/assets/backglass/Bram Stoker's Dracula (Williams 1993).png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vpdb/server/c790f6ff0f6572edc6ccfcb1cf8f853db2829c80/data/assets/backglass/Bram Stoker's Dracula (Williams 1993).png
--------------------------------------------------------------------------------
/data/assets/backglass/Bride Of Pinbot (Williams 1991).png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vpdb/server/c790f6ff0f6572edc6ccfcb1cf8f853db2829c80/data/assets/backglass/Bride Of Pinbot (Williams 1991).png
--------------------------------------------------------------------------------
/data/assets/backglass/Cactus Canyon (Midway 1998).png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vpdb/server/c790f6ff0f6572edc6ccfcb1cf8f853db2829c80/data/assets/backglass/Cactus Canyon (Midway 1998).png
--------------------------------------------------------------------------------
/data/assets/backglass/Centaur (Bally 1981).png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vpdb/server/c790f6ff0f6572edc6ccfcb1cf8f853db2829c80/data/assets/backglass/Centaur (Bally 1981).png
--------------------------------------------------------------------------------
/data/assets/backglass/Cirqus Voltaire (Bally 1997).png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vpdb/server/c790f6ff0f6572edc6ccfcb1cf8f853db2829c80/data/assets/backglass/Cirqus Voltaire (Bally 1997).png
--------------------------------------------------------------------------------
/data/assets/backglass/Creature from the Black Lagoon (Bally 1992).png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vpdb/server/c790f6ff0f6572edc6ccfcb1cf8f853db2829c80/data/assets/backglass/Creature from the Black Lagoon (Bally 1992).png
--------------------------------------------------------------------------------
/data/assets/backglass/Demolition Man (Williams 1994).png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vpdb/server/c790f6ff0f6572edc6ccfcb1cf8f853db2829c80/data/assets/backglass/Demolition Man (Williams 1994).png
--------------------------------------------------------------------------------
/data/assets/backglass/Dr Dude (Midway 1990).png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vpdb/server/c790f6ff0f6572edc6ccfcb1cf8f853db2829c80/data/assets/backglass/Dr Dude (Midway 1990).png
--------------------------------------------------------------------------------
/data/assets/backglass/Elvira and the Party Monsters (Bally 1995).png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vpdb/server/c790f6ff0f6572edc6ccfcb1cf8f853db2829c80/data/assets/backglass/Elvira and the Party Monsters (Bally 1995).png
--------------------------------------------------------------------------------
/data/assets/backglass/Funhouse (Williams 1990).png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vpdb/server/c790f6ff0f6572edc6ccfcb1cf8f853db2829c80/data/assets/backglass/Funhouse (Williams 1990).png
--------------------------------------------------------------------------------
/data/assets/backglass/Getaway - High Speed II (Williams 1992).png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vpdb/server/c790f6ff0f6572edc6ccfcb1cf8f853db2829c80/data/assets/backglass/Getaway - High Speed II (Williams 1992).png
--------------------------------------------------------------------------------
/data/assets/backglass/Indiana Jones (Stern 2008).png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vpdb/server/c790f6ff0f6572edc6ccfcb1cf8f853db2829c80/data/assets/backglass/Indiana Jones (Stern 2008).png
--------------------------------------------------------------------------------
/data/assets/backglass/Indianapolis 500 (Midway 1995).png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vpdb/server/c790f6ff0f6572edc6ccfcb1cf8f853db2829c80/data/assets/backglass/Indianapolis 500 (Midway 1995).png
--------------------------------------------------------------------------------
/data/assets/backglass/Lord Of The Rings (Stern 2003).png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vpdb/server/c790f6ff0f6572edc6ccfcb1cf8f853db2829c80/data/assets/backglass/Lord Of The Rings (Stern 2003).png
--------------------------------------------------------------------------------
/data/assets/backglass/Medieval Madness (Williams 1997).png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vpdb/server/c790f6ff0f6572edc6ccfcb1cf8f853db2829c80/data/assets/backglass/Medieval Madness (Williams 1997).png
--------------------------------------------------------------------------------
/data/assets/backglass/Monster Bash (Williams 1998).png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vpdb/server/c790f6ff0f6572edc6ccfcb1cf8f853db2829c80/data/assets/backglass/Monster Bash (Williams 1998).png
--------------------------------------------------------------------------------
/data/assets/backglass/STTNG (Williams 1993).png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vpdb/server/c790f6ff0f6572edc6ccfcb1cf8f853db2829c80/data/assets/backglass/STTNG (Williams 1993).png
--------------------------------------------------------------------------------
/data/assets/backglass/Scared Stiff (Williams 1996).png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vpdb/server/c790f6ff0f6572edc6ccfcb1cf8f853db2829c80/data/assets/backglass/Scared Stiff (Williams 1996).png
--------------------------------------------------------------------------------
/data/assets/backglass/Tales of the Arabian Nights (Williams 1996).png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vpdb/server/c790f6ff0f6572edc6ccfcb1cf8f853db2829c80/data/assets/backglass/Tales of the Arabian Nights (Williams 1996).png
--------------------------------------------------------------------------------
/data/assets/backglass/Terminator 2 - Judgment Day (Williams 1991).png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vpdb/server/c790f6ff0f6572edc6ccfcb1cf8f853db2829c80/data/assets/backglass/Terminator 2 - Judgment Day (Williams 1991).png
--------------------------------------------------------------------------------
/data/assets/backglass/The Adams Family (Williams 1992).png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vpdb/server/c790f6ff0f6572edc6ccfcb1cf8f853db2829c80/data/assets/backglass/The Adams Family (Williams 1992).png
--------------------------------------------------------------------------------
/data/assets/backglass/The Simpsons Pinball Party (Stern 2003).png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vpdb/server/c790f6ff0f6572edc6ccfcb1cf8f853db2829c80/data/assets/backglass/The Simpsons Pinball Party (Stern 2003).png
--------------------------------------------------------------------------------
/data/assets/backglass/Tommy The Pinball Wizard (Data East 1994).png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vpdb/server/c790f6ff0f6572edc6ccfcb1cf8f853db2829c80/data/assets/backglass/Tommy The Pinball Wizard (Data East 1994).png
--------------------------------------------------------------------------------
/data/assets/backglass/Twilight Zone (Bally 1993).png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vpdb/server/c790f6ff0f6572edc6ccfcb1cf8f853db2829c80/data/assets/backglass/Twilight Zone (Bally 1993).png
--------------------------------------------------------------------------------
/data/assets/backglass/Whitewater (Williams 1993).png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vpdb/server/c790f6ff0f6572edc6ccfcb1cf8f853db2829c80/data/assets/backglass/Whitewater (Williams 1993).png
--------------------------------------------------------------------------------
/data/assets/backglass/Who Dunnit (Bally 1995).png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vpdb/server/c790f6ff0f6572edc6ccfcb1cf8f853db2829c80/data/assets/backglass/Who Dunnit (Bally 1995).png
--------------------------------------------------------------------------------
/data/assets/backglass/World Cup Soccer (Midway 1994).png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vpdb/server/c790f6ff0f6572edc6ccfcb1cf8f853db2829c80/data/assets/backglass/World Cup Soccer (Midway 1994).png
--------------------------------------------------------------------------------
/data/assets/backglass/thumb/Attack from Mars (Bally 1995).png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vpdb/server/c790f6ff0f6572edc6ccfcb1cf8f853db2829c80/data/assets/backglass/thumb/Attack from Mars (Bally 1995).png
--------------------------------------------------------------------------------
/data/assets/backglass/thumb/Big Bang Bar (Capcom 1996).png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vpdb/server/c790f6ff0f6572edc6ccfcb1cf8f853db2829c80/data/assets/backglass/thumb/Big Bang Bar (Capcom 1996).png
--------------------------------------------------------------------------------
/data/assets/backglass/thumb/Black Rose (Bally 1992).png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vpdb/server/c790f6ff0f6572edc6ccfcb1cf8f853db2829c80/data/assets/backglass/thumb/Black Rose (Bally 1992).png
--------------------------------------------------------------------------------
/data/assets/backglass/thumb/Bram Stoker's Dracula (Williams 1993).png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vpdb/server/c790f6ff0f6572edc6ccfcb1cf8f853db2829c80/data/assets/backglass/thumb/Bram Stoker's Dracula (Williams 1993).png
--------------------------------------------------------------------------------
/data/assets/backglass/thumb/Bride Of Pinbot (Williams 1991).png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vpdb/server/c790f6ff0f6572edc6ccfcb1cf8f853db2829c80/data/assets/backglass/thumb/Bride Of Pinbot (Williams 1991).png
--------------------------------------------------------------------------------
/data/assets/backglass/thumb/Cactus Canyon (Midway 1998).png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vpdb/server/c790f6ff0f6572edc6ccfcb1cf8f853db2829c80/data/assets/backglass/thumb/Cactus Canyon (Midway 1998).png
--------------------------------------------------------------------------------
/data/assets/backglass/thumb/Centaur (Bally 1981).png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vpdb/server/c790f6ff0f6572edc6ccfcb1cf8f853db2829c80/data/assets/backglass/thumb/Centaur (Bally 1981).png
--------------------------------------------------------------------------------
/data/assets/backglass/thumb/Cirqus Voltaire (Bally 1997).png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vpdb/server/c790f6ff0f6572edc6ccfcb1cf8f853db2829c80/data/assets/backglass/thumb/Cirqus Voltaire (Bally 1997).png
--------------------------------------------------------------------------------
/data/assets/backglass/thumb/Creature from the Black Lagoon (Bally 1992).png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vpdb/server/c790f6ff0f6572edc6ccfcb1cf8f853db2829c80/data/assets/backglass/thumb/Creature from the Black Lagoon (Bally 1992).png
--------------------------------------------------------------------------------
/data/assets/backglass/thumb/Demolition Man (Williams 1994).png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vpdb/server/c790f6ff0f6572edc6ccfcb1cf8f853db2829c80/data/assets/backglass/thumb/Demolition Man (Williams 1994).png
--------------------------------------------------------------------------------
/data/assets/backglass/thumb/Dr Dude (Midway 1990).png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vpdb/server/c790f6ff0f6572edc6ccfcb1cf8f853db2829c80/data/assets/backglass/thumb/Dr Dude (Midway 1990).png
--------------------------------------------------------------------------------
/data/assets/backglass/thumb/Elvira and the Party Monsters (Bally 1995).png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vpdb/server/c790f6ff0f6572edc6ccfcb1cf8f853db2829c80/data/assets/backglass/thumb/Elvira and the Party Monsters (Bally 1995).png
--------------------------------------------------------------------------------
/data/assets/backglass/thumb/Funhouse (Williams 1990).png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vpdb/server/c790f6ff0f6572edc6ccfcb1cf8f853db2829c80/data/assets/backglass/thumb/Funhouse (Williams 1990).png
--------------------------------------------------------------------------------
/data/assets/backglass/thumb/Getaway - High Speed II (Williams 1992).png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vpdb/server/c790f6ff0f6572edc6ccfcb1cf8f853db2829c80/data/assets/backglass/thumb/Getaway - High Speed II (Williams 1992).png
--------------------------------------------------------------------------------
/data/assets/backglass/thumb/Indiana Jones (Stern 2008).png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vpdb/server/c790f6ff0f6572edc6ccfcb1cf8f853db2829c80/data/assets/backglass/thumb/Indiana Jones (Stern 2008).png
--------------------------------------------------------------------------------
/data/assets/backglass/thumb/Indianapolis 500 (Midway 1995).png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vpdb/server/c790f6ff0f6572edc6ccfcb1cf8f853db2829c80/data/assets/backglass/thumb/Indianapolis 500 (Midway 1995).png
--------------------------------------------------------------------------------
/data/assets/backglass/thumb/Lord Of The Rings (Stern 2003).png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vpdb/server/c790f6ff0f6572edc6ccfcb1cf8f853db2829c80/data/assets/backglass/thumb/Lord Of The Rings (Stern 2003).png
--------------------------------------------------------------------------------
/data/assets/backglass/thumb/Medieval Madness (Williams 1997).png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vpdb/server/c790f6ff0f6572edc6ccfcb1cf8f853db2829c80/data/assets/backglass/thumb/Medieval Madness (Williams 1997).png
--------------------------------------------------------------------------------
/data/assets/backglass/thumb/Monster Bash (Williams 1998).png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vpdb/server/c790f6ff0f6572edc6ccfcb1cf8f853db2829c80/data/assets/backglass/thumb/Monster Bash (Williams 1998).png
--------------------------------------------------------------------------------
/data/assets/backglass/thumb/STTNG (Williams 1993).png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vpdb/server/c790f6ff0f6572edc6ccfcb1cf8f853db2829c80/data/assets/backglass/thumb/STTNG (Williams 1993).png
--------------------------------------------------------------------------------
/data/assets/backglass/thumb/Scared Stiff (Williams 1996).png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vpdb/server/c790f6ff0f6572edc6ccfcb1cf8f853db2829c80/data/assets/backglass/thumb/Scared Stiff (Williams 1996).png
--------------------------------------------------------------------------------
/data/assets/backglass/thumb/Tales of the Arabian Nights (Williams 1996).png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vpdb/server/c790f6ff0f6572edc6ccfcb1cf8f853db2829c80/data/assets/backglass/thumb/Tales of the Arabian Nights (Williams 1996).png
--------------------------------------------------------------------------------
/data/assets/backglass/thumb/Terminator 2 - Judgment Day (Williams 1991).png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vpdb/server/c790f6ff0f6572edc6ccfcb1cf8f853db2829c80/data/assets/backglass/thumb/Terminator 2 - Judgment Day (Williams 1991).png
--------------------------------------------------------------------------------
/data/assets/backglass/thumb/The Adams Family (Williams 1992).png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vpdb/server/c790f6ff0f6572edc6ccfcb1cf8f853db2829c80/data/assets/backglass/thumb/The Adams Family (Williams 1992).png
--------------------------------------------------------------------------------
/data/assets/backglass/thumb/The Simpsons Pinball Party (Stern 2003).png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vpdb/server/c790f6ff0f6572edc6ccfcb1cf8f853db2829c80/data/assets/backglass/thumb/The Simpsons Pinball Party (Stern 2003).png
--------------------------------------------------------------------------------
/data/assets/backglass/thumb/Tommy The Pinball Wizard (Data East 1994).png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vpdb/server/c790f6ff0f6572edc6ccfcb1cf8f853db2829c80/data/assets/backglass/thumb/Tommy The Pinball Wizard (Data East 1994).png
--------------------------------------------------------------------------------
/data/assets/backglass/thumb/Twilight Zone (Bally 1993).png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vpdb/server/c790f6ff0f6572edc6ccfcb1cf8f853db2829c80/data/assets/backglass/thumb/Twilight Zone (Bally 1993).png
--------------------------------------------------------------------------------
/data/assets/backglass/thumb/Whitewater (Williams 1993).png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vpdb/server/c790f6ff0f6572edc6ccfcb1cf8f853db2829c80/data/assets/backglass/thumb/Whitewater (Williams 1993).png
--------------------------------------------------------------------------------
/data/assets/backglass/thumb/Who Dunnit (Bally 1995).png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vpdb/server/c790f6ff0f6572edc6ccfcb1cf8f853db2829c80/data/assets/backglass/thumb/Who Dunnit (Bally 1995).png
--------------------------------------------------------------------------------
/data/assets/backglass/thumb/World Cup Soccer (Midway 1994).png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vpdb/server/c790f6ff0f6572edc6ccfcb1cf8f853db2829c80/data/assets/backglass/thumb/World Cup Soccer (Midway 1994).png
--------------------------------------------------------------------------------
/data/assets/cabinet/afm35.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vpdb/server/c790f6ff0f6572edc6ccfcb1cf8f853db2829c80/data/assets/cabinet/afm35.png
--------------------------------------------------------------------------------
/data/assets/cabinet/centaur.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vpdb/server/c790f6ff0f6572edc6ccfcb1cf8f853db2829c80/data/assets/cabinet/centaur.png
--------------------------------------------------------------------------------
/data/assets/cabinet/cv-platinum-1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vpdb/server/c790f6ff0f6572edc6ccfcb1cf8f853db2829c80/data/assets/cabinet/cv-platinum-1.png
--------------------------------------------------------------------------------
/data/assets/cabinet/cv-platinum-2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vpdb/server/c790f6ff0f6572edc6ccfcb1cf8f853db2829c80/data/assets/cabinet/cv-platinum-2.png
--------------------------------------------------------------------------------
/data/assets/cabinet/cv-platinum-3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vpdb/server/c790f6ff0f6572edc6ccfcb1cf8f853db2829c80/data/assets/cabinet/cv-platinum-3.png
--------------------------------------------------------------------------------
/data/assets/cabinet/ij.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vpdb/server/c790f6ff0f6572edc6ccfcb1cf8f853db2829c80/data/assets/cabinet/ij.png
--------------------------------------------------------------------------------
/data/assets/cabinet/mb_pckiller.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vpdb/server/c790f6ff0f6572edc6ccfcb1cf8f853db2829c80/data/assets/cabinet/mb_pckiller.png
--------------------------------------------------------------------------------
/data/assets/cabinet/t2chrome.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vpdb/server/c790f6ff0f6572edc6ccfcb1cf8f853db2829c80/data/assets/cabinet/t2chrome.png
--------------------------------------------------------------------------------
/data/assets/directb2s/thumbs/cc-monster-bash--williams-1998-.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vpdb/server/c790f6ff0f6572edc6ccfcb1cf8f853db2829c80/data/assets/directb2s/thumbs/cc-monster-bash--williams-1998-.png
--------------------------------------------------------------------------------
/data/assets/directb2s/thumbs/monster-bash-illuminated.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vpdb/server/c790f6ff0f6572edc6ccfcb1cf8f853db2829c80/data/assets/directb2s/thumbs/monster-bash-illuminated.png
--------------------------------------------------------------------------------
/data/assets/flyer/thumb/Monster Bash (Williams 1998).jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vpdb/server/c790f6ff0f6572edc6ccfcb1cf8f853db2829c80/data/assets/flyer/thumb/Monster Bash (Williams 1998).jpg
--------------------------------------------------------------------------------
/data/assets/instructioncard/Monster Bash (Williams 1998).swf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vpdb/server/c790f6ff0f6572edc6ccfcb1cf8f853db2829c80/data/assets/instructioncard/Monster Bash (Williams 1998).swf
--------------------------------------------------------------------------------
/data/assets/instructioncard/thumb/Monster Bash (Williams 1998).png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vpdb/server/c790f6ff0f6572edc6ccfcb1cf8f853db2829c80/data/assets/instructioncard/thumb/Monster Bash (Williams 1998).png
--------------------------------------------------------------------------------
/data/assets/logo/afm.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vpdb/server/c790f6ff0f6572edc6ccfcb1cf8f853db2829c80/data/assets/logo/afm.png
--------------------------------------------------------------------------------
/data/assets/logo/cv.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vpdb/server/c790f6ff0f6572edc6ccfcb1cf8f853db2829c80/data/assets/logo/cv.png
--------------------------------------------------------------------------------
/data/assets/logo/ij.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vpdb/server/c790f6ff0f6572edc6ccfcb1cf8f853db2829c80/data/assets/logo/ij.png
--------------------------------------------------------------------------------
/data/assets/logo/mb.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vpdb/server/c790f6ff0f6572edc6ccfcb1cf8f853db2829c80/data/assets/logo/mb.png
--------------------------------------------------------------------------------
/data/assets/logo/sttng.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vpdb/server/c790f6ff0f6572edc6ccfcb1cf8f853db2829c80/data/assets/logo/sttng.png
--------------------------------------------------------------------------------
/data/assets/logo/t2chrome.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vpdb/server/c790f6ff0f6572edc6ccfcb1cf8f853db2829c80/data/assets/logo/t2chrome.png
--------------------------------------------------------------------------------
/data/assets/logo/tm-bop.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vpdb/server/c790f6ff0f6572edc6ccfcb1cf8f853db2829c80/data/assets/logo/tm-bop.png
--------------------------------------------------------------------------------
/data/assets/logo/totan.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vpdb/server/c790f6ff0f6572edc6ccfcb1cf8f853db2829c80/data/assets/logo/totan.png
--------------------------------------------------------------------------------
/data/assets/logo/ww.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vpdb/server/c790f6ff0f6572edc6ccfcb1cf8f853db2829c80/data/assets/logo/ww.png
--------------------------------------------------------------------------------
/data/assets/packs/stern-2000s.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vpdb/server/c790f6ff0f6572edc6ccfcb1cf8f853db2829c80/data/assets/packs/stern-2000s.png
--------------------------------------------------------------------------------
/data/assets/packs/williams-1990s.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vpdb/server/c790f6ff0f6572edc6ccfcb1cf8f853db2829c80/data/assets/packs/williams-1990s.png
--------------------------------------------------------------------------------
/deploy/ci/travis.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | # Stop on error
4 | set -e
5 |
6 | # Install dependencies
7 | echo travis_fold:start:npm-install
8 | npm install -g pngquant-bin
9 | npm install
10 | echo travis_fold:end:npm-install
11 |
12 | # Print versions
13 | echo travis_fold:start:Versions
14 | echo "node version: $(node --version)"
15 | echo "npm version: $(npm --version)"
16 | echo "ffmpeg version: $(ffmpeg -version)"
17 | echo "pngquant version: $(pngquant --version)"
18 | echo travis_fold:end:Versions
19 |
20 | export LD_PRELOAD="/home/travis/build/vpdb/server/node_modules/sharp/vendor/lib/libz.so"
21 |
22 | # Run tests
23 | npm run test:ci
--------------------------------------------------------------------------------
/deploy/elastic/logstash/11-json-filter.conf:
--------------------------------------------------------------------------------
1 | filter {
2 |
3 | if "json" in [tags] and "vpdb" in [tags] {
4 |
5 | json {
6 | source => "message"
7 | target => "vpdb"
8 | }
9 |
10 | geoip {
11 | source => "[vpdb][request][ip]"
12 | target => "[vpdb][access][geoip]"
13 | }
14 |
15 | date {
16 | match => [ "[vpdb][time]", "ISO8601" ]
17 | remove_field => [ "[vpdb][time]" ]
18 | }
19 |
20 | mutate {
21 | copy => { "[vpdb][message]" => "message" }
22 | copy => { "[vpdb][level]" => "log_level" }
23 | copy => { "[vpdb][request][ip]" => "[vpdb][request][host]" }
24 | remove_tag => [ "vpdb", "json" ]
25 | add_field => { "[fileset][module]" => "vpdb" }
26 | add_field => { "[fileset][name]" => "%{[vpdb][type]}" }
27 | remove_field => [ "[vpdb][message]", "[vpdb][level]", "[vpdb][type]" ]
28 | }
29 |
30 | dns {
31 | reverse => [ "[vpdb][request][host]" ]
32 | action => "replace"
33 | }
34 |
35 | if "/api/" in [vpdb][request][path] { mutate { add_field => { "[fileset][app]" => "api" } } }
36 | if "/storage/" in [vpdb][request][path] { mutate { add_field => { "[fileset][app]" => "storage_api" } } }
37 | }
38 | }
39 |
--------------------------------------------------------------------------------
/deploy/hooks/post-receive-production:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | DEPLOY_ENV='production'
4 | ROLLBACK=0
5 |
6 | # Re-launch as deployer if root
7 | if [ "$(id -u)" == "0" ]; then
8 | sudo -i -H -u deployer SPWD="$PWD" SCRIPT="$0" BRANCH="$1" COMMIT="$2" bash -c 'cd $SPWD; "$SCRIPT" $BRANCH $COMMIT'
9 | exit $?
10 | fi
11 |
12 | . ./hooks/common
13 |
14 | LAST_TAG=`repo_last_tag`
15 | if [ -z "$LAST_TAG" ]; then
16 | abort No tag found.
17 | fi
18 |
19 | echo Deploying version ${LAST_TAG}...
20 |
21 | # 1. clone into new folder
22 | repo_clone ${LAST_TAG}
23 | repo_checkout_tag ${LAST_TAG}
24 |
25 | # 2. install node packages
26 | npm_install ${LAST_TAG}
27 |
28 | # 3. compile to javascript
29 | build ${LAST_TAG}
30 |
31 | # 4. change symlink
32 | repo_link ${LAST_TAG}
33 |
34 | # 5. reload node cluster
35 | node_cluster_reload
36 |
37 | # 6. post scripts
38 | post_scripts ${LAST_TAG}
39 |
40 | # 7. cleanup old deployment
41 | repo_cleanup "v[0-9]+\.[0-9]+\.[0-9]+"
42 |
43 | echo ==================================================================
44 | echo Production deployment successful!
45 | echo ==================================================================
46 |
--------------------------------------------------------------------------------
/deploy/hooks/post-receive-staging:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | DEPLOY_ENV='staging'
4 | ROLLBACK=1
5 |
6 | # Re-launch as deployer if root
7 | if [ "$(id -u)" == "0" ]; then
8 | sudo -i -H -u deployer SPWD="$PWD" SCRIPT="$0" BRANCH="$1" COMMIT="$2" bash -c 'cd $SPWD; "$SCRIPT" $BRANCH $COMMIT'
9 | exit $?
10 | fi
11 |
12 | . ./hooks/common
13 |
14 | BRANCH=`repo_get_branch $1`
15 | HEAD_REV=`git rev-parse ${BRANCH}`
16 | HEAD_REV=${HEAD_REV:0:10}
17 |
18 | DIRNAME=${BRANCH}-${HEAD_REV}
19 |
20 | # 1. clone into new folder
21 | repo_clone ${DIRNAME}
22 | repo_checkout_branch ${DIRNAME} ${BRANCH}
23 |
24 | # 2. install node packages
25 | npm_install_copy ${DIRNAME}
26 |
27 | # 3. compile to javascript
28 | build ${DIRNAME}
29 |
30 | # 4. change symlink
31 | repo_link ${DIRNAME}
32 |
33 | # 5. reload node cluster
34 | node_cluster_reload
35 |
36 | # 6. post scripts
37 | post_scripts ${DIRNAME}
38 |
39 | # 7. cleanup old deployment
40 | repo_cleanup "[a-z0-9_\\\\-]-[a-f0-9]{10}"
41 |
42 | echo ==================================================================
43 | echo Staging deployment successful!
44 | echo ==================================================================
45 |
--------------------------------------------------------------------------------
/deploy/nginx/mime.types:
--------------------------------------------------------------------------------
1 | types {
2 |
3 | # your current ones...
4 |
5 | application/x-directb2s directb2s;
6 | application/x-visual-pinball-table vpt;
7 | application/x-visual-pinball-table-x vpx;
8 | model/gltf-binary glb;
9 | model/gltf+json gltf;
10 | }
--------------------------------------------------------------------------------
/deploy/nginx/sites/preview.nginx:
--------------------------------------------------------------------------------
1 | server {
2 |
3 | listen 443 ssl http2;
4 | server_name preview.vpdb.io;
5 | root /var/data/storage-public;
6 |
7 | charset utf-8;
8 |
9 | # path to your certs and chain of trust of OCSP response using Root CA and Intermediate certs
10 | ssl_certificate /etc/letsencrypt/live/preview.vpdb.io/fullchain.pem;
11 | ssl_certificate_key /etc/letsencrypt/live/preview.vpdb.io/privkey.pem;
12 | ssl_trusted_certificate /etc/letsencrypt/live/preview.vpdb.io/chain.pem;
13 |
14 | include /etc/nginx/snippets/ssl.nginx;
15 |
16 | # logs
17 | error_log /var/log/nginx/preview.vpdb.io-error.log;
18 | access_log /var/log/nginx/preview.vpdb.io-access.log extended;
19 |
20 | # letsencrypt challenge
21 | include /etc/nginx/snippets/letsencrypt.nginx;
22 |
23 | # map public assets
24 | location /files {
25 | alias /var/data/storage-public;
26 | add_header Cache-Control "no-transform,public,max-age=2592000" always;
27 | include /etc/nginx/snippets/cors.nginx;
28 | etag on;
29 | }
30 | }
31 |
32 | # redirect to https
33 | server {
34 | listen 80;
35 | server_name preview.vpdb.io;
36 | return 301 https://preview.vpdb.io$request_uri;
37 | }
38 |
--------------------------------------------------------------------------------
/deploy/nginx/snippets/letsencrypt.nginx:
--------------------------------------------------------------------------------
1 | # letsencrypt challenge
2 | location ~ /.well-known {
3 | root /etc/nginx/ssl/letsencrypt;
4 | auth_basic "off";
5 | allow all;
6 | }
7 |
--------------------------------------------------------------------------------
/deploy/nginx/snippets/security.nginx:
--------------------------------------------------------------------------------
1 | # HSTS (15768000 seconds = 6 months)
2 | add_header Strict-Transport-Security "max-age=31536000; includeSubdomains" always;
3 |
4 | # https://developer.mozilla.org/en-US/docs/HTTP/X-Frame-Options
5 | add_header X-Frame-Options "SAMEORIGIN" always;
6 |
7 | # https://www.owasp.org/index.php/List_of_useful_HTTP_headers
8 | add_header X-Content-Type-Options "nosniff" always;
9 |
10 | # https://www.owasp.org/index.php/List_of_useful_HTTP_headers
11 | add_header X-XSS-Protection "1; mode=block" always;
12 |
--------------------------------------------------------------------------------
/deploy/nginx/snippets/ssl.nginx:
--------------------------------------------------------------------------------
1 | # Diffie-Hellman parameter for DHE ciphersuites, recommended 2048 bits
2 | ssl_dhparam /etc/nginx/ssl/dhparam.pem;
3 | ssl_session_timeout 1d;
4 |
5 | # intermediate configuration. tweak to your needs.
6 | ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
7 | ssl_ciphers ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!MD5:!DSS;
8 | ssl_prefer_server_ciphers on;
9 |
10 | # HSTS (ngx_http_headers_module is required) (15768000 seconds = 6 months)
11 | add_header Strict-Transport-Security "max-age=31536000; includeSubdomains";
12 |
13 | # OCSP Stapling ---
14 | # fetch OCSP records from URL in ssl_certificate and cache them
15 | ssl_stapling on;
16 | ssl_stapling_verify on;
17 |
--------------------------------------------------------------------------------
/deploy/nodemon/dev.json:
--------------------------------------------------------------------------------
1 | {
2 | "restartable": "rs",
3 | "ignore": [
4 | ".git",
5 | "src/app/**/*.spec.js"
6 | ],
7 | "verbose": true,
8 | "watch": [
9 | "src/app/**"
10 | ],
11 | "env": {
12 | "NODE_ENV": "development",
13 | "PORT": "3000",
14 | "APP_NAME": "local",
15 | "APP_SETTINGS": "config\\settings.js"
16 | },
17 | "ext": "ts js json"
18 | }
--------------------------------------------------------------------------------
/deploy/pm2/production.json:
--------------------------------------------------------------------------------
1 | {
2 | "apps": [
3 | {
4 | "name": "production",
5 | "script": "build/app.js",
6 | "watch": false,
7 | "merge_logs": true,
8 | "cwd": "/var/www/production/current",
9 | "exec_mode": "cluster",
10 | "instances": "0",
11 | "env": {
12 | "NODE_ENV": "production",
13 | "PORT": "4004",
14 | "APP_NAME": "production",
15 | "APP_SETTINGS": "/var/www/production/settings.js",
16 | "PMX_ENABLED": 0,
17 | "NEW_RELIC_ENABLED": 0,
18 | "NEW_RELIC_APP_NAME": "vpdb.io",
19 | "NEW_RELIC_LICENSE_KEY": "xxx",
20 | "NEW_RELIC_LOG_LEVEL": "info",
21 | "LD_PRELOAD": "/var/www/server/production/current/node_modules/sharp/vendor/lib/libz.so"
22 | }
23 | }
24 | ]
25 | }
26 |
--------------------------------------------------------------------------------
/deploy/pm2/staging.json:
--------------------------------------------------------------------------------
1 | {
2 | "apps": [
3 | {
4 | "name": "staging",
5 | "script": "build/app/index.js",
6 | "watch": false,
7 | "merge_logs": true,
8 | "cwd": "/var/www/server/staging/current",
9 | "exec_mode": "fork",
10 | "instances": "1",
11 | "env": {
12 | "NODE_ENV": "production",
13 | "PORT": "3003",
14 | "APP_NAME": "staging",
15 | "APP_SETTINGS": "/var/www/server/staging/settings.js",
16 | "PMX_ENABLED": 1,
17 | "NEW_RELIC_ENABLED": 0,
18 | "NEW_RELIC_APP_NAME": "xxx.vpdb.io",
19 | "NEW_RELIC_LICENSE_KEY": "xxx",
20 | "NEW_RELIC_LOG_LEVEL": "info"
21 | }
22 | }
23 | ]
24 | }
25 |
--------------------------------------------------------------------------------
/deploy/scripts/vpdb_production_deploy:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | cd ~/production
4 | ./hooks/post-receive
5 |
--------------------------------------------------------------------------------
/deploy/scripts/vpdb_reset_to_production:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | APP_SETTINGS=/var/www/server/staging/settings.js node /var/www/server/staging/current/server/scripts/reset-to-production.js
4 |
--------------------------------------------------------------------------------
/deploy/scripts/vpdb_staging_deploy:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | cd ~/staging
4 | ./hooks/post-receive
5 |
--------------------------------------------------------------------------------
/deploy/tools/dropdb.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | Promise = require('bluebird');
4 | const mongoose = require('mongoose');
5 | const redis = require('redis');
6 | mongoose.Promise = Promise;
7 | Promise.promisifyAll(redis.RedisClient.prototype);
8 | Promise.promisifyAll(redis.Multi.prototype);
9 |
10 | const settings = require('../../config/settings.test');
11 |
12 | const mongoOpts = {
13 | keepAlive: true,
14 | connectTimeoutMS: 5000,
15 | useNewUrlParser: true
16 | };
17 | let redisClient;
18 | mongoose.connect(settings.vpdb.db, mongoOpts).then(() => {
19 | console.log('[dropdb] Dropping MongoDB collection...');
20 | return mongoose.connection.db.dropDatabase();
21 |
22 | }).then(() => {
23 | console.log('[dropdb] Closing MongoDB collection...');
24 | return mongoose.connection.close();
25 |
26 | }).then(() => {
27 | redisClient = redis.createClient(settings.vpdb.redis.port, settings.vpdb.redis.host, { no_ready_check: true });
28 |
29 | console.log('[dropdb] Flushing Redis...');
30 | redisClient.select(settings.vpdb.redis.db);
31 | return redisClient.flushallAsync();
32 |
33 | }).then(() => {
34 | redisClient.end(true);
35 | console.log('[dropdb] All done!');
36 | process.exit(0);
37 |
38 | }).catch(err => {
39 | console.log('[dropdb] Error dropping databases: %s', err.message);
40 | process.exit(1);
41 | });
--------------------------------------------------------------------------------
/deploy/tools/finish.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | const url = 'http://127.0.0.1:' + process.env.PORT + '/api/v1/kill';
4 | console.log("[test] Killing off server at %s", url);
5 | require('request').post({ url: url, headers: { 'Content-Type': 'application/json' } }, () => console.log('[test] Killswitch triggered.'));
6 |
--------------------------------------------------------------------------------
/deploy/tools/wait.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | Promise = require('bluebird');
4 | const http = require('http');
5 | const config = require('../../config/settings.test');
6 |
7 | function check() {
8 | return new Promise((resolve, reject) => {
9 | http.get({
10 | hostname: config.vpdb.api.hostname,
11 | port: config.vpdb.api.port,
12 | path: (config.vpdb.api.prefix || '') + config.vpdb.api.pathname,
13 | }, () => {
14 | resolve();
15 |
16 | }).on('error', () => {
17 | reject();
18 | });
19 | });
20 | }
21 |
22 | let counter = 120;
23 | function poll() {
24 | return check().then(() => {
25 | console.log('[wait] Server up!');
26 | process.exit(0);
27 |
28 | }).catch(() => {
29 | if (counter-- > 0) {
30 | console.log('[wait] Waiting for server at %s:%s', config.vpdb.api.hostname, config.vpdb.api.port);
31 | return Promise.delay(1000).then(poll);
32 | } else {
33 | process.exit(1);
34 | }
35 | });
36 | }
37 | poll();
--------------------------------------------------------------------------------
/doc/api/pagination.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: API Pagination
3 | header: Pagination
4 | layout: page.pug
5 | menuIndex: 1
6 | subsectionIndex: 3
7 | ---
8 |
9 | URL rendering tests:
10 |
11 | - [/users](api://core/users)
12 | - [GET /users](api://core/get/users)
13 | - [GET /users/{user_id}](api://core/get/users/{user_id})
14 |
--------------------------------------------------------------------------------
/doc/api/v1/_includes/moderated_entity.raml:
--------------------------------------------------------------------------------
1 | post:
2 | securedBy: [ jwt: { scopes: [ MODERATOR ] } ]
3 | description: |
4 | Moderate an entity.
5 |
6 | Moderation means that entities aren't publicly visible on the site when
7 | created but only after a moderator approved. This resource allows to
8 | either refuse, approve or set the entity back to moderated.
9 |
10 | Note that entities created by a contributor are automatically approved.
11 |
12 | body:
13 | role/moderator:
14 | schema: moderate-entity
--------------------------------------------------------------------------------
/doc/api/v1/_schemas/comment.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "http://json-schema.org/schema",
3 | "title": "Comment",
4 | "description": "A comment that is attached to an object (supported objects: release)",
5 | "type": "object",
6 | "properties": {
7 | "id": {
8 | "description": "Unique identifier for a build. Gets generated automatically on creation.",
9 | "type": "string",
10 | "pattern": "^[a-z0-9._-]{2,}$",
11 | "readOnly": true
12 | },
13 | "from": {
14 | "description": "User who wrote the comment",
15 | "type": "object",
16 | "readOnly": true
17 | },
18 | "message": {
19 | "description": "Message",
20 | "type": "string",
21 | "minLength": 3,
22 | "maxLength": 5000
23 | },
24 | "created_at": {
25 | "description": "Timestamp when the comment was posted.",
26 | "type": "date",
27 | "readOnly": true
28 | }
29 | },
30 | "required": [ "id", "message" ]
31 | }
32 |
--------------------------------------------------------------------------------
/doc/api/v1/_schemas/moderate-entity.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "http://json-schema.org/schema",
3 | "title": "User Registration",
4 | "description": "Entity sent when creating a new user",
5 | "type": "object",
6 | "properties": {
7 | "name": {
8 | "description": "Name used when displaying the user.",
9 | "type": "string",
10 | "minLength": 3,
11 | "maxLength": 30
12 | },
13 | "email": {
14 | "description": "The email address of the user",
15 | "type": "string",
16 | "unique": true,
17 | "format": "email"
18 | },
19 | "location": {
20 | "description": "An arbitrary string describing the user's location.",
21 | "type": "string",
22 | "maxLength": 30
23 | }
24 | },
25 | "required": ["name", "email" ]
26 | }
27 |
--------------------------------------------------------------------------------
/doc/api/v1/_schemas/tag.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "http://json-schema.org/schema",
3 | "title": "Game",
4 | "description": "A game is a release-agnostic pinball table.",
5 | "type": "object",
6 | "properties": {
7 | "id": {
8 | "description": "Unique identifier for a tag. Gets generated automatically on creation.",
9 | "type": "string",
10 | "pattern": "^[a-z0-9-]{2,}$",
11 | "readOnly": true
12 | },
13 | "name": {
14 | "description": "Name of the tag. Should be as short as possible (~3 characters)",
15 | "type": "string",
16 | "minLength": 2
17 | },
18 | "description": {
19 | "description": "A short description of the tag.",
20 | "type": "string",
21 | "minLength": 5
22 | },
23 | "is_active": {
24 | "description": "When creating a new tag, it first becomes inactive. When linking a release to the tag, it becomes active.",
25 | "type": "boolean",
26 | "readOnly": true
27 | },
28 | "created_at": {
29 | "description": "Timestamp when the tag was added to the database.",
30 | "type": "date",
31 | "readOnly": true
32 | },
33 | "_created_by": {
34 | "description": "Reference to the user who created this tag. Only visible by contributors and above.",
35 | "type": "string",
36 | "readOnly": true
37 | }
38 | },
39 | "required": [ "id", "name", "description" ]
40 | }
41 |
--------------------------------------------------------------------------------
/doc/api/v1/_schemas/user-authenticate.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "http://json-schema.org/schema",
3 | "title": "User Authentication",
4 | "description": "Entity sent when authenticating locally.",
5 | "type": "object",
6 | "properties": {
7 | "username": {
8 | "description": "A unique username.",
9 | "type": "string",
10 | "minLength": 3,
11 | "maxLength": 30,
12 | "unique": true
13 | },
14 | "password": {
15 | "description": "A password for identifying the user.",
16 | "type": "string",
17 | "minLength": 6
18 | }
19 | },
20 | "required": ["username", "password" ]
21 | }
22 |
--------------------------------------------------------------------------------
/doc/api/v1/_schemas/user-chpass.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "http://json-schema.org/schema",
3 | "title": "Change password",
4 | "description": "Change the user's own password",
5 | "type": "object",
6 | "properties": {
7 | "current_password": {
8 | "description": "The user's current password",
9 | "type": "string",
10 | "minLength": 6
11 | },
12 | "password": {
13 | "description": "The new password",
14 | "type": "string",
15 | "minLength": 6
16 | }
17 | },
18 | "required": [
19 | "current_password",
20 | "password"
21 | ]
22 | }
23 |
--------------------------------------------------------------------------------
/doc/api/v1/_schemas/user-create-local.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "http://json-schema.org/schema",
3 | "title": "Create local credentials",
4 | "description": "Only possible if the user was created using a third party OAuth provider.",
5 | "type": "object",
6 | "properties": {
7 | "username": {
8 | "description": "Username used when locally logging in.",
9 | "type": "string",
10 | "minLength": 3,
11 | "maxLength": 30,
12 | "unique": true
13 | },
14 | "password": {
15 | "description": "A password for identifying the user.",
16 | "type": "string",
17 | "minLength": 6
18 | }
19 | },
20 | "required": [
21 | "username",
22 | "password"
23 | ]
24 | }
25 |
--------------------------------------------------------------------------------
/doc/api/v1/_schemas/user-register.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "http://json-schema.org/schema",
3 | "title": "User Registration",
4 | "description": "Entity sent when creating a new user",
5 | "type": "object",
6 | "properties": {
7 | "username": {
8 | "description": "Username used when locally logging in.",
9 | "type": "string",
10 | "minLength": 3,
11 | "maxLength": 30,
12 | "unique": true
13 | },
14 | "password": {
15 | "description": "A password for identifying the user.",
16 | "type": "string",
17 | "minLength": 6
18 | },
19 | "email": {
20 | "description": "The email address of the user",
21 | "type": "string",
22 | "unique": true,
23 | "format": "email"
24 | }
25 | },
26 | "required": ["username", "password", "email" ]
27 | }
28 |
--------------------------------------------------------------------------------
/doc/api/v1/_schemas/user-token-confirmation.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "http://json-schema.org/schema",
3 | "title": "Email Token Confirmation",
4 | "description": "Response when a token was successfully confirmed.",
5 | "type": "object",
6 | "properties": {
7 | "message": {
8 | "description": "Success message",
9 | "type": "string"
10 | },
11 | "previous_code": {
12 | "description": "The previous email status code. The following are valid values:\n * `pending_registration` - Email address is to be confirmed after registration.\n * `pending_update` - Email address is to be confirmed after profile update.\n\n",
13 | "type": "string",
14 | "enum": [ "pending_registration", "pending_update" ]
15 | }
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/doc/api/v1/_schemas/user-update-profile.json:
--------------------------------------------------------------------------------
1 | {
2 | "$schema": "http://json-schema.org/schema",
3 | "title": "User Registration",
4 | "description": "Entity sent when creating a new user",
5 | "type": "object",
6 | "properties": {
7 | "name": {
8 | "description": "Name used when displaying the user.",
9 | "type": "string",
10 | "minLength": 3,
11 | "maxLength": 30
12 | },
13 | "email": {
14 | "description": "The email address of the user",
15 | "type": "string",
16 | "unique": true,
17 | "format": "email"
18 | },
19 | "location": {
20 | "description": "An arbitrary string describing the user's location.",
21 | "type": "string",
22 | "maxLength": 30
23 | }
24 | },
25 | "required": ["name", "email" ]
26 | }
27 |
--------------------------------------------------------------------------------
/doc/api/v1/_securitySchemes/jwt.raml:
--------------------------------------------------------------------------------
1 | description: Bearer token authentication using JSON web tokens.
2 | type: x-jwt
3 | describedBy:
4 | headers:
5 | Authorization:
6 | description: |
7 | Used to send a valid JSON web token. For more information check
8 | the [RFC draft](http://tools.ietf.org/html/draft-jones-json-web-token-10).
9 | type: string
10 | responses:
11 | 401:
12 | description: |
13 | Bad or expired token. To fix, you should re-authenticate the
14 | user.
15 | 403:
16 | description: |
17 | Acces denied. That means that the user was authenticated
18 | successfully but hasn't permission to acess the resource. In
19 | this case, re-authenticating won't help.
20 | settings:
21 | authorizationUri: https://vpdb.io/api/authorize
22 |
--------------------------------------------------------------------------------
/doc/api/v1/_traits/eventlog.raml:
--------------------------------------------------------------------------------
1 | queryParameters:
2 | events:
3 | description: |
4 | Only list events of a given type.
5 |
6 | Multiple values are separated by comma. If you prefix an event with `!`,
7 | all events **not** of that type are returned.
8 |
9 | Valid types: `create_comment`, `star_game`, `star_release`, `star_user`,
10 | `unstar_game`, `unstar_release`, `unstar_user`, `rate_game`,
11 | `rate_release`, `rate_user`, `upload_rom`, `create_game`,
12 | `create_release`, `create_release_version`.
13 |
14 | required: false
15 | type: string
16 | example: create_game,create_release
17 |
18 | starred:
19 | description:
20 | If set, only events related to the user's starred releases and games
21 | are returned.
22 |
23 | Note that you need to be logged if you provide this parameter,
24 | otherwise `401 Unauthorized` is returned.
25 | required: false
26 | type: boolean
27 | example: true
28 |
--------------------------------------------------------------------------------
/doc/api/v1/_traits/moderated_list.raml:
--------------------------------------------------------------------------------
1 | queryParameters:
2 | moderation:
3 | description: |
4 | Returns entities that are other than approved.
5 |
6 | You must be logged as moderator, otherwise a `403` is returned.
7 |
8 | One of the following:
9 |
10 | - `pending` - List entities that are not approved or refused yet
11 | - `refused` - List refused entities
12 | - `manually_approved` - List entities that were manually approved
13 | - `auto_approved` - List entities that were auto-approved
14 | - `all` - List all entities
15 | required: false
16 | type: string
17 | example: pending
18 |
--------------------------------------------------------------------------------
/doc/api/v1/_traits/paginated.raml:
--------------------------------------------------------------------------------
1 | queryParameters:
2 | page:
3 | description: Current page to return.
4 | required: false
5 | type: integer
6 | per_page:
7 | description: |
8 | How many items per page to return.
9 |
10 | * Default: `<>`
11 | * Maximal number: `<>`
12 | required: false
13 | type: integer
--------------------------------------------------------------------------------
/doc/api/v1/_traits/protected.raml:
--------------------------------------------------------------------------------
1 | headers:
2 | Authorization:
3 | description: A valid *JSON Web Token*.
4 | type: string
5 | required: true
6 | responses:
7 | 401:
8 | description: |
9 | Authentication credentials are missing or invalid.
10 | Maybe you forgot to add the `Authorization` header, or it has the wrong value.
11 | 403:
12 | description: |
13 | Valid credentials are provided but the user doesn't have access to the
14 | resource. Only re-logging as a **different** user will solve this problem.
--------------------------------------------------------------------------------
/doc/api/v1/_traits/sorted.raml:
--------------------------------------------------------------------------------
1 | queryParameters:
2 | sort:
3 | description: |
4 | Field name to sort the result after.
5 |
6 | Default sort order depends on the field, for string fields it's usually
7 | ascending, while for date fields it's descending. In order to reverse the
8 | search order, suffix the field with a minus (`-`).
9 |
10 | Check the resource overview for a list of sortable fields.
11 | required: false
12 | type: string
13 | example: -year
14 |
--------------------------------------------------------------------------------
/doc/api/v1/_traits/validated.raml:
--------------------------------------------------------------------------------
1 | responses:
2 | 422:
3 | description: |
4 | Validation failed. The structure of the posted data was correct but
5 | contained semantical errors.
--------------------------------------------------------------------------------
/doc/api/v1/auth/auth.raml:
--------------------------------------------------------------------------------
1 | displayName: Authenticate
2 | description: |
3 | Use this resource in order to obtain an authentication token for the API.
4 | post:
5 | description: |
6 | Generates a token based on user's credentials.
7 |
8 | The user has to be registered locally.
9 | body:
10 | role/anon:
11 | schema: user-authenticate
12 | example: !include http/local-req.json
13 | responses:
14 | 200:
15 | body:
16 | role/anon:
17 | schema: auth
18 | example: !include http/local-res-200.json
19 | 400:
20 | description: If an empty request was posted.
21 | body:
22 | role/anon:
23 | example: !include http/local-res-400.json
24 | 401:
25 | description: When authentication fails
26 | body:
27 | role/anon:
28 | example: !include http/local-res-401.json
29 |
--------------------------------------------------------------------------------
/doc/api/v1/auth/http/local-req.json:
--------------------------------------------------------------------------------
1 | POST /v1/authenticate HTTP/2.0
2 | Host: api.vpdb.io
3 | Accept-Encoding: gzip, deflate
4 | Content-Type: application/json
5 | Content-Length: 47
6 |
7 | {
8 | "password": "JjCfeShesV",
9 | "username": "Benton57"
10 | }
--------------------------------------------------------------------------------
/doc/api/v1/auth/http/local-res-400.json:
--------------------------------------------------------------------------------
1 | 400 Bad Request
2 | Content-Type: application/json; charset=utf-8
3 | Content-Length: 88
4 | Etag: W/"58-K4x82GOzxuYGzKJAflFCBMsKniE"
5 |
6 | {
7 | "error": "You must supply a username and password or a token with \"login\" scope."
8 | }
--------------------------------------------------------------------------------
/doc/api/v1/auth/http/local-res-401.json:
--------------------------------------------------------------------------------
1 | 401 Unauthorized
2 | Content-Type: application/json; charset=utf-8
3 | Content-Length: 42
4 | Etag: W/"2a-C6BnlpWt/JC1oNkGRTlju7JrHSo"
5 |
6 | {
7 | "error": "Wrong username or password"
8 | }
--------------------------------------------------------------------------------
/doc/api/v1/auth/http/storage-req.json:
--------------------------------------------------------------------------------
1 | POST /v1/authenticate HTTP/2.0
2 | Host: api.vpdb.io
3 | Accept-Encoding: gzip, deflate
4 | Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJwa3A5NmtubXRyOSIsImlhdCI6IjIwMTgtMDItMDVUMTQ6MzA6MjIuNDQ5WiIsImV4cCI6IjIwMTgtMDItMDVUMTU6MzA6MjIuNDQ5WiIsImlydCI6ZmFsc2V9.uUmNCiGd9itnfTm-8zzn6tTpL5EZSZlYZSsh6uKhCWs
5 | Content-Type: application/json
6 | Content-Length: 66
7 |
8 | {
9 | "paths": "http://localhost:7357/storage/v1/files/e27b5bamvr9.vpt"
10 | }
--------------------------------------------------------------------------------
/doc/api/v1/auth/http/storage-res-200.json:
--------------------------------------------------------------------------------
1 | 200 OK
2 | Content-Type: application/json; charset=utf-8
3 | Content-Length: 320
4 | Etag: W/"140-eCbgVPJKDDH3OZl5h9JovxrCgjw"
5 |
6 | {
7 | "http://localhost:7357/storage/v1/files/e27b5bamvr9.vpt": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJwa3A5NmtubXRyOSIsImlhdCI6IjIwMTgtMDItMDVUMTQ6MzA6MzQuNTk1WiIsImV4cCI6IjIwMTgtMDItMDVUMTQ6MzE6MzQuNTk1WiIsInBhdGgiOiIvc3RvcmFnZS92MS9maWxlcy9lMjdiNWJhbXZyOS52cHQifQ.6QrV3_2SRK8SBUnpq8aZFujaqhOf4wOC3So-SPQukWI"
8 | }
--------------------------------------------------------------------------------
/doc/api/v1/backglasses/http/create-req.json:
--------------------------------------------------------------------------------
1 | POST /v1/backglasses HTTP/2.0
2 | Host: api.vpdb.io
3 | Accept-Encoding: gzip, deflate
4 | Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJlMnF0dGJ0bXRyOSIsImlhdCI6IjIwMTgtMDItMDVUMTQ6MjY6MjAuNjM4WiIsImV4cCI6IjIwMTgtMDItMDVUMTU6MjY6MjAuNjM4WiIsImlydCI6ZmFsc2V9.WVrbWNkfQnOg18OhTOnwvJpdOOkZq5z3U-pniZZ0WdU
5 | Content-Type: application/json
6 | Content-Length: 458
7 |
8 | {
9 | "_game": "circus",
10 | "acknowledgements": "- Thanks @mom for supporting my late hours\n- Thanks @dad for supporting @mom!",
11 | "authors": [
12 | {
13 | "_user": "e2qttbtmtr9",
14 | "roles": [
15 | "creator"
16 | ]
17 | }
18 | ],
19 | "description": "Photoshopped the super hires backglass together from four different sources!",
20 | "versions": [
21 | {
22 | "_file": "ekk4ahvmvrs",
23 | "changes": "Initial release",
24 | "version": "1.0"
25 | },
26 | {
27 | "_file": "pkf4ahvmvr9",
28 | "changes": "- Backglass is now even more high res!\n- It blinks more.",
29 | "version": "1.1"
30 | }
31 | ]
32 | }
--------------------------------------------------------------------------------
/doc/api/v1/backglasses/http/create-res-422.json:
--------------------------------------------------------------------------------
1 | 422 Unprocessable Entity
2 | Content-Type: application/json; charset=utf-8
3 | Content-Length: 324
4 | Etag: W/"144-ZEJ7tR48A6VjDUlm1nSioDaKoEE"
5 |
6 | {
7 | "errors": [
8 | {
9 | "field": "_game",
10 | "message": "Reference to game must be provided."
11 | },
12 | {
13 | "field": "authors",
14 | "message": "You must provide at least one author.",
15 | "value": [
16 | ]
17 | },
18 | {
19 | "field": "versions",
20 | "message": "You must provide at least one version for the backglass.",
21 | "value": [
22 | ]
23 | }
24 | ]
25 | }
--------------------------------------------------------------------------------
/doc/api/v1/backglasses/http/del-req.json:
--------------------------------------------------------------------------------
1 | DELETE /v1/backglasses/pky4kzvmtrs HTTP/2.0
2 | Host: api.vpdb.io
3 | Accept-Encoding: gzip, deflate
4 | Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJlMnp1ZGh0OHQ1cyIsImlhdCI6IjIwMTgtMDItMDVUMTQ6MjY6MjUuNzMwWiIsImV4cCI6IjIwMTgtMDItMDVUMTU6MjY6MjUuNzMwWiIsImlydCI6ZmFsc2V9.qpiLnwlerbDqBfR5NHr-VOamFejfbDsZ6Jc-Fa7vtQQ
5 |
6 |
--------------------------------------------------------------------------------
/doc/api/v1/backglasses/http/del-res-204.json:
--------------------------------------------------------------------------------
1 | 204 No Content
2 |
3 |
--------------------------------------------------------------------------------
/doc/api/v1/backglasses/http/del-res-403.json:
--------------------------------------------------------------------------------
1 | 403 Forbidden
2 | Content-Type: application/json; charset=utf-8
3 | Content-Length: 49
4 | Etag: W/"31-ywkfrDL4nRMJwVJc6QhLi7n0Ydg"
5 |
6 | {
7 | "error": "Permission denied, must be owner."
8 | }
--------------------------------------------------------------------------------
/doc/api/v1/backglasses/http/list-req.json:
--------------------------------------------------------------------------------
1 | GET /v1/backglasses HTTP/2.0
2 | Host: api.vpdb.io
3 | Accept-Encoding: gzip, deflate
4 |
5 |
--------------------------------------------------------------------------------
/doc/api/v1/backglasses/http/update-req.json:
--------------------------------------------------------------------------------
1 | PATCH /v1/backglasses/pk7bchv8t5s HTTP/2.0
2 | Host: api.vpdb.io
3 | Accept-Encoding: gzip, deflate
4 | Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJwa213NmJ0OHRycyIsImlhdCI6IjIwMTgtMDItMDVUMTQ6MjY6MjIuNDA3WiIsImV4cCI6IjIwMTgtMDItMDVUMTU6MjY6MjIuNDA3WiIsImlydCI6ZmFsc2V9.2Pxy1TmmfXzmsMsIp9hbZ-w52rqN87H4QgQ3KsYKyYM
5 | Content-Type: application/json
6 | Content-Length: 167
7 |
8 | {
9 | "_game": "black-reed",
10 | "acknowledgements": "Thanks to @mom for supporting me.",
11 | "description": "It is a fantasy backglass that does not contain any more spelling errors."
12 | }
--------------------------------------------------------------------------------
/doc/api/v1/backglasses/http/view-req.json:
--------------------------------------------------------------------------------
1 | GET /v1/backglasses/p22qdbvmtrs?fields=moderation HTTP/2.0
2 | Host: api.vpdb.io
3 | Accept-Encoding: gzip, deflate
4 | Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJlMjM0OGh0bXY1OSIsImlhdCI6IjIwMTgtMDItMDVUMTQ6MjY6MjQuNDY4WiIsImV4cCI6IjIwMTgtMDItMDVUMTU6MjY6MjQuNDY4WiIsImlydCI6ZmFsc2V9.z-L43mC5p5FBm1V_j6FFcXEXozXTpKHPh1oJLWtPuwI
5 |
6 |
--------------------------------------------------------------------------------
/doc/api/v1/builds/http/create-req.json:
--------------------------------------------------------------------------------
1 | POST /v1/builds HTTP/2.0
2 | Host: api.vpdb.io
3 | Accept-Encoding: gzip, deflate
4 | Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJwMjYxenZtdnI5IiwiaWF0IjoiMjAxOC0wMi0wNVQxNDoyNjo0MS44NjRaIiwiZXhwIjoiMjAxOC0wMi0wNVQxNToyNjo0MS44NjRaIiwiaXJ0IjpmYWxzZX0.QQvZyVN7uOvr50iGfadRj_092_PWfa0XSO8SaP0T_P4
5 | Content-Type: application/json
6 | Content-Length: 232
7 |
8 | {
9 | "built_at": "2000-01-01 12:21",
10 | "description": "The very first release.",
11 | "download_url": "http://download_url/",
12 | "is_range": false,
13 | "label": "v1.0.1",
14 | "major_version": "1",
15 | "platform": "vp",
16 | "support_url": "http://support_url/",
17 | "type": "release"
18 | }
--------------------------------------------------------------------------------
/doc/api/v1/builds/http/create-res-201.json:
--------------------------------------------------------------------------------
1 | 201 Created
2 | Content-Type: application/json; charset=utf-8
3 | Content-Length: 203
4 | Etag: W/"cb-o/+hU5jzgP8QH4klDRGCJjgUZ94"
5 |
6 | {
7 | "built_at": "2000-01-01T11:21:00.000Z",
8 | "download_url": "http://download_url/",
9 | "id": "v1.0.1",
10 | "is_range": false,
11 | "label": "v1.0.1",
12 | "major_version": "1",
13 | "platform": "vp",
14 | "type": "release"
15 | }
--------------------------------------------------------------------------------
/doc/api/v1/builds/http/create-res-422.json:
--------------------------------------------------------------------------------
1 | 422 Unprocessable Entity
2 | Content-Type: application/json; charset=utf-8
3 | Content-Length: 768
4 | Etag: W/"300-BbDcIULNYjWTmz2c4FhIrHQ4qFw"
5 |
6 | {
7 | "errors": [
8 | {
9 | "field": "built_at",
10 | "message": "Cast to Date failed for value \"no-date\" at path \"built_at\"",
11 | "value": "no-date"
12 | },
13 | {
14 | "field": "is_range",
15 | "message": "You need to provide if the build is a range of versions or one specific version.",
16 | "value": null
17 | },
18 | {
19 | "field": "label",
20 | "message": "Label must contain at least three characters.",
21 | "value": "1"
22 | },
23 | {
24 | "field": "major_version",
25 | "message": "Major version must be provided."
26 | },
27 | {
28 | "field": "platform",
29 | "message": "Invalid platform. Valid platforms are: [ \"vp\" ].",
30 | "value": "zurg"
31 | },
32 | {
33 | "field": "type",
34 | "message": "Invalid type. Valid types are: [ \"release\", \"nightly\", \"experimental\" ].",
35 | "value": "non-existent"
36 | }
37 | ]
38 | }
--------------------------------------------------------------------------------
/doc/api/v1/builds/http/del-res-401.json:
--------------------------------------------------------------------------------
1 | 401 Unauthorized
2 | Content-Type: application/json; charset=utf-8
3 | Content-Length: 79
4 | Etag: W/"4f-RYaRl1VAVKjFOUH9s+M9yXHBJJ0"
5 |
6 | {
7 | "error": "Unauthorized. You need to provide credentials for this resource"
8 | }
--------------------------------------------------------------------------------
/doc/api/v1/builds/http/del-res-403.json:
--------------------------------------------------------------------------------
1 | 403 Forbidden
2 | Content-Type: application/json; charset=utf-8
3 | Content-Length: 49
4 | Etag: W/"31-ywkfrDL4nRMJwVJc6QhLi7n0Ydg"
5 |
6 | {
7 | "error": "Permission denied, must be owner."
8 | }
--------------------------------------------------------------------------------
/doc/api/v1/builds/http/list-req.json:
--------------------------------------------------------------------------------
1 | GET /v1/builds HTTP/2.0
2 | Host: api.vpdb.io
3 | Accept-Encoding: gzip, deflate
4 |
5 |
--------------------------------------------------------------------------------
/doc/api/v1/builds/http/update-req.json:
--------------------------------------------------------------------------------
1 | PATCH /v1/builds/v1.0.0 HTTP/2.0
2 | Host: api.vpdb.io
3 | Accept-Encoding: gzip, deflate
4 | Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJwazR6MXl0bXY1OSIsImlhdCI6IjIwMTgtMDItMDVUMTQ6MjY6NDIuMDU2WiIsImV4cCI6IjIwMTgtMDItMDVUMTU6MjY6NDIuMDU2WiIsImlydCI6ZmFsc2V9.Jr807xcjDPP3HiHCjMJfYH39qu4UtE3oOG_SuHPjg1Y
5 | Content-Type: application/json
6 | Content-Length: 323
7 |
8 | {
9 | "built_at": "2017-01-01T11:00:00.000Z",
10 | "description": "The new future version of Visual Pinball!",
11 | "download_url": "https://visualpinball.com/updated-url",
12 | "is_active": true,
13 | "is_range": true,
14 | "label": "Updated build label",
15 | "major_version": "11",
16 | "platform": "vp",
17 | "support_url": "https://visualpinball.com/support-url",
18 | "type": "nightly"
19 | }
--------------------------------------------------------------------------------
/doc/api/v1/builds/http/update-res-200.json:
--------------------------------------------------------------------------------
1 | 200 OK
2 | Content-Type: application/json; charset=utf-8
3 | Content-Length: 371
4 | Etag: W/"173-cQoOjVce2mEkaDtLbwPDP6gXm4E"
5 |
6 | {
7 | "built_at": "2017-01-01T11:00:00.000Z",
8 | "description": "The new future version of Visual Pinball!",
9 | "download_url": "https://visualpinball.com/updated-url",
10 | "id": "v1.0.0",
11 | "is_active": true,
12 | "is_range": true,
13 | "label": "Updated build label",
14 | "major_version": "11",
15 | "platform": "vp",
16 | "support_url": "https://visualpinball.com/support-url",
17 | "type": "nightly"
18 | }
--------------------------------------------------------------------------------
/doc/api/v1/builds/http/update-res-422.json:
--------------------------------------------------------------------------------
1 | 422 Unprocessable Entity
2 | Content-Type: application/json; charset=utf-8
3 | Content-Length: 413
4 | Etag: W/"19d-vU/B6xwQ2P6DigUT3OHMzc3+XAQ"
5 |
6 | {
7 | "errors": [
8 | {
9 | "field": "built_at",
10 | "message": "Cast to Date failed for value \"never\" at path \"built_at\"",
11 | "value": "never"
12 | },
13 | {
14 | "field": "platform",
15 | "message": "Invalid platform. Valid platforms are: [ \"vp\" ].",
16 | "value": "true"
17 | },
18 | {
19 | "field": "type",
20 | "message": "Invalid type. Valid types are: [ \"release\", \"nightly\", \"experimental\" ].",
21 | "value": "true"
22 | }
23 | ]
24 | }
--------------------------------------------------------------------------------
/doc/api/v1/builds/http/view-req.json:
--------------------------------------------------------------------------------
1 | GET /v1/builds/v1.0.0 HTTP/2.0
2 | Host: api.vpdb.io
3 | Accept-Encoding: gzip, deflate
4 |
5 |
--------------------------------------------------------------------------------
/doc/api/v1/builds/http/view-res-200.json:
--------------------------------------------------------------------------------
1 | 200 OK
2 | Content-Type: application/json; charset=utf-8
3 | Content-Length: 142
4 | Etag: W/"8e-91dVMmDgRhNcFF0XHrUlyo3rWjQ"
5 |
6 | {
7 | "id": "v1.0.0",
8 | "is_active": false,
9 | "is_range": false,
10 | "label": "v1.0.0",
11 | "major_version": "1",
12 | "platform": "vp",
13 | "type": "release"
14 | }
--------------------------------------------------------------------------------
/doc/api/v1/events/events.raml:
--------------------------------------------------------------------------------
1 | displayName: Events
2 | description: |
3 | Events are read-only entries describing what's going on on the site. They are
4 | a good way to keep users updated about their favorite games or releases or
5 | just to give an overall impression of the site's activity.
6 |
7 | Every event is linked to the person who triggered it (the `actor`). The
8 | structure of the `payload`, i.e. the actual event data, depends on the event
9 | type (`event`).
10 |
11 | For resource-specific events, see:
12 |
13 | - [`/user/events`](api://core/get/user/events) - Events for currenty logged user
14 | - [`/games/{game_id}/events`](api://core/get/games/{game_id}/events) - Events for a given game
15 | - [`/releases/{release_id}/events`](api://core/get/releases/{release_id}/events) - Events for a given release
16 |
17 | get:
18 | securedBy: [ ]
19 | is: [ paginated: { defaultPerPage: 10, maxPerPage: 50 }, eventlog ]
20 | description: |
21 | List all events.
22 | body:
23 | role/anon:
24 | example: !include http/list-req.json
25 | responses:
26 | 200:
27 | body:
28 | role/anon:
29 | example: !include http/list-res-200.json
30 |
--------------------------------------------------------------------------------
/doc/api/v1/events/http/list-game-req.json:
--------------------------------------------------------------------------------
1 | GET /v1/games/hokum/events HTTP/2.0
2 | Host: api.vpdb.io
3 | Accept-Encoding: gzip, deflate
4 |
5 |
--------------------------------------------------------------------------------
/doc/api/v1/events/http/list-release-req.json:
--------------------------------------------------------------------------------
1 | GET /v1/releases/pkes9t8t59/events HTTP/2.0
2 | Host: api.vpdb.io
3 | Accept-Encoding: gzip, deflate
4 |
5 |
--------------------------------------------------------------------------------
/doc/api/v1/events/http/list-req.json:
--------------------------------------------------------------------------------
1 | GET /v1/events HTTP/2.0
2 | Host: api.vpdb.io
3 | Accept-Encoding: gzip, deflate
4 |
5 |
--------------------------------------------------------------------------------
/doc/api/v1/files/http/blockmatch-req.json:
--------------------------------------------------------------------------------
1 | GET /v1/files/pkxshzv8vrs/blockmatch HTTP/2.0
2 | Host: api.vpdb.io
3 | Accept-Encoding: gzip, deflate
4 | Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJwMm51a3p0bXZyOSIsImlhdCI6IjIwMTgtMDItMDVUMTQ6MjY6MjcuNTc4WiIsImV4cCI6IjIwMTgtMDItMDVUMTU6MjY6MjcuNTc4WiIsImlydCI6ZmFsc2V9._k4c5PiEU0-92VCI93xkidekbc5Tz6Sli1_LbaE9k80
5 |
6 |
--------------------------------------------------------------------------------
/doc/api/v1/files/http/view-req.json:
--------------------------------------------------------------------------------
1 | GET /v1/files/p22hr9v8trs HTTP/2.0
2 | Host: api.vpdb.io
3 | Accept-Encoding: gzip, deflate
4 | Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJla3h5NDl2bXQ1OSIsImlhdCI6IjIwMTgtMDItMDVUMTQ6MjY6NDcuMTgxWiIsImV4cCI6IjIwMTgtMDItMDVUMTU6MjY6NDcuMTgxWiIsImlydCI6ZmFsc2V9.mNgT4GxjD-XU3Jsz0MIOdDsvhmHRQCii-_JIkET1kwU
5 |
6 |
--------------------------------------------------------------------------------
/doc/api/v1/files/http/view-res-200.json:
--------------------------------------------------------------------------------
1 | 200 OK
2 | Content-Type: application/json; charset=utf-8
3 | Content-Length: 348
4 | Etag: W/"15c-du87LMIO8usVT8K0hCdtqEkv8MA"
5 |
6 | {
7 | "bytes": 43,
8 | "cost": 0,
9 | "counter": {
10 | "downloads": 0
11 | },
12 | "created_at": "2018-02-05T14:26:50.104Z",
13 | "file_type": "release",
14 | "id": "p22hr9v8trs",
15 | "is_active": false,
16 | "is_protected": true,
17 | "metadata": {
18 | },
19 | "mime_type": "text/plain",
20 | "name": "text.txt",
21 | "url": "http://localhost:7357/storage/v1/files/p22hr9v8trs.txt",
22 | "variations": {
23 | }
24 | }
--------------------------------------------------------------------------------
/doc/api/v1/game_requests/http/create-req.json:
--------------------------------------------------------------------------------
1 | POST /v1/game_requests?ipdb_dryrun=1 HTTP/2.0
2 | Host: api.vpdb.io
3 | Accept-Encoding: gzip, deflate
4 | Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJwMnhzZnN2OHQ1cyIsImlhdCI6IjIwMTgtMDItMDVUMTQ6MjY6NTEuMTUwWiIsImV4cCI6IjIwMTgtMDItMDVUMTU6MjY6NTEuMTUwWiIsImlydCI6ZmFsc2V9.yHI1i8UoxmnEHn5nVVIelGmL_f-S74qiT1Re9j0riaY
5 | Content-Type: application/json
6 | Content-Length: 94
7 |
8 | {
9 | "ipdb_number": 2768,
10 | "notes": "no monster bash? are you guys kidding???",
11 | "title": "monster bash"
12 | }
--------------------------------------------------------------------------------
/doc/api/v1/game_requests/http/create-res-201.json:
--------------------------------------------------------------------------------
1 | 201 Created
2 | Content-Type: application/json; charset=utf-8
3 | Content-Length: 220
4 | Etag: W/"dc-Bzr1XFOXwRPGRaWowEJXJicSn2A"
5 |
6 | {
7 | "created_at": "2018-02-05T14:26:52.375Z",
8 | "id": "ekfyv9vmtrs",
9 | "ipdb_number": 2768,
10 | "ipdb_title": "White Water",
11 | "is_closed": false,
12 | "notes": "no monster bash? are you guys kidding???",
13 | "title": "monster bash"
14 | }
--------------------------------------------------------------------------------
/doc/api/v1/game_requests/http/create-res-422.json:
--------------------------------------------------------------------------------
1 | 422 Unprocessable Entity
2 | Content-Type: application/json; charset=utf-8
3 | Content-Length: 173
4 | Etag: W/"ad-pxe1uSrmjjGJeJlukvtAnjs2HUM"
5 |
6 | {
7 | "errors": [
8 | {
9 | "field": "ipdb_number",
10 | "message": "IPDB entry 9981123 does not exist in local index. Try without the offline option.",
11 | "value": 9981123
12 | }
13 | ]
14 | }
--------------------------------------------------------------------------------
/doc/api/v1/game_requests/http/del-req.json:
--------------------------------------------------------------------------------
1 | DELETE /v1/game_requests/p25wg9vmv5s HTTP/2.0
2 | Host: api.vpdb.io
3 | Accept-Encoding: gzip, deflate
4 | Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJwMjg5Zzl0OHQ1OSIsImlhdCI6IjIwMTgtMDItMDVUMTQ6MjY6NTQuNDUyWiIsImV4cCI6IjIwMTgtMDItMDVUMTU6MjY6NTQuNDUyWiIsImlydCI6ZmFsc2V9.XdWRVsBQVnu13eEey-bBzkhidvMWc3GRJ_d79DmXd_Y
5 |
6 |
--------------------------------------------------------------------------------
/doc/api/v1/game_requests/http/del-res-204.json:
--------------------------------------------------------------------------------
1 | 204 No Content
2 |
3 |
--------------------------------------------------------------------------------
/doc/api/v1/game_requests/http/del-res-403.json:
--------------------------------------------------------------------------------
1 | 403 Forbidden
2 | Content-Type: application/json; charset=utf-8
3 | Content-Length: 49
4 | Etag: W/"31-ywkfrDL4nRMJwVJc6QhLi7n0Ydg"
5 |
6 | {
7 | "error": "Permission denied, must be owner."
8 | }
--------------------------------------------------------------------------------
/doc/api/v1/game_requests/http/update-req.json:
--------------------------------------------------------------------------------
1 | PATCH /v1/game_requests/ekfwv9tmvrs HTTP/2.0
2 | Host: api.vpdb.io
3 | Accept-Encoding: gzip, deflate
4 | Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJlMnR4dHN0bXZyOSIsImlhdCI6IjIwMTgtMDItMDVUMTQ6MjY6NTIuNTM3WiIsImV4cCI6IjIwMTgtMDItMDVUMTU6MjY6NTIuNTM3WiIsImlydCI6ZmFsc2V9.tYvD8dd0k2eymwh0XzT4GsxBn8_3coLyP-QVNZTj2CU
5 | Content-Type: application/json
6 | Content-Length: 125
7 |
8 | {
9 | "is_closed": true,
10 | "message": "Game is already added with IPDB number xxx. We do not keep multiple editions of the same game."
11 | }
--------------------------------------------------------------------------------
/doc/api/v1/game_requests/http/update-res-200.json:
--------------------------------------------------------------------------------
1 | 200 OK
2 | Content-Type: application/json; charset=utf-8
3 | Content-Length: 246
4 | Etag: W/"f6-R4M8LlxQR3lxhbhutGqOLQoOGnU"
5 |
6 | {
7 | "created_at": "2018-02-05T14:26:52.577Z",
8 | "id": "ekfwv9tmvrs",
9 | "ipdb_number": 2008,
10 | "ipdb_title": "Rolletto",
11 | "is_closed": true,
12 | "message": "Game is already added with IPDB number xxx. We do not keep multiple editions of the same game."
13 | }
--------------------------------------------------------------------------------
/doc/api/v1/games/backglasses.raml:
--------------------------------------------------------------------------------
1 | get:
2 | securedBy: [ ]
3 | description: List backglasses of a given game.
4 | body:
5 | role/anonymous:
6 | example: !include http/list-backglasses-req.json
7 | responses:
8 | 201:
9 | body:
10 | role/anonymous:
11 | example: !include http/list-backglasses-res-200.json
12 | post:
13 | is: [ validated ]
14 | securedBy: [ jwt: { scopes: [ MEMBER ] } ]
15 | description: |
16 | Create a new backglass.
17 |
18 | Note that even if you provide the `_game` attribute, it will be overridden
19 | by URL's game ID.
20 |
21 | Also note that if the game doesn't exist, a `404 Not Found` will be returned,
22 | independently if the `_game` attribute is correctly set or not.
23 |
24 | body:
25 | role/member:
26 | example: !include http/create-backglass-req.json
27 | responses:
28 | 201:
29 | body:
30 | role/member:
31 | example: !include http/create-backglass-res-201.json
--------------------------------------------------------------------------------
/doc/api/v1/games/http/create-backglass-req.json:
--------------------------------------------------------------------------------
1 | POST /v1/games/circus/backglasses HTTP/2.0
2 | Host: api.vpdb.io
3 | Accept-Encoding: gzip, deflate
4 | Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJlMnF0dGJ0bXRyOSIsImlhdCI6IjIwMTgtMDItMDVUMTQ6MjY6MjAuNjM4WiIsImV4cCI6IjIwMTgtMDItMDVUMTU6MjY6MjAuNjM4WiIsImlydCI6ZmFsc2V9.WVrbWNkfQnOg18OhTOnwvJpdOOkZq5z3U-pniZZ0WdU
5 | Content-Type: application/json
6 | Content-Length: 110
7 |
8 | {
9 | "authors": [
10 | {
11 | "_user": "e2qttbtmtr9",
12 | "roles": [
13 | "creator"
14 | ]
15 | }
16 | ],
17 | "versions": [
18 | {
19 | "_file": "e2rh6bt8t59",
20 | "version": "1.0"
21 | }
22 | ]
23 | }
--------------------------------------------------------------------------------
/doc/api/v1/games/http/create-rating-req.json:
--------------------------------------------------------------------------------
1 | POST /v1/games/arc-en-ciel/rating HTTP/2.0
2 | Host: api.vpdb.io
3 | Accept-Encoding: gzip, deflate
4 | Content-Type: application/json
5 | Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJwa2doN3d2bXRyOSIsImlhdCI6IjIwMTgtMDItMDVUMTQ6Mjc6MjcuNTg3WiIsImV4cCI6IjIwMTgtMDItMDVUMTU6Mjc6MjcuNTg3WiIsImlydCI6ZmFsc2V9.AaVt5pDJeqYjuNWKh_cW5YdkxiQ_IbwiMsl4-kaff34
6 | Content-Length: 11
7 |
8 | {
9 | "value": 7
10 | }
--------------------------------------------------------------------------------
/doc/api/v1/games/http/create-rating-res-201.json:
--------------------------------------------------------------------------------
1 | 201 Created
2 | Content-Type: application/json; charset=utf-8
3 | Content-Length: 119
4 | Etag: W/"77-YOvB2hOvHVzI9BI1k1PEzuhHWFQ"
5 |
6 | {
7 | "created_at": "2018-02-05T14:27:29.264Z",
8 | "game": {
9 | "average": 7,
10 | "score": 4.75,
11 | "votes": 1
12 | },
13 | "value": 7
14 | }
--------------------------------------------------------------------------------
/doc/api/v1/games/http/create-rating-res-400.json:
--------------------------------------------------------------------------------
1 | 400 Bad Request
2 | Content-Type: application/json; charset=utf-8
3 | Content-Length: 69
4 | Etag: W/"45-mB1yWuhCDyQgbZfBV4pcUhqexaM"
5 |
6 | {
7 | "error": "Cannot vote twice. Use PUT in order to update a vote."
8 | }
--------------------------------------------------------------------------------
/doc/api/v1/games/http/create-rating-res-422.json:
--------------------------------------------------------------------------------
1 | 422 Unprocessable Entity
2 | Content-Type: application/json; charset=utf-8
3 | Content-Length: 112
4 | Etag: W/"70-/x5+hnA9DC6WsCx2nTLhSV0MzZQ"
5 |
6 | {
7 | "errors": [
8 | {
9 | "field": "value",
10 | "message": "Value must be between 1 and 10.",
11 | "value": 11
12 | }
13 | ]
14 | }
--------------------------------------------------------------------------------
/doc/api/v1/games/http/create-req.json:
--------------------------------------------------------------------------------
1 | POST /v1/games HTTP/2.0
2 | Host: api.vpdb.io
3 | Accept-Encoding: gzip, deflate
4 | Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJla3hyZzl2OHQ1OSIsImlhdCI6IjIwMTgtMDItMDVUMTQ6MjY6NTQuNjgzWiIsImV4cCI6IjIwMTgtMDItMDVUMTU6MjY6NTQuNjgzWiIsImlydCI6ZmFsc2V9.VeNnlQPosqsAvyjaISPxDcqvex1OgsfjWghFL0MZi9g
5 | Content-Type: application/json
6 | Content-Length: 661
7 |
8 | {
9 | "_backglass": "p2v569vmtrs",
10 | "artists": [
11 | "Pam Erickson"
12 | ],
13 | "designers": [
14 | "Edward Tomaszewski"
15 | ],
16 | "features": "Flippers (4), Pop bumpers (3), 5-bank drop targets (1), Spinning target (1), Standup targets (10).",
17 | "game_type": "ss",
18 | "id": "laser-cue",
19 | "ipdb": {
20 | "mfg": 351,
21 | "mpu": 4,
22 | "number": 1414,
23 | "rating": "7.2"
24 | },
25 | "manufacturer": "Williams",
26 | "model_number": "520",
27 | "notes": "Originally named 'World Hockey'.Reportedly, a prototype version of this game had all playfield inserts marked as playing cards instead of billiard balls and the accompanying game manual referred to these cards.",
28 | "produced_units": 2800,
29 | "themes": [
30 | "Billiards",
31 | "Outer Space",
32 | "Fantasy"
33 | ],
34 | "title": "Laser Cue",
35 | "year": 1984
36 | }
--------------------------------------------------------------------------------
/doc/api/v1/games/http/create-rom-req.json:
--------------------------------------------------------------------------------
1 | POST /v1/games/hot-tip/roms HTTP/2.0
2 | Host: api.vpdb.io
3 | Accept-Encoding: gzip, deflate
4 | Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJwa2NlOTF2bXY1OSIsImlhdCI6IjIwMTgtMDItMDVUMTQ6Mjk6NTguNTk3WiIsImV4cCI6IjIwMTgtMDItMDVUMTU6Mjk6NTguNTk3WiIsImlydCI6ZmFsc2V9.Or0QV_RBmPbCnV6txOALHRJBO2FV7X2E-bU83JaD_QY
5 | Content-Type: application/json
6 | Content-Length: 107
7 |
8 | {
9 | "_file": "p2ozx1t8v59",
10 | "id": "hot-tip_10",
11 | "languages": [
12 | "en-US"
13 | ],
14 | "notes": "That is some ROM.",
15 | "version": "1.0"
16 | }
--------------------------------------------------------------------------------
/doc/api/v1/games/http/create-rom-res-201.json:
--------------------------------------------------------------------------------
1 | 201 Created
2 | Content-Type: application/json; charset=utf-8
3 | Content-Length: 758
4 | Etag: W/"2f6-R1Hi0Ya5K7xWttH4LdSipDc1Eao"
5 |
6 | {
7 | "file": {
8 | "bytes": 2096,
9 | "cost": 0,
10 | "counter": {
11 | "downloads": 0
12 | },
13 | "id": "p2ozx1t8v59",
14 | "is_protected": true,
15 | "mime_type": "application/zip",
16 | "name": "hulk.zip",
17 | "url": "http://localhost:7357/storage/v1/files/p2ozx1t8v59.zip",
18 | "variations": {
19 | }
20 | },
21 | "id": "hot-tip_10",
22 | "languages": [
23 | "en-US"
24 | ],
25 | "notes": "That is some ROM.",
26 | "rom_files": [
27 | {
28 | "bytes": 1024,
29 | "crc": 3227331410,
30 | "filename": "433.cpu",
31 | "modified_at": "1996-12-24T22:32:00.000Z"
32 | },
33 | {
34 | "bytes": 1024,
35 | "crc": 550313471,
36 | "filename": "433.snd",
37 | "modified_at": "1996-12-24T22:32:00.000Z"
38 | },
39 | {
40 | "bytes": 1024,
41 | "crc": 3078820641,
42 | "filename": "6530sys1.bin",
43 | "modified_at": "1996-12-24T22:32:00.000Z"
44 | }
45 | ],
46 | "version": "1.0"
47 | }
--------------------------------------------------------------------------------
/doc/api/v1/games/http/create-rom-res-422.json:
--------------------------------------------------------------------------------
1 | 422 Unprocessable Entity
2 | Content-Type: application/json; charset=utf-8
3 | Content-Length: 214
4 | Etag: W/"d6-uakgnzEDvfG35WaEuy+xWKj0/SM"
5 |
6 | {
7 | "errors": [
8 | {
9 | "field": "_file",
10 | "message": "File reference must be provided."
11 | },
12 | {
13 | "field": "id",
14 | "message": "ID must be provided. Use the name of the ROM file without file extension."
15 | }
16 | ]
17 | }
--------------------------------------------------------------------------------
/doc/api/v1/games/http/create-star-req.json:
--------------------------------------------------------------------------------
1 | POST /v1/games/barrel-o-fun-62/star HTTP/2.0
2 | Host: api.vpdb.io
3 | Accept-Encoding: gzip, deflate
4 | Content-Type: application/json
5 | Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJwa3V4aDJuOHZycyIsImlhdCI6IjIwMTgtMDItMDVUMTQ6MzA6MTIuNTY1WiIsImV4cCI6IjIwMTgtMDItMDVUMTU6MzA6MTIuNTY1WiIsImlydCI6ZmFsc2V9.esJS7zs-evHnJEuqv3_-mJILKNZuGrkSwz_4htSBITA
6 | Content-Length: 2
7 |
8 | {
9 | }
--------------------------------------------------------------------------------
/doc/api/v1/games/http/create-star-res-201.json:
--------------------------------------------------------------------------------
1 | 201 Created
2 | Content-Type: application/json; charset=utf-8
3 | Content-Length: 64
4 | Etag: W/"40-jDa1KlilhR+KvxqujKcjI4vv2tU"
5 |
6 | {
7 | "created_at": "2018-02-05T14:30:13.178Z",
8 | "total_stars": 1
9 | }
--------------------------------------------------------------------------------
/doc/api/v1/games/http/delete-req.json:
--------------------------------------------------------------------------------
1 | DELETE /v1/games/whirlpool HTTP/2.0
2 | Host: api.vpdb.io
3 | Accept-Encoding: gzip, deflate
4 | Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJlMmticDR2bXQ1cyIsImlhdCI6IjIwMTgtMDItMDVUMTQ6Mjc6MDQuOTk5WiIsImV4cCI6IjIwMTgtMDItMDVUMTU6Mjc6MDQuOTk5WiIsImlydCI6ZmFsc2V9.m80AoJ8uUuXJeh5sw2LjFhyU7d_9if7ld8JsKzUrQ_0
5 |
6 |
--------------------------------------------------------------------------------
/doc/api/v1/games/http/delete-res-204.json:
--------------------------------------------------------------------------------
1 | 204 No Content
2 |
3 |
--------------------------------------------------------------------------------
/doc/api/v1/games/http/delete-res-400.json:
--------------------------------------------------------------------------------
1 | 400 Bad Request
2 | Content-Type: application/json; charset=utf-8
3 | Content-Length: 92
4 | Etag: W/"5c-wFIwgvcQqZkpmAb46AfdH9mdJiE"
5 |
6 | {
7 | "error": "Cannot delete game because it is referenced by 0 releases and 1 backglasses."
8 | }
--------------------------------------------------------------------------------
/doc/api/v1/games/http/delete-star-req.json:
--------------------------------------------------------------------------------
1 | DELETE /v1/games/time/star HTTP/2.0
2 | Host: api.vpdb.io
3 | Accept-Encoding: gzip, deflate
4 | Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJwa3V4aDJuOHZycyIsImlhdCI6IjIwMTgtMDItMDVUMTQ6MzA6MTIuNTY1WiIsImV4cCI6IjIwMTgtMDItMDVUMTU6MzA6MTIuNTY1WiIsImlydCI6ZmFsc2V9.esJS7zs-evHnJEuqv3_-mJILKNZuGrkSwz_4htSBITA
5 |
6 |
--------------------------------------------------------------------------------
/doc/api/v1/games/http/delete-star-res-204.json:
--------------------------------------------------------------------------------
1 | 204 No Content
2 |
3 |
--------------------------------------------------------------------------------
/doc/api/v1/games/http/list-backglasses-req.json:
--------------------------------------------------------------------------------
1 | GET /v1/games/pinball-action/backglasses HTTP/2.0
2 | Host: api.vpdb.io
3 | Accept-Encoding: gzip, deflate
4 |
5 |
--------------------------------------------------------------------------------
/doc/api/v1/games/http/list-media-req.json:
--------------------------------------------------------------------------------
1 | GET /v1/games/official-baseball/media HTTP/2.0
2 | Host: api.vpdb.io
3 | Accept-Encoding: gzip, deflate
4 |
5 |
--------------------------------------------------------------------------------
/doc/api/v1/games/http/list-req.json:
--------------------------------------------------------------------------------
1 | GET /v1/games HTTP/2.0
2 | Host: api.vpdb.io
3 | Accept-Encoding: gzip, deflate
4 |
5 |
--------------------------------------------------------------------------------
/doc/api/v1/games/http/release-name-req.json:
--------------------------------------------------------------------------------
1 | GET /v1/games/alarm/release-name HTTP/2.0
2 | Host: api.vpdb.io
3 | Accept-Encoding: gzip, deflate
4 | Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJla29zNTR2bXRycyIsImlhdCI6IjIwMTgtMDItMDVUMTQ6Mjc6MDYuNDU2WiIsImV4cCI6IjIwMTgtMDItMDVUMTU6Mjc6MDYuNDU2WiIsImlydCI6ZmFsc2V9.xLd_xal2NfcxJHrGtcPOBIXPdKsw-hcMLJLEdTbZ0bM
5 |
6 |
--------------------------------------------------------------------------------
/doc/api/v1/games/http/release-name-res-200.json:
--------------------------------------------------------------------------------
1 | 200 OK
2 | Content-Type: application/json; charset=utf-8
3 | Content-Length: 36
4 | Etag: W/"24-IQ+W7j//1gs7xJn7+QXNYMzL5rE"
5 |
6 | {
7 | "name": "Novel History Edition"
8 | }
--------------------------------------------------------------------------------
/doc/api/v1/games/http/search-res-400.json:
--------------------------------------------------------------------------------
1 | 400 Bad Request
2 | Content-Type: application/json; charset=utf-8
3 | Content-Length: 59
4 | Etag: W/"3b-80RJwGBLczpIBqKPsb8krFSSQFo"
5 |
6 | {
7 | "error": "Query must contain at least two characters."
8 | }
--------------------------------------------------------------------------------
/doc/api/v1/games/http/update-rating-req.json:
--------------------------------------------------------------------------------
1 | PUT /v1/games/kings-of-the-road/rating HTTP/2.0
2 | Host: api.vpdb.io
3 | Accept-Encoding: gzip, deflate
4 | Content-Type: application/json
5 | Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJlMmhzMmV0bXY1cyIsImlhdCI6IjIwMTgtMDItMDVUMTQ6Mjc6MzEuNDQ0WiIsImV4cCI6IjIwMTgtMDItMDVUMTU6Mjc6MzEuNDQ0WiIsImlydCI6ZmFsc2V9.ZcxqdUvE06FTbKdXqo95OmFe-YkbfwBLP9zv0-vdKMw
6 | Content-Length: 11
7 |
8 | {
9 | "value": 8
10 | }
--------------------------------------------------------------------------------
/doc/api/v1/games/http/update-rating-res-200.json:
--------------------------------------------------------------------------------
1 | 200 OK
2 | Content-Type: application/json; charset=utf-8
3 | Content-Length: 164
4 | Etag: W/"a4-hoMeR4CUuMt5eIOZjBqi6h6pYos"
5 |
6 | {
7 | "created_at": "2018-02-05T14:27:32.793Z",
8 | "game": {
9 | "average": 8,
10 | "score": 8.375,
11 | "votes": 1
12 | },
13 | "modified_at": "2018-02-05T14:27:32.948Z",
14 | "value": 8
15 | }
--------------------------------------------------------------------------------
/doc/api/v1/games/http/update-req.json:
--------------------------------------------------------------------------------
1 | PATCH /v1/games/numbers HTTP/2.0
2 | Host: api.vpdb.io
3 | Accept-Encoding: gzip, deflate
4 | Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJla3p4ZHN0bXQ1OSIsImlhdCI6IjIwMTgtMDItMDVUMTQ6MjY6NTcuNDQzWiIsImV4cCI6IjIwMTgtMDItMDVUMTU6MjY6NTcuNDQzWiIsImlydCI6ZmFsc2V9.rNvPgWDYLkWEAHR497efr-oxQZAjPvNjnpaZzwn3Lfw
5 | Content-Type: application/json
6 | Content-Length: 36
7 |
8 | {
9 | "title": "Hi, I am your new title."
10 | }
--------------------------------------------------------------------------------
/doc/api/v1/games/http/update-res-422.json:
--------------------------------------------------------------------------------
1 | 422 Unprocessable Entity
2 | X-App-Sha: f680068
3 | Content-Type: application/json; charset=utf-8
4 | Content-Length: 103
5 | Etag: W/"67-h4KVcEEe61RfkE8q8HhVGg"
6 |
7 | {
8 | "errors": [
9 | {
10 | "message": "Backglass image must be provided.",
11 | "field": "_backglass"
12 | }
13 | ]
14 | }
--------------------------------------------------------------------------------
/doc/api/v1/games/http/view-rating-req.json:
--------------------------------------------------------------------------------
1 | GET /v1/games/metallica-premium-monsters/rating HTTP/2.0
2 | Host: api.vpdb.io
3 | Accept-Encoding: gzip, deflate
4 | Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJwa3lzMXF2OHY1cyIsImlhdCI6IjIwMTgtMDItMDVUMTQ6Mjc6MzAuMjc5WiIsImV4cCI6IjIwMTgtMDItMDVUMTU6Mjc6MzAuMjc5WiIsImlydCI6ZmFsc2V9.-_DSjxtFdm6IQ9cIXb-nJgceXM3qIGMi0tfA-_toHeY
5 |
6 |
--------------------------------------------------------------------------------
/doc/api/v1/games/http/view-rating-res-200.json:
--------------------------------------------------------------------------------
1 | 200 OK
2 | Content-Type: application/json; charset=utf-8
3 | Content-Length: 58
4 | Etag: W/"3a-ZM3RTBLv1r4MAKRPvuuYE9CHI0A"
5 |
6 | {
7 | "created_at": "2018-02-05T14:27:31.141Z",
8 | "value": 8
9 | }
--------------------------------------------------------------------------------
/doc/api/v1/games/http/view-rating-res-404.json:
--------------------------------------------------------------------------------
1 | 404 Not Found
2 | Content-Type: application/json; charset=utf-8
3 | Content-Length: 74
4 | Etag: W/"4a-Tyy7OQpfqOieP3BahFubyPxjETY"
5 |
6 | {
7 | "error": "No rating of for \"Fast Ball\" found."
8 | }
--------------------------------------------------------------------------------
/doc/api/v1/games/http/view-star-req.json:
--------------------------------------------------------------------------------
1 | GET /v1/games/occ/star HTTP/2.0
2 | Host: api.vpdb.io
3 | Accept-Encoding: gzip, deflate
4 | Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJwa3V4aDJuOHZycyIsImlhdCI6IjIwMTgtMDItMDVUMTQ6MzA6MTIuNTY1WiIsImV4cCI6IjIwMTgtMDItMDVUMTU6MzA6MTIuNTY1WiIsImlydCI6ZmFsc2V9.esJS7zs-evHnJEuqv3_-mJILKNZuGrkSwz_4htSBITA
5 |
6 |
--------------------------------------------------------------------------------
/doc/api/v1/games/http/view-star-res-200.json:
--------------------------------------------------------------------------------
1 | 200 OK
2 | Content-Type: application/json; charset=utf-8
3 | Content-Length: 45
4 | Etag: W/"2d-VNyN8O018wsG1mnZRM2p2h4q/ME"
5 |
6 | {
7 | "created_at": "2018-02-05T14:30:13.706Z"
8 | }
--------------------------------------------------------------------------------
/doc/api/v1/games/http/view-star-res-404.json:
--------------------------------------------------------------------------------
1 | 404 Not Found
2 | Content-Type: application/json; charset=utf-8
3 | Content-Length: 89
4 | Etag: W/"59-OHCFQp2sGlXQa2/1rRxuL8wJlz4"
5 |
6 | {
7 | "error": "No star for for \"Orange County Choppers\" found."
8 | }
--------------------------------------------------------------------------------
/doc/api/v1/games/media.raml:
--------------------------------------------------------------------------------
1 | get:
2 | securedBy: [ ]
3 | description: List all media of a given game.
4 | body:
5 | role/anonymous:
6 | example: !include http/list-media-req.json
7 | responses:
8 | 201:
9 | body:
10 | role/anonymous:
11 | example: !include http/list-media-res-200.json
--------------------------------------------------------------------------------
/doc/api/v1/games/release-name.raml:
--------------------------------------------------------------------------------
1 | displayName: Release Name
2 | get:
3 | securedBy: [ jwt: { scopes: [ MEMBER ] } ]
4 | description: |
5 | Get a random release name for inspiration.
6 | body:
7 | role/member:
8 | example: !include http/release-name-req.json
9 | responses:
10 | 200:
11 | body:
12 | role/member:
13 | example: !include http/release-name-res-200.json
--------------------------------------------------------------------------------
/doc/api/v1/games/roms.raml:
--------------------------------------------------------------------------------
1 | get:
2 | securedBy: [ ]
3 | is: [ paginated: { defaultPerPage: 10, maxPerPage: 50 } ]
4 | description: |
5 | List all ROMs for a given game.
6 | post:
7 | securedBy: [ jwt: { scopes: [ MEMBER ] } ]
8 | is: [ validated ]
9 | description: |
10 | Post a new ROM for the game.
11 |
12 | A ROM is some meta data as well as a link to one file. If a game needs
13 | multiple files to run, post multiple ROM objects.
14 | body:
15 | role/member:
16 | example: !include http/create-rom-req.json
17 | responses:
18 | 200:
19 | body:
20 | role/member:
21 | example: !include http/create-rom-res-201.json
22 | 422:
23 | description: Validation errors
24 | body:
25 | role/member:
26 | example: !include http/create-rom-res-422.json
--------------------------------------------------------------------------------
/doc/api/v1/games/star.raml:
--------------------------------------------------------------------------------
1 | post:
2 | securedBy: [ jwt: { scopes: [ MEMBER ] } ]
3 | description: |
4 | Star a game.
5 |
6 | Note that this can only be done once per game. You can unstar a game
7 | using `DELETE` on the same URL.
8 | body:
9 | role/member:
10 | example: !include http/create-star-req.json
11 | responses:
12 | 201:
13 | body:
14 | role/member:
15 | example: !include http/create-star-res-201.json
16 | get:
17 | securedBy: [ jwt: { scopes: [ MEMBER ] } ]
18 | description: |
19 | Retrieve own star status of a game.
20 |
21 | Returns either the star date of the authenticated user of the given game, or
22 | `404` if the user hasn't starred that game.
23 | body:
24 | role/member:
25 | example: !include http/view-star-req.json
26 | responses:
27 | 200:
28 | body:
29 | role/member:
30 | example: !include http/view-star-res-200.json
31 | 404:
32 | body:
33 | role/member:
34 | example: !include http/view-star-res-404.json
35 | delete:
36 | securedBy: [ jwt: { scopes: [ MEMBER ] } ]
37 | description: |
38 | Unstar a game.
39 | body:
40 | role/member:
41 | example: !include http/delete-star-req.json
42 | responses:
43 | 204:
44 | body:
45 | role/member:
46 | example: !include http/delete-star-res-204.json
--------------------------------------------------------------------------------
/doc/api/v1/media/http/create-req.json:
--------------------------------------------------------------------------------
1 | POST /v1/media HTTP/2.0
2 | Host: api.vpdb.io
3 | Accept-Encoding: gzip, deflate
4 | Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJwa3U2eHZtdHJzIiwiaWF0IjoiMjAxOC0wMi0wNVQxNDoyNzoxMC4yMDFaIiwiZXhwIjoiMjAxOC0wMi0wNVQxNToyNzoxMC4yMDFaIiwiaXJ0IjpmYWxzZX0.SBEA1zUjMJIK5oF74y6Kz7i3xFZsVyKjc-Zj5iqXIDQ
5 | Content-Type: application/json
6 | Content-Length: 261
7 |
8 | {
9 | "_file": "e25mxt8t5s",
10 | "_ref": {
11 | "game": "cross-fire"
12 | },
13 | "acknowledgements": "- Thanks to @mom for all her patience",
14 | "category": "backglass_image",
15 | "description": "This is a very super high resolution backglass that I have stitched together from four different sources."
16 | }
--------------------------------------------------------------------------------
/doc/api/v1/media/http/create-res-422.json:
--------------------------------------------------------------------------------
1 | 422 Unprocessable Entity
2 | Content-Type: application/json; charset=utf-8
3 | Content-Length: 387
4 | Etag: W/"183-VE2WSYb6SbOJ9qpy6XsHg8xUwBg"
5 |
6 | {
7 | "errors": [
8 | {
9 | "field": "_file",
10 | "message": "You must provide a file reference."
11 | },
12 | {
13 | "field": "_ref",
14 | "message": "Reference to game missing."
15 | },
16 | {
17 | "field": "category",
18 | "message": "Must provide sub-category for \"flyer_image\". Possible values: [ \"back\", \"front\", \"inside1\", \"inside2\", \"inside3\", \"inside4\", \"inside5\", \"inside6\" ]."
19 | }
20 | ]
21 | }
--------------------------------------------------------------------------------
/doc/api/v1/media/http/del-req.json:
--------------------------------------------------------------------------------
1 | DELETE /v1/media/e2uxhqt8t5s HTTP/2.0
2 | Host: api.vpdb.io
3 | Accept-Encoding: gzip, deflate
4 | Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJwMmJiMnF0bXZycyIsImlhdCI6IjIwMTgtMDItMDVUMTQ6Mjc6MTQuODc1WiIsImV4cCI6IjIwMTgtMDItMDVUMTU6Mjc6MTQuODc1WiIsImlydCI6ZmFsc2V9.RiXTOfKxkk2cqBsPQtS8J3m48AiYa0Yi7JtKn7VIc4U
5 |
6 |
--------------------------------------------------------------------------------
/doc/api/v1/media/http/del-res-204.json:
--------------------------------------------------------------------------------
1 | 204 No Content
2 |
3 |
--------------------------------------------------------------------------------
/doc/api/v1/media/http/del-res-403.json:
--------------------------------------------------------------------------------
1 | 403 Forbidden
2 | Content-Type: application/json; charset=utf-8
3 | Content-Length: 49
4 | Etag: W/"31-ywkfrDL4nRMJwVJc6QhLi7n0Ydg"
5 |
6 | {
7 | "error": "Permission denied, must be owner."
8 | }
--------------------------------------------------------------------------------
/doc/api/v1/plans/http/list-req.json:
--------------------------------------------------------------------------------
1 | GET /v1/plans HTTP/2.0
2 | Host: api.vpdb.io
3 | Accept-Encoding: gzip, deflate
4 |
5 |
--------------------------------------------------------------------------------
/doc/api/v1/plans/http/list-res-200.json:
--------------------------------------------------------------------------------
1 | 200 OK
2 | Content-Type: application/json; charset=utf-8
3 | Content-Length: 608
4 | Etag: W/"260-3siwJ7WN2Game/hnD+Gzx+26FP4"
5 |
6 | [
7 | {
8 | "credits": 3,
9 | "enableAppTokens": false,
10 | "enableRealtime": false,
11 | "id": "free",
12 | "is_default": true,
13 | "name": "free",
14 | "per": "day"
15 | },
16 | {
17 | "credits": 50,
18 | "enableAppTokens": true,
19 | "enableRealtime": false,
20 | "id": "subscribed",
21 | "is_default": false,
22 | "name": "subscribed",
23 | "per": "day"
24 | },
25 | {
26 | "credits": 200,
27 | "enableAppTokens": true,
28 | "enableRealtime": true,
29 | "id": "vip",
30 | "is_default": false,
31 | "name": "vip",
32 | "per": "day"
33 | },
34 | {
35 | "enableAppTokens": true,
36 | "enableRealtime": true,
37 | "id": "unlimited",
38 | "is_default": false,
39 | "name": "unlimited",
40 | "unlimited": true
41 | }
42 | ]
--------------------------------------------------------------------------------
/doc/api/v1/plans/plans.raml:
--------------------------------------------------------------------------------
1 | displayName: Plans
2 | description: |
3 | Plans define user quotas and potential premium features.
4 |
5 | get:
6 | securedBy: [ ]
7 | description: |
8 | List all available plans.
9 | body:
10 | role/anon:
11 | example: !include http/list-req.json
12 | responses:
13 | 200:
14 | body:
15 | role/anon:
16 | example: !include http/list-res-200.json
17 |
--------------------------------------------------------------------------------
/doc/api/v1/releases/comments.raml:
--------------------------------------------------------------------------------
1 | post:
2 | is: [ validated ]
3 | securedBy: [ jwt: { scopes: [ MEMBER ] } ]
4 | description: |
5 | Add a commentary to a release.
6 | body:
7 | role/member:
8 | schema: comment
9 | example: !include http/create-comment-req.json
10 | responses:
11 | 201:
12 | body:
13 | role/member:
14 | schema: comment
15 | example: !include http/create-comment-res-201.json
16 | get:
17 | description: List all comments of a release.
--------------------------------------------------------------------------------
/doc/api/v1/releases/http/create-comment-req.json:
--------------------------------------------------------------------------------
1 | POST /v1/releases/pkqs2st8tr9/comments HTTP/2.0
2 | Host: api.vpdb.io
3 | Accept-Encoding: gzip, deflate
4 | Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJlazhwMXl0bXRyOSIsImlhdCI6IjIwMTgtMDItMDVUMTQ6MjY6NDIuNjAyWiIsImV4cCI6IjIwMTgtMDItMDVUMTU6MjY6NDIuNjAyWiIsImlydCI6ZmFsc2V9.LVrAfG4m4BR7B5iSLEAelzx-z_Ns16vLNkUJbnkUS00
5 | Content-Type: application/json
6 | Content-Length: 59
7 |
8 | {
9 | "message": "Multi-channelled next generation service-desk"
10 | }
--------------------------------------------------------------------------------
/doc/api/v1/releases/http/create-comment-res-201.json:
--------------------------------------------------------------------------------
1 | 201 Created
2 | Content-Type: application/json; charset=utf-8
3 | Content-Length: 266
4 | Etag: W/"10a-H453cC5JGdrZvI99MLkd3kSOOu8"
5 |
6 | {
7 | "created_at": "2018-02-05T14:26:44.344Z",
8 | "from": {
9 | "gravatar_id": "f56a9917b81e8b4ffffa339a8b4ebe20",
10 | "id": "ek8p1ytmtr9",
11 | "name": "Dennis66",
12 | "username": "Dennis66"
13 | },
14 | "id": "ek6hhstmv59",
15 | "message": "Multi-channelled next generation service-desk"
16 | }
--------------------------------------------------------------------------------
/doc/api/v1/releases/http/create-rating-req.json:
--------------------------------------------------------------------------------
1 | POST /v1/releases/e2khset8tr9/rating HTTP/2.0
2 | Host: api.vpdb.io
3 | Accept-Encoding: gzip, deflate
4 | Content-Type: application/json
5 | Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJlMnh6eXB0bXRycyIsImlhdCI6IjIwMTgtMDItMDVUMTQ6Mjc6MzMuMDc4WiIsImV4cCI6IjIwMTgtMDItMDVUMTU6Mjc6MzMuMDc4WiIsImlydCI6ZmFsc2V9.-n6geVyNlNIA-h5baOHVYSjbBF56bTMdAZBUZL6u60k
6 | Content-Length: 11
7 |
8 | {
9 | "value": 5
10 | }
--------------------------------------------------------------------------------
/doc/api/v1/releases/http/create-rating-res-201.json:
--------------------------------------------------------------------------------
1 | 201 Created
2 | Content-Type: application/json; charset=utf-8
3 | Content-Length: 119
4 | Etag: W/"77-TmGvU7g96HXRwE+xiVy9DQyfsvw"
5 |
6 | {
7 | "created_at": "2018-02-05T14:27:34.225Z",
8 | "release": {
9 | "average": 5,
10 | "score": 5,
11 | "votes": 1
12 | },
13 | "value": 5
14 | }
--------------------------------------------------------------------------------
/doc/api/v1/releases/http/create-res-422.json:
--------------------------------------------------------------------------------
1 | 422 Unprocessable Entity
2 | Content-Type: application/json; charset=utf-8
3 | Content-Length: 216
4 |
5 | {
6 | "errors": [
7 | {
8 | "message": "No such \"tag\" with ID \"hd\".",
9 | "field": "_tags.0",
10 | "value": "hd"
11 | },
12 | {
13 | "message": "No such \"tag\" with ID \"dof\".",
14 | "field": "_tags.1",
15 | "value": "dof"
16 | }
17 | ]
18 | }
--------------------------------------------------------------------------------
/doc/api/v1/releases/http/create-star-req.json:
--------------------------------------------------------------------------------
1 | POST /v1/releases/pkegotmtrs/star HTTP/2.0
2 | Host: api.vpdb.io
3 | Accept-Encoding: gzip, deflate
4 | Content-Type: application/json
5 | Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJlMmVuMXY4dnJzIiwiaWF0IjoiMjAxOC0wMi0wNVQxNDozMDowNC44MzVaIiwiZXhwIjoiMjAxOC0wMi0wNVQxNTozMDowNC44MzVaIiwiaXJ0IjpmYWxzZX0.1Pw2qyOm2AfLNu6xb4R6a-MNJpz9YtoQrNREk7X0SzY
6 | Content-Length: 2
7 |
8 | {
9 | }
--------------------------------------------------------------------------------
/doc/api/v1/releases/http/create-star-res-201.json:
--------------------------------------------------------------------------------
1 | 201 Created
2 | Content-Type: application/json; charset=utf-8
3 | Content-Length: 64
4 | Etag: W/"40-bqix4l7xXOSxOBf+Uwf3Iw8rtts"
5 |
6 | {
7 | "created_at": "2018-02-05T14:30:05.894Z",
8 | "total_stars": 1
9 | }
--------------------------------------------------------------------------------
/doc/api/v1/releases/http/create-star-res-400.json:
--------------------------------------------------------------------------------
1 | 400 Bad Request
2 | Content-Type: application/json; charset=utf-8
3 | Content-Length: 77
4 | Etag: W/"4d-zHGlxdtHf0uIXzS0yG2Y6oxJp/Q"
5 |
6 | {
7 | "error": "Already starred. Cannot star twice, you need to unstar first."
8 | }
--------------------------------------------------------------------------------
/doc/api/v1/releases/http/create-version-req.json:
--------------------------------------------------------------------------------
1 | POST /v1/releases/p28u838v59/versions HTTP/2.0
2 | Host: api.vpdb.io
3 | Accept-Encoding: gzip, deflate
4 | Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJla2tzazgzbXY1OSIsImlhdCI6IjIwMTgtMDItMDVUMTQ6NTA6NDMuMTI4WiIsImV4cCI6IjIwMTgtMDItMDVUMTU6NTA6NDMuMTI4WiIsImlydCI6ZmFsc2V9.d2uKSM8OJ4ppLbrf7ODn7hDCvPbZUvP0E23-L6vTJo0
5 | Content-Type: application/json
6 | Content-Length: 191
7 |
8 | {
9 | "changes": "*Second release.*",
10 | "files": [
11 | {
12 | "_compatibility": [
13 | "9.9.0"
14 | ],
15 | "_file": "e24zf83mtr9",
16 | "_playfield_image": "ekht83mvrs",
17 | "flavor": {
18 | "lighting": "night",
19 | "orientation": "fs"
20 | }
21 | }
22 | ],
23 | "version": "2.0.0"
24 | }
--------------------------------------------------------------------------------
/doc/api/v1/releases/http/create-version-res-403.json:
--------------------------------------------------------------------------------
1 | 403 Forbidden
2 | Content-Type: application/json; charset=utf-8
3 | Content-Length: 79
4 | Etag: W/"4f-Z/zswPeqTRIsnZld8Abv2Yh9iKw"
5 |
6 | {
7 | "error": "Only moderators or authors of the release can add new versions."
8 | }
--------------------------------------------------------------------------------
/doc/api/v1/releases/http/create-version-res-422.json:
--------------------------------------------------------------------------------
1 | 422 Unprocessable Entity
2 | Content-Type: application/json; charset=utf-8
3 | Content-Length: 209
4 | Etag: W/"d1-arsHyVwI+5x2hUl1e+k9xXTSjFI"
5 |
6 | {
7 | "errors": [
8 | {
9 | "field": "version",
10 | "message": "Provided version already exists and you cannot add a version twice. Try updating the version instead of adding a new one.",
11 | "value": "1.0.0"
12 | }
13 | ]
14 | }
--------------------------------------------------------------------------------
/doc/api/v1/releases/http/del-res-401.json:
--------------------------------------------------------------------------------
1 | 401 Unauthorized
2 | Content-Type: application/json; charset=utf-8
3 | Content-Length: 79
4 | Etag: W/"4f-RYaRl1VAVKjFOUH9s+M9yXHBJJ0"
5 |
6 | {
7 | "error": "Unauthorized. You need to provide credentials for this resource"
8 | }
--------------------------------------------------------------------------------
/doc/api/v1/releases/http/delete-star-req.json:
--------------------------------------------------------------------------------
1 | DELETE /v1/releases/pkhy2knmtrs/star HTTP/2.0
2 | Host: api.vpdb.io
3 | Accept-Encoding: gzip, deflate
4 | Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJlMmVuMXY4dnJzIiwiaWF0IjoiMjAxOC0wMi0wNVQxNDozMDowNC44MzVaIiwiZXhwIjoiMjAxOC0wMi0wNVQxNTozMDowNC44MzVaIiwiaXJ0IjpmYWxzZX0.1Pw2qyOm2AfLNu6xb4R6a-MNJpz9YtoQrNREk7X0SzY
5 |
6 |
--------------------------------------------------------------------------------
/doc/api/v1/releases/http/delete-star-res-204.json:
--------------------------------------------------------------------------------
1 | 204 No Content
2 |
3 |
--------------------------------------------------------------------------------
/doc/api/v1/releases/http/list-req.json:
--------------------------------------------------------------------------------
1 | GET /v1/releases?thumb_format=square HTTP/2.0
2 | Host: api.vpdb.io
3 | Accept-Encoding: gzip, deflate
4 |
5 |
--------------------------------------------------------------------------------
/doc/api/v1/releases/http/list-res-401.json:
--------------------------------------------------------------------------------
1 | 401 Unauthorized
2 | Content-Type: application/json; charset=utf-8
3 | Content-Length: 61
4 | Etag: W/"3d-tPpVBoptEgINJeeDfBzcLK/S2B0"
5 |
6 | {
7 | "error": "Must be logged when listing starred releases."
8 | }
--------------------------------------------------------------------------------
/doc/api/v1/releases/http/update-rating-req.json:
--------------------------------------------------------------------------------
1 | PUT /v1/releases/e243ptmvrs/rating HTTP/2.0
2 | Host: api.vpdb.io
3 | Accept-Encoding: gzip, deflate
4 | Content-Type: application/json
5 | Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJlMjl6OGV2bXZycyIsImlhdCI6IjIwMTgtMDItMDVUMTQ6Mjc6NDQuMTI1WiIsImV4cCI6IjIwMTgtMDItMDVUMTU6Mjc6NDQuMTI1WiIsImlydCI6ZmFsc2V9.wEnoyM5nhQX-2LfHXvFM4meM15SEW1wUhp9Shd3qBcM
6 | Content-Length: 11
7 |
8 | {
9 | "value": 1
10 | }
--------------------------------------------------------------------------------
/doc/api/v1/releases/http/update-rating-res-200.json:
--------------------------------------------------------------------------------
1 | 200 OK
2 | Content-Type: application/json; charset=utf-8
3 | Content-Length: 166
4 | Etag: W/"a6-f73hxmVVZEvVM5fkLkSkt76eSUk"
5 |
6 | {
7 | "created_at": "2018-02-05T14:27:45.413Z",
8 | "modified_at": "2018-02-05T14:27:45.555Z",
9 | "release": {
10 | "average": 1,
11 | "score": 2.25,
12 | "votes": 1
13 | },
14 | "value": 1
15 | }
--------------------------------------------------------------------------------
/doc/api/v1/releases/http/update-req.json:
--------------------------------------------------------------------------------
1 | PATCH /v1/releases/pk3bm6d8t5s HTTP/2.0
2 | Host: api.vpdb.io
3 | Accept-Encoding: gzip, deflate
4 | Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJwazdicWczOHQ1OSIsImlhdCI6IjIwMTgtMDItMDVUMTQ6NTA6MTUuOTQ0WiIsImV4cCI6IjIwMTgtMDItMDVUMTU6NTA6MTUuOTQ0WiIsImlydCI6ZmFsc2V9.eWvwCOKZue17_rTu1GKyExG3jyaHAn-WfWXoNAKFBOs
5 | Content-Type: application/json
6 | Content-Length: 317
7 |
8 | {
9 | "_tags": [
10 | "hd",
11 | "dof"
12 | ],
13 | "acknowledgements": "Updated acknowledgements",
14 | "authors": [
15 | {
16 | "_user": "p22zw638trs",
17 | "roles": [
18 | "Some other job"
19 | ]
20 | }
21 | ],
22 | "description": "Updated description",
23 | "links": [
24 | {
25 | "label": "first link",
26 | "url": "https://vpdb.io/somelink"
27 | },
28 | {
29 | "label": "second link",
30 | "url": "https://vpdb.io/someotherlink"
31 | }
32 | ],
33 | "name": "Updated name"
34 | }
--------------------------------------------------------------------------------
/doc/api/v1/releases/http/update-version-req.json:
--------------------------------------------------------------------------------
1 | PATCH /v1/releases/p2xf3dmt5s/versions/1.0.0 HTTP/2.0
2 | Host: api.vpdb.io
3 | Accept-Encoding: gzip, deflate
4 | Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJwMjhoejNkbXRyOSIsImlhdCI6IjIwMTgtMDItMDVUMTQ6NTE6MDAuOTM1WiIsImV4cCI6IjIwMTgtMDItMDVUMTU6NTE6MDAuOTM1WiIsImlydCI6ZmFsc2V9.kYWUlN5De9o_C-PGPMxeNmi1T5Gnl3K_sn825SbnXdk
5 | Content-Type: application/json
6 | Content-Length: 167
7 |
8 | {
9 | "changes": "New changes.",
10 | "files": [
11 | {
12 | "_compatibility": [
13 | "9.9.0"
14 | ],
15 | "_file": "e2rhuddmt5s",
16 | "_playfield_image": "e27budd8v5s",
17 | "flavor": {
18 | "lighting": "day",
19 | "orientation": "fs"
20 | }
21 | }
22 | ]
23 | }
--------------------------------------------------------------------------------
/doc/api/v1/releases/http/update-version-res-403.json:
--------------------------------------------------------------------------------
1 | 403 Forbidden
2 | Content-Type: application/json; charset=utf-8
3 | Content-Length: 80
4 | Etag: W/"50-JczMxayu/JK1owBPgh99/PD+L2g"
5 |
6 | {
7 | "error": "Only moderators and authors of the release can update a version."
8 | }
--------------------------------------------------------------------------------
/doc/api/v1/releases/http/update-version-res-422.json:
--------------------------------------------------------------------------------
1 | 422 Unprocessable Entity
2 | Content-Type: application/json; charset=utf-8
3 | Content-Length: 294
4 | Etag: W/"126-qMp9+kyxiGMMy3itRF1F39b6+tw"
5 |
6 | {
7 | "errors": [
8 | {
9 | "field": "files.0._compatibility",
10 | "message": "A combination of compatibility and flavor already exists with the same values."
11 | },
12 | {
13 | "field": "files.0.flavor",
14 | "message": "A combination of compatibility and flavor already exists with the same values."
15 | }
16 | ]
17 | }
--------------------------------------------------------------------------------
/doc/api/v1/releases/http/validate-file-req.json:
--------------------------------------------------------------------------------
1 | POST /v1/releases/e2xno3mt59/versions/1.0.0/files/ekb9to3mv59/validate HTTP/2.0
2 | Host: api.vpdb.io
3 | Accept-Encoding: gzip, deflate
4 | Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJwMnlidjFkbXY1cyIsImlhdCI6IjIwMTgtMDItMDVUMTQ6NTE6MjMuOTU1WiIsImV4cCI6IjIwMTgtMDItMDVUMTU6NTE6MjMuOTU1WiIsImlydCI6ZmFsc2V9.Y4MflVRl7AISrm7s8ue6Kk0logCJh9kVPCDZofOn2U0
5 | Content-Type: application/json
6 | Content-Length: 56
7 |
8 | {
9 | "message": "All validated, thanks!",
10 | "status": "verified"
11 | }
--------------------------------------------------------------------------------
/doc/api/v1/releases/http/validate-file-res-200.json:
--------------------------------------------------------------------------------
1 | 200 OK
2 | Content-Type: application/json; charset=utf-8
3 | Content-Length: 268
4 | Etag: W/"10c-b5K+ZOD0j9PpI+keSV/ivQ3dfZ4"
5 |
6 | {
7 | "message": "All validated, thanks!",
8 | "status": "verified",
9 | "validated_at": "2018-02-05T14:51:25.792Z",
10 | "validated_by": {
11 | "gravatar_id": "59c702f908afca2e2bb00a7db55b0765",
12 | "id": "p2ybv1dmv5s",
13 | "name": "CarrieStroman83",
14 | "username": "CarrieStroman83"
15 | }
16 | }
--------------------------------------------------------------------------------
/doc/api/v1/releases/http/view-rating-req.json:
--------------------------------------------------------------------------------
1 | GET /v1/releases/e24qev8trs/rating HTTP/2.0
2 | Host: api.vpdb.io
3 | Accept-Encoding: gzip, deflate
4 | Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJlazRieGV2OHY1OSIsImlhdCI6IjIwMTgtMDItMDVUMTQ6Mjc6MzUuMDI3WiIsImV4cCI6IjIwMTgtMDItMDVUMTU6Mjc6MzUuMDI3WiIsImlydCI6ZmFsc2V9.uLExLCfjF6Yp7_qxo5CKloDn6lnkn1nwGz213v1oxC4
5 |
6 |
--------------------------------------------------------------------------------
/doc/api/v1/releases/http/view-rating-res-200.json:
--------------------------------------------------------------------------------
1 | 200 OK
2 | Content-Type: application/json; charset=utf-8
3 | Content-Length: 58
4 | Etag: W/"3a-GlrdRfGprFSAtCiee3n/zQI6rD8"
5 |
6 | {
7 | "created_at": "2018-02-05T14:27:41.097Z",
8 | "value": 2
9 | }
--------------------------------------------------------------------------------
/doc/api/v1/releases/http/view-req.json:
--------------------------------------------------------------------------------
1 | GET /v1/releases/e2x2218tr9?thumb_flavor=orientation:fs HTTP/2.0
2 | Host: api.vpdb.io
3 | Accept-Encoding: gzip, deflate
4 |
5 |
--------------------------------------------------------------------------------
/doc/api/v1/releases/http/view-star-req.json:
--------------------------------------------------------------------------------
1 | GET /v1/releases/pkh931t8vrs/star HTTP/2.0
2 | Host: api.vpdb.io
3 | Accept-Encoding: gzip, deflate
4 | Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJlMmVuMXY4dnJzIiwiaWF0IjoiMjAxOC0wMi0wNVQxNDozMDowNC44MzVaIiwiZXhwIjoiMjAxOC0wMi0wNVQxNTozMDowNC44MzVaIiwiaXJ0IjpmYWxzZX0.1Pw2qyOm2AfLNu6xb4R6a-MNJpz9YtoQrNREk7X0SzY
5 |
6 |
--------------------------------------------------------------------------------
/doc/api/v1/releases/http/view-star-res-200.json:
--------------------------------------------------------------------------------
1 | 200 OK
2 | Content-Type: application/json; charset=utf-8
3 | Content-Length: 45
4 | Etag: W/"2d-c0kld4DRtqJgz7FBR1l+1XuV4II"
5 |
6 | {
7 | "created_at": "2018-02-05T14:30:09.645Z"
8 | }
--------------------------------------------------------------------------------
/doc/api/v1/releases/http/view-star-res-404.json:
--------------------------------------------------------------------------------
1 | 404 Not Found
2 | Content-Type: application/json; charset=utf-8
3 | Content-Length: 82
4 | Etag: W/"52-E/uLlGVQOfH1jX2uzgDcxSxRGj8"
5 |
6 | {
7 | "error": "No star for for \"Persistent Edition\" found."
8 | }
--------------------------------------------------------------------------------
/doc/api/v1/releases/rating.raml:
--------------------------------------------------------------------------------
1 | post:
2 | securedBy: [ jwt: { scopes: [ MEMBER ] } ]
3 | is: [ validated ]
4 | description: |
5 | Rate a release.
6 |
7 | Note that this can only be done once per release, for rating changes
8 | use `PUT`.
9 | body:
10 | role/member:
11 | example: !include http/create-rating-req.json
12 | responses:
13 | 201:
14 | body:
15 | role/member:
16 | example: !include http/create-rating-res-201.json
17 | get:
18 | securedBy: [ jwt: { scopes: [ MEMBER ] } ]
19 | description: |
20 | Retrieve own rating of a release.
21 |
22 | Returns either the rating of the authenticated user of the given release, or
23 | `404` if the user hasn't voted for that release yet.
24 | body:
25 | role/member:
26 | example: !include http/view-rating-req.json
27 | responses:
28 | 200:
29 | body:
30 | role/member:
31 | example: !include http/view-rating-res-200.json
32 | put:
33 | securedBy: [ jwt: { scopes: [ MEMBER ] } ]
34 | is: [ validated ]
35 | description: |
36 | Update a rating.
37 | body:
38 | role/member:
39 | example: !include http/update-rating-req.json
40 | responses:
41 | 200:
42 | body:
43 | role/member:
44 | example: !include http/update-rating-res-200.json
--------------------------------------------------------------------------------
/doc/api/v1/roms/http/create-req.json:
--------------------------------------------------------------------------------
1 | POST /v1/roms HTTP/2.0
2 | Host: api.vpdb.io
3 | Accept-Encoding: gzip, deflate
4 | Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJwMndmeG92OHQ1cyIsImlhdCI6IjIwMTgtMDItMDVUMTQ6Mjk6NTkuNTk0WiIsImV4cCI6IjIwMTgtMDItMDVUMTU6Mjk6NTkuNTk0WiIsImlydCI6ZmFsc2V9.kGgp_AeTWy7l7lo1AyvC2Q3FHOnt5BNw2-ANeUgYsGI
5 | Content-Type: application/json
6 | Content-Length: 57
7 |
8 | {
9 | "_file": "e27bq1tmtrs",
10 | "_ipdb_number": 2684,
11 | "id": "tz_pa1"
12 | }
--------------------------------------------------------------------------------
/doc/api/v1/roms/http/create-res-201.json:
--------------------------------------------------------------------------------
1 | 201 Created
2 | Content-Type: application/json; charset=utf-8
3 | Content-Length: 692
4 | Etag: W/"2b4-pX86DNNBz+4QFAi9hVQIkXKjEFg"
5 |
6 | {
7 | "file": {
8 | "bytes": 2096,
9 | "cost": 0,
10 | "counter": {
11 | "downloads": 0
12 | },
13 | "id": "e27bq1tmtrs",
14 | "is_protected": true,
15 | "mime_type": "application/zip",
16 | "name": "hulk.zip",
17 | "url": "http://localhost:7357/storage/v1/files/e27bq1tmtrs.zip",
18 | "variations": {
19 | }
20 | },
21 | "id": "tz_pa1",
22 | "languages": [
23 | ],
24 | "rom_files": [
25 | {
26 | "bytes": 1024,
27 | "crc": 3227331410,
28 | "filename": "433.cpu",
29 | "modified_at": "1996-12-24T22:32:00.000Z"
30 | },
31 | {
32 | "bytes": 1024,
33 | "crc": 550313471,
34 | "filename": "433.snd",
35 | "modified_at": "1996-12-24T22:32:00.000Z"
36 | },
37 | {
38 | "bytes": 1024,
39 | "crc": 3078820641,
40 | "filename": "6530sys1.bin",
41 | "modified_at": "1996-12-24T22:32:00.000Z"
42 | }
43 | ]
44 | }
--------------------------------------------------------------------------------
/doc/api/v1/roms/http/del-req.json:
--------------------------------------------------------------------------------
1 | DELETE /v1/roms/hulk HTTP/2.0
2 | Host: api.vpdb.io
3 | Accept-Encoding: gzip, deflate
4 | Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJwMjF6cDF0OHRycyIsImlhdCI6IjIwMTgtMDItMDVUMTQ6MzA6MDEuMTQzWiIsImV4cCI6IjIwMTgtMDItMDVUMTU6MzA6MDEuMTQzWiIsImlydCI6ZmFsc2V9.mZ3NX7ugyjIO6uhPxu-tVABRa84VUpMfylQF0_SR5qQ
5 |
6 |
--------------------------------------------------------------------------------
/doc/api/v1/roms/http/del-res-204.json:
--------------------------------------------------------------------------------
1 | 204 No Content
2 |
3 |
--------------------------------------------------------------------------------
/doc/api/v1/roms/http/list-req.json:
--------------------------------------------------------------------------------
1 | GET /v1/roms HTTP/2.0
2 | Host: api.vpdb.io
3 | Accept-Encoding: gzip, deflate
4 |
5 |
--------------------------------------------------------------------------------
/doc/api/v1/roms/http/view-req.json:
--------------------------------------------------------------------------------
1 | GET /v1/roms/hulk6 HTTP/2.0
2 | Host: api.vpdb.io
3 | Accept-Encoding: gzip, deflate
4 |
5 |
--------------------------------------------------------------------------------
/doc/api/v1/tags/http/create-req.json:
--------------------------------------------------------------------------------
1 | POST /v1/tags HTTP/2.0
2 | Host: api.vpdb.io
3 | Accept-Encoding: gzip, deflate
4 | Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJla2hleDJubXQ1cyIsImlhdCI6IjIwMTgtMDItMDVUMTQ6MzA6MTUuNzU1WiIsImV4cCI6IjIwMTgtMDItMDVUMTU6MzA6MTUuNzU1WiIsImlydCI6ZmFsc2V9.pYNtp2Ub7NoS882R7lfpajmuwRMobE-xawkTKObJqUs
5 | Content-Type: application/json
6 | Content-Length: 70
7 |
8 | {
9 | "description": "A tag, generated for testing purpose.",
10 | "name": "mytag"
11 | }
--------------------------------------------------------------------------------
/doc/api/v1/tags/http/create-res-201.json:
--------------------------------------------------------------------------------
1 | 201 Created
2 | Content-Type: application/json; charset=utf-8
3 | Content-Length: 93
4 | Etag: W/"5d-ekPrQK2SSsxmLMhZOx9gNcCu/P0"
5 |
6 | {
7 | "description": "A tag, generated for testing purpose.",
8 | "id": "mytag",
9 | "name": "mytag"
10 | }
--------------------------------------------------------------------------------
/doc/api/v1/tags/http/create-res-422.json:
--------------------------------------------------------------------------------
1 | 422 Unprocessable Entity
2 | Content-Type: application/json; charset=utf-8
3 | Content-Length: 168
4 | Etag: W/"a8-SLKSH/pIGd5fhkp0NkSfpx4TVCQ"
5 |
6 | {
7 | "errors": [
8 | {
9 | "field": "description",
10 | "message": "Description must be provided."
11 | },
12 | {
13 | "field": "name",
14 | "message": "Name must be provided."
15 | }
16 | ]
17 | }
--------------------------------------------------------------------------------
/doc/api/v1/tags/http/del-res-401.json:
--------------------------------------------------------------------------------
1 | 401 Unauthorized
2 | Content-Type: application/json; charset=utf-8
3 | Content-Length: 79
4 | Etag: W/"4f-RYaRl1VAVKjFOUH9s+M9yXHBJJ0"
5 |
6 | {
7 | "error": "Unauthorized. You need to provide credentials for this resource"
8 | }
--------------------------------------------------------------------------------
/doc/api/v1/tags/http/del-res-403.json:
--------------------------------------------------------------------------------
1 | 403 Forbidden
2 | Content-Type: application/json; charset=utf-8
3 | Content-Length: 49
4 | Etag: W/"31-ywkfrDL4nRMJwVJc6QhLi7n0Ydg"
5 |
6 | {
7 | "error": "Permission denied, must be owner."
8 | }
--------------------------------------------------------------------------------
/doc/api/v1/tags/http/list-req.json:
--------------------------------------------------------------------------------
1 | GET /v1/tags HTTP/2.0
2 | Host: api.vpdb.io
3 | Accept-Encoding: gzip, deflate
4 |
5 |
--------------------------------------------------------------------------------
/doc/api/v1/tags/http/list-res-200.json:
--------------------------------------------------------------------------------
1 | 200 OK
2 | Content-Type: application/json; charset=utf-8
3 | Content-Length: 448
4 | Etag: W/"1c0-xjtfOhSxqWD0aD+HewBQGVLgUeE"
5 |
6 | [
7 | {
8 | "description": "Support for Direct Output Framework.",
9 | "id": "dof",
10 | "name": "DOF"
11 | },
12 | {
13 | "description": "All textures render crispy at Full HD resolution.",
14 | "id": "hd",
15 | "name": "HD"
16 | },
17 | {
18 | "description": "Table is modeled entirely in 3D (no 2D sprites are used).",
19 | "id": "3d",
20 | "name": "3D"
21 | },
22 | {
23 | "description": "Work in Progress. This release is still unfinished and can contain bugs.",
24 | "id": "wip",
25 | "name": "WIP"
26 | }
27 | ]
--------------------------------------------------------------------------------
/doc/api/v1/tokens/http/create-req.json:
--------------------------------------------------------------------------------
1 | POST /v1/tokens HTTP/2.0
2 | Host: api.vpdb.io
3 | Accept-Encoding: gzip, deflate
4 | Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJla3dzcWthbXRycyIsImlhdCI6IjIwMTgtMDItMDVUMTQ6MzA6MTYuMTkwWiIsImV4cCI6IjIwMTgtMDItMDVUMTU6MzA6MTYuMTkwWiIsImlydCI6ZmFsc2V9.eAd_sileBq2dsb1HjF7WYvMrFMU1beTHAK8F8XG5mZc
5 | Content-Type: application/json
6 | Content-Length: 85
7 |
8 | {
9 | "label": "My Application",
10 | "password": "4yyQelxkmh",
11 | "scopes": [
12 | "all"
13 | ],
14 | "type": "personal"
15 | }
--------------------------------------------------------------------------------
/doc/api/v1/tokens/http/create-res-201.json:
--------------------------------------------------------------------------------
1 | 201 Created
2 | Content-Type: application/json; charset=utf-8
3 | Content-Length: 250
4 | Etag: W/"fa-tQrovOWtwdQV7xlgV3kjHoUQd20"
5 |
6 | {
7 | "created_at": "2018-02-05T14:30:16.268Z",
8 | "expires_at": "2019-02-05T14:30:16.268Z",
9 | "id": "ekg4qkamv59",
10 | "is_active": true,
11 | "label": "My Application",
12 | "scopes": [
13 | "all"
14 | ],
15 | "token": "62fac97d5ae99b7c295b56bf650ae76d",
16 | "type": "personal"
17 | }
--------------------------------------------------------------------------------
/doc/api/v1/tokens/http/create-res-401.json:
--------------------------------------------------------------------------------
1 | 401 Unauthorized
2 | Content-Type: application/json; charset=utf-8
3 | Content-Length: 139
4 | Etag: W/"8b-/SqQsh3QeyxljNP5x4YK+EmqHtw"
5 |
6 | {
7 | "error": "You cannot create other tokens but login tokens without supplying a password, even when logged with a \"short term\" token."
8 | }
--------------------------------------------------------------------------------
/doc/api/v1/tokens/http/create-res-403.json:
--------------------------------------------------------------------------------
1 | 403 Forbidden
2 | Content-Type: application/json; charset=utf-8
3 | Content-Length: 93
4 | Etag: W/"5d-YgQFOHZaV0tHWqjZJWsCwA"
5 |
6 | {
7 | "error": "You cannot create other tokens but login tokens without supplying a password."
8 | }
--------------------------------------------------------------------------------
/doc/api/v1/tokens/http/del-req.json:
--------------------------------------------------------------------------------
1 | DELETE /v1/tokens/ek19e2a8tr9 HTTP/2.0
2 | Host: api.vpdb.io
3 | Accept-Encoding: gzip, deflate
4 | Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJwa3JzZWtuOHY1OSIsImlhdCI6IjIwMTgtMDItMDVUMTQ6MzA6MTcuMTUxWiIsImV4cCI6IjIwMTgtMDItMDVUMTU6MzA6MTcuMTUxWiIsImlydCI6ZmFsc2V9.cHBCYHda_mxrJmRNFQfjvtzbiZ4JWnGAaAp4craptHE
5 |
6 |
--------------------------------------------------------------------------------
/doc/api/v1/tokens/http/del-res-204.json:
--------------------------------------------------------------------------------
1 | 204 No Content
2 |
3 |
--------------------------------------------------------------------------------
/doc/api/v1/tokens/http/list-req.json:
--------------------------------------------------------------------------------
1 | GET /v1/tokens HTTP/2.0
2 | Host: api.vpdb.io
3 | Accept-Encoding: gzip, deflate
4 | Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJwa3JzZWtuOHY1OSIsImlhdCI6IjIwMTgtMDItMDVUMTQ6MzA6MTcuMTUxWiIsImV4cCI6IjIwMTgtMDItMDVUMTU6MzA6MTcuMTUxWiIsImlydCI6ZmFsc2V9.cHBCYHda_mxrJmRNFQfjvtzbiZ4JWnGAaAp4craptHE
5 |
6 |
--------------------------------------------------------------------------------
/doc/api/v1/tokens/http/list-res-200.json:
--------------------------------------------------------------------------------
1 | 200 OK
2 | Content-Type: application/json; charset=utf-8
3 | Content-Length: 2
4 | Etag: W/"2-l9Fw4VUO7kr8CvBlt4zaMCqXZ0w"
5 |
6 | [
7 | ]
--------------------------------------------------------------------------------
/doc/api/v1/tokens/http/patch-req.json:
--------------------------------------------------------------------------------
1 | PATCH /v1/tokens/pkfhekn8v59 HTTP/2.0
2 | Host: api.vpdb.io
3 | Accept-Encoding: gzip, deflate
4 | Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJwMm9wa2E4djVzIiwiaWF0IjoiMjAxOC0wMi0wNVQxNDozMDoxNi44NjBaIiwiZXhwIjoiMjAxOC0wMi0wNVQxNTozMDoxNi44NjBaIiwiaXJ0IjpmYWxzZX0.gXqPYlkfxoM--XGtkG0ZcFfAmn7Gh5xwkWaX9CpbbZg
5 | Content-Type: application/json
6 | Content-Length: 92
7 |
8 | {
9 | "expires_at": "2018-02-05T14:30:17.899Z",
10 | "is_active": false,
11 | "label": "My Renamed Application"
12 | }
--------------------------------------------------------------------------------
/doc/api/v1/tokens/http/patch-res-200.json:
--------------------------------------------------------------------------------
1 | 200 OK
2 | Content-Type: application/json; charset=utf-8
3 | Content-Length: 213
4 | Etag: W/"d5-//4fib+qWCGx7VQDqBIpSYoSL+s"
5 |
6 | {
7 | "created_at": "2018-02-05T14:30:16.896Z",
8 | "expires_at": "2018-02-05T14:30:17.899Z",
9 | "id": "pkfhekn8v59",
10 | "is_active": false,
11 | "label": "My Renamed Application",
12 | "scopes": [
13 | "all"
14 | ],
15 | "type": "personal"
16 | }
--------------------------------------------------------------------------------
/doc/api/v1/tokens/http/patch-res-422.json:
--------------------------------------------------------------------------------
1 | 422 Unprocessable Entity
2 | Content-Type: application/json; charset=utf-8
3 | Content-Length: 258
4 | Etag: W/"102-UOxdOOTRwftNhV9OJy5oEa8Jy4c"
5 |
6 | {
7 | "errors": [
8 | {
9 | "field": "expires_at",
10 | "message": "Cast to Date failed for value \"foo\" at path \"expires_at\"",
11 | "value": "foo"
12 | },
13 | {
14 | "field": "label",
15 | "message": "Label must contain at least three characters.",
16 | "value": "1"
17 | }
18 | ]
19 | }
--------------------------------------------------------------------------------
/doc/api/v1/tokens/http/view-req.json:
--------------------------------------------------------------------------------
1 | GET /v1/tokens/85c1dccd89cae6099ea7254c7f4a14e4 HTTP/2.0
2 | Host: api.vpdb.io
3 | Accept-Encoding: gzip, deflate
4 |
5 |
--------------------------------------------------------------------------------
/doc/api/v1/tokens/http/view-res-200.json:
--------------------------------------------------------------------------------
1 | 200 OK
2 | Content-Type: application/json; charset=utf-8
3 | Content-Length: 229
4 | Etag: W/"e5-nlRnPh+ZWmN9DfDqhiLlASei5eQ"
5 |
6 | {
7 | "created_at": "2018-02-21T22:26:52.512Z",
8 | "expires_at": "2028-02-19T22:26:52.512Z",
9 | "is_active": true,
10 | "label": "Test Application",
11 | "provider": "github",
12 | "scopes": [
13 | "community",
14 | "service"
15 | ],
16 | "type": "application"
17 | }
--------------------------------------------------------------------------------
/doc/api/v1/user/http/confirm-token-req.json:
--------------------------------------------------------------------------------
1 | GET /v1/user/confirm/okRtrsiO8MUOS2Ry HTTP/2.0
2 | Host: api.vpdb.io
3 | Accept-Encoding: gzip, deflate
4 |
5 |
--------------------------------------------------------------------------------
/doc/api/v1/user/http/confirm-token-res-200.json:
--------------------------------------------------------------------------------
1 | 200 OK
2 | Content-Type: application/json; charset=utf-8
3 | Content-Length: 82
4 | Etag: W/"52-c6Txh6Kxg60LWrywEMDl3cU1Qgw"
5 |
6 | {
7 | "message": "Email validated and updated.",
8 | "previous_code": "pending_update"
9 | }
--------------------------------------------------------------------------------
/doc/api/v1/user/http/confirm-token-res-404.json:
--------------------------------------------------------------------------------
1 | 404 Not Found
2 | Content-Type: application/json; charset=utf-8
3 | Content-Length: 47
4 | Etag: W/"2f-OopzyGPqfLnkr5jEkkqxnUNHFYo"
5 |
6 | {
7 | "error": "No such token or token expired."
8 | }
--------------------------------------------------------------------------------
/doc/api/v1/user/http/update-create-local-req.json:
--------------------------------------------------------------------------------
1 | PATCH /v1/user HTTP/2.0
2 | Host: api.vpdb.io
3 | Accept-Encoding: gzip, deflate
4 | Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJlMjdlNTJhOHY1OSIsImlhdCI6IjIwMTgtMDItMDVUMTQ6MzA6MTguMzU2WiIsImV4cCI6IjIwMTgtMDItMDVUMTU6MzA6MTguMzU2WiIsImlydCI6ZmFsc2V9.EnPgEjKmmNEj1n5KrYC75tnUQQ3BQ1o2-E8u2MJcsa8
5 | Content-Type: application/json
6 | Content-Length: 52
7 |
8 | {
9 | "password": "USZ3xWlqbh",
10 | "username": "JudahQuitzon3"
11 | }
--------------------------------------------------------------------------------
/doc/api/v1/user/http/update-password-req.json:
--------------------------------------------------------------------------------
1 | PATCH /v1/user HTTP/2.0
2 | Host: api.vpdb.io
3 | Accept-Encoding: gzip, deflate
4 | Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJwMnFlcGtubXZyOSIsImlhdCI6IjIwMTgtMDItMDVUMTQ6MzA6MTcuMzUzWiIsImV4cCI6IjIwMTgtMDItMDVUMTU6MzA6MTcuMzUzWiIsImlydCI6ZmFsc2V9.lLnVZHHMeb3MA4vPp2lEXIyWWBPAWW64oBVqW_BB3rM
5 | Content-Type: application/json
6 | Content-Length: 57
7 |
8 | {
9 | "current_password": "jizsohC79p",
10 | "password": "gwUXODxdwC"
11 | }
--------------------------------------------------------------------------------
/doc/api/v1/user/http/update-profile-req.json:
--------------------------------------------------------------------------------
1 | PATCH /v1/user HTTP/2.0
2 | Host: api.vpdb.io
3 | Accept-Encoding: gzip, deflate
4 | Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJla21wZWtubXRycyIsImlhdCI6IjIwMTgtMDItMDVUMTQ6MzA6MTcuMzk0WiIsImV4cCI6IjIwMTgtMDItMDVUMTU6MzA6MTcuMzk0WiIsImlydCI6ZmFsc2V9.BTyoDljZRQoi3Ei8A-ETvkw4SJrExMvW7gVOfdiWp3s
5 | Content-Type: application/json
6 | Content-Length: 135
7 |
8 | {
9 | "current_password": "VfHjLg2oMm",
10 | "email": "kristina94@yahoo.com",
11 | "location": "West Kaylee",
12 | "name": "Sunny Graham",
13 | "password": "PnRwi8Eukz"
14 | }
--------------------------------------------------------------------------------
/doc/api/v1/user/http/view-req.json:
--------------------------------------------------------------------------------
1 | GET /v1/user HTTP/2.0
2 | Host: api.vpdb.io
3 | Accept-Encoding: gzip, deflate
4 | Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJlMjRocmJ0OHQ1OSIsImlhdCI6IjIwMTgtMDItMDVUMTQ6MjY6MTcuOTgyWiIsImV4cCI6IjIwMTgtMDItMDVUMTU6MjY6MTcuOTgyWiIsImlydCI6ZmFsc2V9.KAliz0K_DRRHD95ngCtwOhF-9nxAvaVrBfdNxaneCV0
5 |
6 |
--------------------------------------------------------------------------------
/doc/api/v1/user/http/view-res-401.json:
--------------------------------------------------------------------------------
1 | 401 Unauthorized
2 | Content-Type: application/json; charset=utf-8
3 | Content-Length: 79
4 | Etag: W/"4f-RYaRl1VAVKjFOUH9s+M9yXHBJJ0"
5 |
6 | {
7 | "error": "Unauthorized. You need to provide credentials for this resource"
8 | }
--------------------------------------------------------------------------------
/doc/api/v1/users/http/create-star-req.json:
--------------------------------------------------------------------------------
1 | POST /v1/users/e26x92nmt59/star HTTP/2.0
2 | Host: api.vpdb.io
3 | Accept-Encoding: gzip, deflate
4 | Content-Type: application/json
5 | Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJlMjF5c2thOHRycyIsImlhdCI6IjIwMTgtMDItMDVUMTQ6MzA6MTQuNDgxWiIsImV4cCI6IjIwMTgtMDItMDVUMTU6MzA6MTQuNDgxWiIsImlydCI6ZmFsc2V9.dP2icB8hgY9TSRez41DL0hGACgCporY0YQJTdLM9Ut0
6 | Content-Length: 2
7 |
8 | {
9 | }
--------------------------------------------------------------------------------
/doc/api/v1/users/http/create-star-res-201.json:
--------------------------------------------------------------------------------
1 | 201 Created
2 | Content-Type: application/json; charset=utf-8
3 | Content-Length: 64
4 | Etag: W/"40-WY9MHTRDvngYd/Usgbg7/a6Jb44"
5 |
6 | {
7 | "created_at": "2018-02-05T14:30:14.937Z",
8 | "total_stars": 1
9 | }
--------------------------------------------------------------------------------
/doc/api/v1/users/http/del-res-401.json:
--------------------------------------------------------------------------------
1 | 401 Unauthorized
2 | Content-Type: application/json; charset=utf-8
3 | Content-Length: 79
4 | Etag: W/"4f-RYaRl1VAVKjFOUH9s+M9yXHBJJ0"
5 |
6 | {
7 | "error": "Unauthorized. You need to provide credentials for this resource"
8 | }
--------------------------------------------------------------------------------
/doc/api/v1/users/http/del-res-403.json:
--------------------------------------------------------------------------------
1 | 403 Forbidden
2 | Content-Type: application/json; charset=utf-8
3 | Content-Length: 29
4 | Etag: W/"1d-Zvad9ZN/jIAp+AREtPJ7jLz0Yy4"
5 |
6 | {
7 | "error": "Access denied"
8 | }
--------------------------------------------------------------------------------
/doc/api/v1/users/http/delete-star-req.json:
--------------------------------------------------------------------------------
1 | DELETE /v1/users/p23x2a8v59/star HTTP/2.0
2 | Host: api.vpdb.io
3 | Accept-Encoding: gzip, deflate
4 | Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJlMjF5c2thOHRycyIsImlhdCI6IjIwMTgtMDItMDVUMTQ6MzA6MTQuNDgxWiIsImV4cCI6IjIwMTgtMDItMDVUMTU6MzA6MTQuNDgxWiIsImlydCI6ZmFsc2V9.dP2icB8hgY9TSRez41DL0hGACgCporY0YQJTdLM9Ut0
5 |
6 |
--------------------------------------------------------------------------------
/doc/api/v1/users/http/delete-star-res-204.json:
--------------------------------------------------------------------------------
1 | 204 No Content
2 |
3 |
--------------------------------------------------------------------------------
/doc/api/v1/users/http/list-req.json:
--------------------------------------------------------------------------------
1 | GET /v1/users HTTP/2.0
2 | Host: api.vpdb.io
3 | Accept-Encoding: gzip, deflate
4 | Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJwMnZxcDJuOHY1cyIsImlhdCI6IjIwMTgtMDItMDVUMTQ6MzA6MTcuMjg5WiIsImV4cCI6IjIwMTgtMDItMDVUMTU6MzA6MTcuMjg5WiIsImlydCI6ZmFsc2V9.B7sv8DjMgCr2idITBCmsODrDCkl5WkV_VzT0Uv__xrc
5 |
6 |
--------------------------------------------------------------------------------
/doc/api/v1/users/http/list-res-401.json:
--------------------------------------------------------------------------------
1 | 401 Unauthorized
2 | Content-Type: application/json; charset=utf-8
3 | Content-Length: 79
4 | Etag: W/"4f-RYaRl1VAVKjFOUH9s+M9yXHBJJ0"
5 |
6 | {
7 | "error": "Unauthorized. You need to provide credentials for this resource"
8 | }
--------------------------------------------------------------------------------
/doc/api/v1/users/http/list-res-403.json:
--------------------------------------------------------------------------------
1 | 403 Forbidden
2 | Content-Type: application/json; charset=utf-8
3 | Content-Length: 91
4 | Etag: W/"5b-LBwXRDqfDXYL3puQKq/OWWxFDe0"
5 |
6 | {
7 | "error": "Please provide a search query with at least three characters or a user name"
8 | }
--------------------------------------------------------------------------------
/doc/api/v1/users/http/post-req.json:
--------------------------------------------------------------------------------
1 | POST /v1/users HTTP/2.0
2 | Host: api.vpdb.io
3 | Accept-Encoding: gzip, deflate
4 | Content-Type: application/json
5 | Content-Length: 85
6 |
7 | {
8 | "email": "tommie55@hotmail.com",
9 | "password": "wWfVCPiHSo",
10 | "username": "BrendenBrekke82"
11 | }
--------------------------------------------------------------------------------
/doc/api/v1/users/http/post-res-422.json:
--------------------------------------------------------------------------------
1 | 422 Unprocessable Entity
2 | Content-Type: application/json; charset=utf-8
3 | Content-Length: 304
4 | Etag: W/"130-bEi26lmaSBFk7kHrUGh60px7uZY"
5 |
6 | {
7 | "errors": [
8 | {
9 | "field": "email",
10 | "message": "Email must be in the correct format.",
11 | "value": "xxx"
12 | },
13 | {
14 | "field": "password",
15 | "message": "Password must be at least 6 characters."
16 | },
17 | {
18 | "field": "username",
19 | "message": "Username must be between 3 and 30 characters."
20 | }
21 | ]
22 | }
--------------------------------------------------------------------------------
/doc/api/v1/users/http/search-as-member-req.json:
--------------------------------------------------------------------------------
1 | GET /v1/users?q=Bro HTTP/2.0
2 | Host: api.vpdb.io
3 | Accept-Encoding: gzip, deflate
4 | Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJwMmJlZTJubXY1OSIsImlhdCI6IjIwMTgtMDItMDVUMTQ6MzA6MTcuMzMzWiIsImV4cCI6IjIwMTgtMDItMDVUMTU6MzA6MTcuMzMzWiIsImlydCI6ZmFsc2V9.3g1HNw0cPL8nxkBXZr5D8o-Nb2C3p3JX5sCEP1HtpIk
5 |
6 |
--------------------------------------------------------------------------------
/doc/api/v1/users/http/search-as-member-res-200.json:
--------------------------------------------------------------------------------
1 | 200 OK
2 | Content-Type: application/json; charset=utf-8
3 | Content-Length: 190
4 | Etag: W/"be-/KA16y/GIBLGRZYNs0UOA343xlw"
5 |
6 | [
7 | {
8 | "counter": {
9 | "comments": 0,
10 | "stars": 0
11 | },
12 | "gravatar_id": "bed243be1f799e138312347d9f48c8f0",
13 | "id": "p2bee2nmv59",
14 | "name": "Broderick27",
15 | "username": "Broderick27"
16 | }
17 | ]
--------------------------------------------------------------------------------
/doc/api/v1/users/http/update-req.json:
--------------------------------------------------------------------------------
1 | PUT /v1/users/p2bee2nmv59 HTTP/2.0
2 | Host: api.vpdb.io
3 | Accept-Encoding: gzip, deflate
4 | Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJwMnZxcDJuOHY1cyIsImlhdCI6IjIwMTgtMDItMDVUMTQ6MzA6MTcuMjg5WiIsImV4cCI6IjIwMTgtMDItMDVUMTU6MzA6MTcuMjg5WiIsImlydCI6ZmFsc2V9.B7sv8DjMgCr2idITBCmsODrDCkl5WkV_VzT0Uv__xrc
5 | Content-Type: application/json
6 | Content-Length: 133
7 |
8 | {
9 | "_plan": "free",
10 | "email": "heloise_heller@yahoo.com",
11 | "is_active": true,
12 | "name": "DaynaMetz86",
13 | "roles": [
14 | "member"
15 | ],
16 | "username": "DaynaMetz86"
17 | }
--------------------------------------------------------------------------------
/doc/api/v1/users/http/update-res-401.json:
--------------------------------------------------------------------------------
1 | 401 Unauthorized
2 | Content-Type: application/json; charset=utf-8
3 | Content-Length: 79
4 | Etag: W/"4f-RYaRl1VAVKjFOUH9s+M9yXHBJJ0"
5 |
6 | {
7 | "error": "Unauthorized. You need to provide credentials for this resource"
8 | }
--------------------------------------------------------------------------------
/doc/api/v1/users/http/update-res-403.json:
--------------------------------------------------------------------------------
1 | 403 Forbidden
2 | Content-Type: application/json; charset=utf-8
3 | Content-Length: 29
4 |
5 | {
6 | "error": "Access denied"
7 | }
--------------------------------------------------------------------------------
/doc/api/v1/users/http/update-res-422.json:
--------------------------------------------------------------------------------
1 | 422 Unprocessable Entity
2 | Content-Type: application/json; charset=utf-8
3 | Content-Length: 484
4 | Etag: W/"1e4-PJWY9iqTYW+rZ2mjQDWw8lpI38I"
5 |
6 | {
7 | "errors": [
8 | {
9 | "field": "_plan",
10 | "message": "Path `_plan` is required."
11 | },
12 | {
13 | "field": "email",
14 | "message": "Email must be provided."
15 | },
16 | {
17 | "field": "is_active",
18 | "message": "Path `is_active` is required."
19 | },
20 | {
21 | "field": "name",
22 | "message": "Name must be provided."
23 | },
24 | {
25 | "field": "roles",
26 | "message": "Path `roles` is required."
27 | },
28 | {
29 | "field": "username",
30 | "message": "Username must be a string between 3 and 30 characters."
31 | }
32 | ]
33 | }
--------------------------------------------------------------------------------
/doc/api/v1/users/http/view-req.json:
--------------------------------------------------------------------------------
1 | GET /v1/users/p2bee2nmv59 HTTP/2.0
2 | Host: api.vpdb.io
3 | Accept-Encoding: gzip, deflate
4 | Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJwMnZxcDJuOHY1cyIsImlhdCI6IjIwMTgtMDItMDVUMTQ6MzA6MTcuMjg5WiIsImV4cCI6IjIwMTgtMDItMDVUMTU6MzA6MTcuMjg5WiIsImlydCI6ZmFsc2V9.B7sv8DjMgCr2idITBCmsODrDCkl5WkV_VzT0Uv__xrc
5 |
6 |
--------------------------------------------------------------------------------
/doc/api/v1/users/http/view-res-401.json:
--------------------------------------------------------------------------------
1 | 401 Unauthorized
2 | Content-Type: application/json; charset=utf-8
3 | Content-Length: 79
4 | Etag: W/"4f-RYaRl1VAVKjFOUH9s+M9yXHBJJ0"
5 |
6 | {
7 | "error": "Unauthorized. You need to provide credentials for this resource"
8 | }
--------------------------------------------------------------------------------
/doc/api/v1/users/http/view-res-403.json:
--------------------------------------------------------------------------------
1 | 403 Forbidden
2 | Content-Type: application/json; charset=utf-8
3 | Content-Length: 29
4 | Etag: W/"1d-9f1cb753"
5 |
6 | {
7 | "error": "Access denied"
8 | }
--------------------------------------------------------------------------------
/doc/api/v1/users/http/view-star-req.json:
--------------------------------------------------------------------------------
1 | GET /v1/users/ekn42nmvr9/star HTTP/2.0
2 | Host: api.vpdb.io
3 | Accept-Encoding: gzip, deflate
4 | Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJlMjF5c2thOHRycyIsImlhdCI6IjIwMTgtMDItMDVUMTQ6MzA6MTQuNDgxWiIsImV4cCI6IjIwMTgtMDItMDVUMTU6MzA6MTQuNDgxWiIsImlydCI6ZmFsc2V9.dP2icB8hgY9TSRez41DL0hGACgCporY0YQJTdLM9Ut0
5 |
6 |
--------------------------------------------------------------------------------
/doc/api/v1/users/http/view-star-res-200.json:
--------------------------------------------------------------------------------
1 | 200 OK
2 | Content-Type: application/json; charset=utf-8
3 | Content-Length: 45
4 | Etag: W/"2d-y57eeuFaf7Gesk0z7mpih7bDaDE"
5 |
6 | {
7 | "created_at": "2018-02-05T14:30:14.962Z"
8 | }
--------------------------------------------------------------------------------
/doc/api/v1/users/http/view-star-res-404.json:
--------------------------------------------------------------------------------
1 | 404 Not Found
2 | Content-Type: application/json; charset=utf-8
3 | Content-Length: 97
4 | Etag: W/"61-Nvb4i4fHb6ornu4CDwtU0ZA5hgI"
5 |
6 | {
7 | "error": "No star for for \"lucy_johnston67@hotmail.com\" found."
8 | }
--------------------------------------------------------------------------------
/doc/api/v1/users/star.raml:
--------------------------------------------------------------------------------
1 | post:
2 | securedBy: [ jwt: { scopes: [ MEMBER ] } ]
3 | description: |
4 | Star a user.
5 |
6 | Note that this can only be done once per user. You can unstar a user
7 | using `DELETE` on the same URL.
8 | body:
9 | role/member:
10 | example: !include http/create-star-req.json
11 | responses:
12 | 201:
13 | body:
14 | role/member:
15 | example: !include http/create-star-res-201.json
16 | get:
17 | securedBy: [ jwt: { scopes: [ MEMBER ] } ]
18 | description: |
19 | Retrieve own star status of a user.
20 |
21 | Returns either the star date of the authenticated user of the given user, or
22 | `404` if the user hasn't starred that user.
23 | body:
24 | role/member:
25 | example: !include http/view-star-req.json
26 | responses:
27 | 200:
28 | body:
29 | role/member:
30 | example: !include http/view-star-res-200.json
31 | 404:
32 | body:
33 | role/member:
34 | example: !include http/view-star-res-404.json
35 | delete:
36 | securedBy: [ jwt: { scopes: [ MEMBER ] } ]
37 | description: |
38 | Unstar a user.
39 | body:
40 | role/member:
41 | example: !include http/delete-star-req.json
42 | responses:
43 | 204:
44 | body:
45 | role/member:
46 | example: !include http/delete-star-res-204.json
--------------------------------------------------------------------------------
/doc/code/recipes.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: Recipes
3 | layout: page.pug
4 | menuIndex: 1
5 | subsectionIndex: 5
6 | ---
7 |
8 | # Recipes
9 |
10 | What to do when to do where to do.
11 |
12 | ## New Entity
13 |
14 | 1. Create model at `/src/models`.
15 | 2. Create API controller at `/src/controllers/api`.
16 | 3. Add route at `/src/routes`.
17 | 4. Add ACL tests at `/test/api/acl.test.js`.
18 | 5. Add API tests at `/test/api`.
19 | 6. Write API documentation at `/doc/api/v1`.
20 |
--------------------------------------------------------------------------------
/doc/code/storage.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: Storage
3 | layout: page.pug
4 | menuIndex: 2
5 | subsectionIndex: 2
6 | ---
7 |
8 | Storage content
--------------------------------------------------------------------------------
/doc/home.md:
--------------------------------------------------------------------------------
1 | ---
2 | title: Developer
3 | header: VPDB Developer
4 | layout: home.pug
5 | menuIndex: 1
6 | ---
7 |
8 | This is just a placeholder, content is all in the template.
--------------------------------------------------------------------------------
/doc/logo_IntelliJIDEA.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vpdb/server/c790f6ff0f6572edc6ccfcb1cf8f853db2829c80/doc/logo_IntelliJIDEA.png
--------------------------------------------------------------------------------
/doc/storage/v1/_securitySchemes/jwt.raml:
--------------------------------------------------------------------------------
1 | description: Bearer token authentication using JSON web tokens.
2 | type: x-jwt
3 | describedBy:
4 | headers:
5 | Authorization:
6 | description: |
7 | Used to send a valid JSON web token. For more information check
8 | the [RFC draft](http://tools.ietf.org/html/draft-jones-json-web-token-10).
9 | type: string
10 | responses:
11 | 401:
12 | description: |
13 | Bad or expired token. To fix, you should re-authenticate the
14 | user.
15 | 403:
16 | description: |
17 | Acces denied. That means that the user was authenticated
18 | successfully but hasn't permission to acess the resource. In
19 | this case, re-authenticating won't help.
20 | settings:
21 | authorizationUri: https://vpdb.io/api/authorize
22 |
--------------------------------------------------------------------------------
/doc/storage/v1/_traits/protected.raml:
--------------------------------------------------------------------------------
1 | headers:
2 | Authorization:
3 | description: A valid *JSON Web Token*.
4 | type: string
5 | required: true
6 | responses:
7 | 401:
8 | description: |
9 | Authentication credentials are missing or invalid.
10 | Maybe you forgot to add the `Authorization` header, or it has the wrong value.
11 |
--------------------------------------------------------------------------------
/doc/storage/v1/_traits/rate-limited.raml:
--------------------------------------------------------------------------------
1 | responses:
2 | 200:
3 | headers:
4 | X-RateLimit-Limit:
5 | description: The maximum number of requests the user is permitted to make per day.
6 | type: integer
7 | required: true
8 | X-RateLimit-Remaining:
9 | description: The number of requests remaining in the current rate limit window.
10 | type: integer
11 | required: true
12 | X-RateLimit-Reset:
13 | description: The time until the current rate limit window resets, in milliseconds.
14 | type: integer
15 | required: true
16 | 403:
17 | description: |
18 | API rate limit exceeded for user
--------------------------------------------------------------------------------
/doc/storage/v1/auth/auth.raml:
--------------------------------------------------------------------------------
1 | displayName: Authentication
2 | description: |
3 | Some storage items such as images and videos are usually not loaded with
4 | Javascript but by the browser directly. However, when those items need
5 | authentification (like images on an upload page), it's difficult for the
6 | browser to provide the bearer token in the HTTP header.
7 |
8 | For this reason, the storage API accepts so-called *storage tokens*.
9 | Storage tokens can be put as a query string into the URL, are only valid a
10 | very limited time (usually one minute), and are locked to a given URL path.
11 |
12 | post:
13 | securedBy: [ jwt: { scopes: [ MEMBER ] } ]
14 | description: |
15 | Generate one or more storage tokens.
16 | body:
17 | role/member:
18 | example: !include ../../../api/v1/auth/http/storage-req.json
19 | responses:
20 | 201:
21 | body:
22 | role/member:
23 | example: !include ../../../api/v1/auth/http/storage-res-200.json
24 |
--------------------------------------------------------------------------------
/doc/storage/v1/files/files.raml:
--------------------------------------------------------------------------------
1 | displayName: Files
2 | description: |
3 | The storage API for uploading and downloading individual files. Contrarily to
4 | the API's [files resource][core-files], this deals with the *file content*, while the
5 | core API deals with the file's *meta data*.
6 |
7 | [core-files]: api://core/files
8 |
9 | post:
10 | securedBy: [ jwt: { scopes: [ MEMBER ] } ]
11 | description: |
12 | Upload a new file.
13 |
14 | Data can be either sent as the entire body or as multipart request. In
15 | either case, `Content-Type` must be set.
16 |
17 | However, due to a `XMLHttpRequest` limitation, content types of individual
18 | parts cannot be set through a browser, so when posting multipart data, the
19 | content type must be provided through a `content_type` query parameter.
20 |
21 | Only one file is allowed per multipart request. Fields are ignored.
22 |
23 | /{storage_id}:
24 | get:
25 | is: [ rateLimited ]
26 | description: |
27 | Download an existing file.
28 | uriParameters:
29 | storage_id:
30 | displayName: Storage ID
31 | type: string
32 |
33 | /{variation_name}:
34 | get:
35 | description: |
36 | Download a variation of an existing file.
37 | uriParameters:
38 | variation_name:
39 | displayName: Variation name
40 | type: string
41 |
--------------------------------------------------------------------------------
/doc/storage/v1/index.raml:
--------------------------------------------------------------------------------
1 | #%RAML 0.8
2 | ---
3 | title: VPDB API
4 | baseUri: https://storage.vpdb.io/v1
5 | protocols: [HTTPS]
6 | mediaType: application/json
7 |
8 | securitySchemes:
9 | - jwt: !include _securitySchemes/jwt.raml
10 |
11 | traits:
12 | - protected: !include _traits/protected.raml
13 | - rateLimited: !include _traits/rate-limited.raml
14 |
15 | /files: !include files/files.raml
16 | /authenticate: !include auth/auth.raml
17 |
--------------------------------------------------------------------------------
/doc/text-logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vpdb/server/c790f6ff0f6572edc6ccfcb1cf8f853db2829c80/doc/text-logo.png
--------------------------------------------------------------------------------
/renovate.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": [
3 | "config:base",
4 | ":semanticCommits",
5 | ":semanticCommitTypeAll(chore)",
6 | "schedule:earlyMondays"
7 | ]
8 | }
9 |
--------------------------------------------------------------------------------
/src/app/backglasses/version/backglass.version.d.ts:
--------------------------------------------------------------------------------
1 | /*
2 | * VPDB - Virtual Pinball Database
3 | * Copyright (C) 2019 freezy
4 | *
5 | * This program is free software; you can redistribute it and/or
6 | * modify it under the terms of the GNU General Public License
7 | * as published by the Free Software Foundation; either version 2
8 | * of the License, or (at your option) any later version.
9 | *
10 | * This program is distributed in the hope that it will be useful,
11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 | * GNU General Public License for more details.
14 | *
15 | * You should have received a copy of the GNU General Public License
16 | * along with this program; if not, write to the Free Software
17 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
18 | */
19 |
20 | import { ModeratedDocument, PrettyIdDocument, Types } from 'mongoose';
21 | import { FileDocument } from '../../files/file.document';
22 |
23 | export interface BackglassVersion extends ModeratedDocument, PrettyIdDocument {
24 | version: string;
25 | changes: string;
26 | _file: FileDocument | Types.ObjectId;
27 | released_at: Date;
28 | counter: {
29 | downloads: number;
30 | };
31 |
32 | // serialized
33 | file: FileDocument;
34 | }
35 |
--------------------------------------------------------------------------------
/src/app/common/api.router.ts:
--------------------------------------------------------------------------------
1 | /*
2 | * VPDB - Virtual Pinball Database
3 | * Copyright (C) 2019 freezy
4 | *
5 | * This program is free software; you can redistribute it and/or
6 | * modify it under the terms of the GNU General Public License
7 | * as published by the Free Software Foundation; either version 2
8 | * of the License, or (at your option) any later version.
9 | *
10 | * This program is distributed in the hope that it will be useful,
11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 | * GNU General Public License for more details.
14 | *
15 | * You should have received a copy of the GNU General Public License
16 | * along with this program; if not, write to the Free Software
17 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
18 | */
19 |
20 | import * as Router from 'koa-router';
21 |
22 | export interface ApiRouter {
23 |
24 | getRouter(): Router;
25 | setupCache?(): void;
26 | }
27 |
--------------------------------------------------------------------------------
/src/app/common/email-templates/backglass-approved.handlebars:
--------------------------------------------------------------------------------
1 | Hi {{{ user.name }}},
2 |
3 | Your backglass for {{{ game.title }}} has been approved!
4 |
5 | You should see it now listed under the game's Direct B2S backglasses here:
6 |
7 | {{{ gameUrl }}}
8 |
9 | {{#if message}}Additionally, the moderator who approved this backglass left you a message:
10 |
11 | {{{message}}}
12 |
13 | {{/if}}
14 |
15 | Have a nice day,
16 |
17 | -The VPDB Server.
18 |
--------------------------------------------------------------------------------
/src/app/common/email-templates/backglass-refused.handlebars:
--------------------------------------------------------------------------------
1 | Hi {{{ user.name }}},
2 |
3 | Our apologies but there seems to be something wrong with the backglass for {{{ game.title }}} you've uploaded to VPDB.
4 |
5 | The moderator provided the following reason:
6 |
7 | {{{ message }}}
8 |
9 | If you disagree with this decision, feel free to reply to this email and we'll have another look.
10 |
11 | Best regards,
12 |
13 | -The VPDB Server.
14 |
--------------------------------------------------------------------------------
/src/app/common/email-templates/backglass-submitted.handlebars:
--------------------------------------------------------------------------------
1 | Hi {{{ user.name }}},
2 |
3 | Thanks for uploading your backglass to VPDB! We'll just do some checks and let you know as soon as your work is published.
4 |
5 | Have a nice day,
6 |
7 | -The VPDB Server.
8 |
--------------------------------------------------------------------------------
/src/app/common/email-templates/email-update-confirmation.handlebars:
--------------------------------------------------------------------------------
1 | Hi {{{ user.name }}},
2 |
3 | Looks like you were changing your email address at VPDB. Please let us know that the address was correct by pasting this link into your browser:
4 |
5 | {{{ confirmationUrl }}}
6 |
7 | Once you have done that, you’ll get all email to this new address.
8 |
9 | Have a nice day!
10 |
11 | -The VPDB Server.
12 |
13 | --
14 | This email was sent to {{{ recipient }}}. If it wasn’t you who registered at {{{ site }}}, please accept our apologies and discard this message.
--------------------------------------------------------------------------------
/src/app/common/email-templates/game-request-denied.handlebars:
--------------------------------------------------------------------------------
1 | Hi {{{ user.name }}},
2 |
3 | You recently requested the game "{{{ gameTitle }}}" to be added to VPDB.
4 |
5 | Unfortunately there seems to be something wrong with your request and we won't be adding the game with that particular IPDB number.
6 |
7 | The moderator provided the following reason:
8 |
9 | {{{ message }}}
10 |
11 | We hope that clears it up. If not, feel free to reply to this mail.
12 |
13 | Have a nice day,
14 |
15 | -The VPDB Server.
16 |
--------------------------------------------------------------------------------
/src/app/common/email-templates/game-request-processed.handlebars:
--------------------------------------------------------------------------------
1 | Hi {{{ user.name }}},
2 |
3 | You recently requested the game "{{{ game.title }}}" to be added to VPDB.
4 |
5 | Well, we've done it and you can check it out here:
6 |
7 | {{{ url }}}
8 |
9 | Looking forward to see what you've might been cooking up about this game!
10 |
11 | Have a nice day,
12 |
13 | -The VPDB Server.
14 |
--------------------------------------------------------------------------------
/src/app/common/email-templates/moderator-backglass-auto-approved.handlebars:
--------------------------------------------------------------------------------
1 | Hi {{{ moderator.name }}},
2 |
3 | Contributor {{{ user.name }}} has published a new backglass for {{{ game.title }}}. Check it out here:
4 |
5 | {{{ url }}}
6 |
7 | Cheers,
8 |
9 | -The VPDB Server.
10 |
--------------------------------------------------------------------------------
/src/app/common/email-templates/moderator-backglass-submitted.handlebars:
--------------------------------------------------------------------------------
1 | Hi {{{ moderator.name }}},
2 |
3 | User {{{ user.name }}} has uploaded a new backglass for {{{ game.title }}} that needs to be approved. You can do that here:
4 |
5 | {{{ uploadsUrl }}}
6 |
7 | Cheers,
8 |
9 | -The VPDB Server.
10 |
--------------------------------------------------------------------------------
/src/app/common/email-templates/moderator-release-auto-approved.handlebars:
--------------------------------------------------------------------------------
1 | Hi {{{ moderator.name }}},
2 |
3 | Contributor {{{ user.name }}} has published a new release called "{{{ release.name }}}" for {{{ game.title }}}. Here's the URL:
4 |
5 | {{{ url }}}
6 |
7 | Cheers,
8 |
9 | -The VPDB Server.
10 |
--------------------------------------------------------------------------------
/src/app/common/email-templates/moderator-release-submitted.handlebars:
--------------------------------------------------------------------------------
1 | Hi {{{ moderator.name }}},
2 |
3 | User {{{ user.name }}} has uploaded a new release called "{{{ release.name }}}" for {{{ game.title }}}. Details can be found here:
4 |
5 | {{{ previewUrl }}}
6 |
7 | As a moderator you can discuss the release with the author before approving.
8 |
9 | Cheers,
10 |
11 | -The VPDB Server.
12 |
--------------------------------------------------------------------------------
/src/app/common/email-templates/password-reset-request.handlebars:
--------------------------------------------------------------------------------
1 | Hi {{{ user.name }}},
2 |
3 | Someone, probably you, requested to reset your password at VPDB. You can do that by clicking on the link below.
4 |
5 | {{{ confirmationUrl }}}
6 |
7 | If it wasn’t you, you can ignore this email.
8 |
9 | Have a nice day!
10 |
11 | -The VPDB Server.
12 |
--------------------------------------------------------------------------------
/src/app/common/email-templates/password-reset-success.handlebars:
--------------------------------------------------------------------------------
1 | Hi {{{ user.name }}},
2 |
3 | Just writing you to let you know that your password at VPDB has been successfully reset.
4 |
5 | Cheers!
6 |
7 | -The VPDB Server.
8 |
--------------------------------------------------------------------------------
/src/app/common/email-templates/registration-confirmation.handlebars:
--------------------------------------------------------------------------------
1 | Hi {{{ user.name }}},
2 |
3 | Welcome and thanks for joining VPDB!
4 |
5 | To finish signing up, you need to confirm that we got your email right.
6 |
7 | In order to do so, please paste this link into your browser:
8 |
9 | {{{ confirmationUrl }}}
10 |
11 | You should then be able to login and get some pinball games!
12 |
13 | Have a nice day,
14 |
15 | -The VPDB Server.
16 |
17 | --
18 | This email was sent to {{{ recipient }}}. If it wasn’t you who registered at {{{ site }}}, please accept our apologies and discard this message.
--------------------------------------------------------------------------------
/src/app/common/email-templates/release-approved.handlebars:
--------------------------------------------------------------------------------
1 | Hi {{{ user.name }}},
2 |
3 | Your {{{ release.name }}} for {{{ game.title }}} has been approved!
4 |
5 | You can check your release in full glory here:
6 |
7 | {{{ url }}}
8 |
9 | {{#if message}}Additionally, the moderator who approved this release left you a message:
10 |
11 | {{{message}}}
12 |
13 | {{/if}}At any time, you can update the metadata or add new versions or flavors to your release by using the "author zone" in the right column.
14 |
15 | By the way, adding new versions or flavors doesn't need any further approval, so your changes will be online in no time!
16 |
17 | Have a nice day,
18 |
19 | -The VPDB Server.
20 |
--------------------------------------------------------------------------------
/src/app/common/email-templates/release-author-new-file.handlebars:
--------------------------------------------------------------------------------
1 | Hi {{{ user.name }}},
2 |
3 | User {{ uploader.name }} just uploaded "{{ file.name }}" for version {{ version.version }} of {{ release.name }} for {{ game.title }}.
4 |
5 | For more details, check it out here:
6 |
7 | {{{ url }}}
8 |
9 | Have a great day!
10 |
11 | -The VPDB Server.
12 |
--------------------------------------------------------------------------------
/src/app/common/email-templates/release-author-new-release.handlebars:
--------------------------------------------------------------------------------
1 | Hi {{{ user.name }}},
2 |
3 | User {{ uploader.name }} just uploaded a new release of {{ game.title }} and put you as {{ authorType }}.
4 |
5 | You can check it out here:
6 |
7 | {{{ url }}}
8 |
9 | As {{ authorType }} you can participate in the private moderator discussion, edit release details and add new versions to the release.
10 |
11 | A big thank you from the VPDB team for your contribution!
12 |
13 | Have a nice day,
14 |
15 | -The VPDB Server.
16 |
--------------------------------------------------------------------------------
/src/app/common/email-templates/release-author-new-version.handlebars:
--------------------------------------------------------------------------------
1 | Hi {{{ user.name }}},
2 |
3 | User {{ uploader.name }} just uploaded a new version {{ version.version }} of {{ release.name }} for {{ game.title }}. Changes are:
4 |
5 | {{{ changes }}}
6 |
7 | For more details, check it out here:
8 |
9 | {{{ url }}}
10 |
11 | Have a great day!
12 |
13 | -The VPDB Server.
14 |
--------------------------------------------------------------------------------
/src/app/common/email-templates/release-commented.handlebars:
--------------------------------------------------------------------------------
1 | Hi {{{ user.name }}},
2 |
3 | User {{{ commentor.name }}} has just commented on your "{{{ release.name }}}" of {{{ game.title }}}:
4 |
5 | {{{message}}}
6 |
7 | You can read the whole thread on the release details page here:
8 |
9 | {{{ url }}}
10 |
11 | Have a nice day,
12 |
13 | -The VPDB Server.
14 |
15 | --
16 | If you don't want to be notified about comments on your releases, go to your profile page and uncheck "comments on my uploaded releases": {{{ profileUrl }}}
--------------------------------------------------------------------------------
/src/app/common/email-templates/release-moderation-commented.handlebars:
--------------------------------------------------------------------------------
1 | Hi {{{ user.name }}},
2 |
3 | {{ who }} {{{ commentor.name }}} has just commented on {{{ what }}} "{{{ release.name }}}" of {{{ game.title }}}:
4 |
5 | {{{message}}}
6 |
7 | You can reply directly on the release details page here:
8 |
9 | {{{ url }}}
10 |
11 | Have a nice day,
12 |
13 | -The VPDB Server.
14 |
--------------------------------------------------------------------------------
/src/app/common/email-templates/release-refused.handlebars:
--------------------------------------------------------------------------------
1 | Hi {{{ user.name }}},
2 |
3 | Our apologies but there seems to be something wrong with the {{{ release.name }}} for {{{ game.title }}} you've uploaded to VPDB.
4 |
5 | The moderator provided the following reason:
6 |
7 | {{{ message }}}
8 |
9 | If you disagree with this decision, feel free to reply to this email and we'll have another look.
10 |
11 | Best regards,
12 |
13 | -The VPDB Server.
14 |
--------------------------------------------------------------------------------
/src/app/common/email-templates/release-submitted.handlebars:
--------------------------------------------------------------------------------
1 | Hi {{{ user.name }}},
2 |
3 | Thanks for uploading your release to VPDB, we're thrilled to see what you've come up with! We'll just do some checks and let you know as soon as possible when your work is published.
4 |
5 | In the meantime, you can preview your release here:
6 |
7 | {{{ previewUrl }}}
8 |
9 | If you see anything you'd like to change, just click the edit link in the author zone box on your right.
10 |
11 | Have a nice day,
12 |
13 | -The VPDB Server.
14 |
--------------------------------------------------------------------------------
/src/app/common/email-templates/user-merged-deleted.handlebars:
--------------------------------------------------------------------------------
1 | Hi {{{ user.name }}},
2 |
3 | Just letting you know that {{{ userDeleted.name }}} with email <{{{ userDeleted.email}}}> has been deleted and merged into your account.
4 |
5 | {{{message}}}
6 |
7 | All references have been updated and credits you might have had transferred.
8 |
9 | Have a nice day,
10 |
11 | -The VPDB Server.
12 |
--------------------------------------------------------------------------------
/src/app/common/email-templates/user-merged-kept.handlebars:
--------------------------------------------------------------------------------
1 | Hi {{{ user.name }}},
2 |
3 | Just letting you know that your account has been deleted and merged into {{{ userKept.name }}}'s with email <{{{ userKept.email}}}>.
4 |
5 | {{{message}}}
6 |
7 | If this was an error, reply to this mail and we'll sort it out!
8 |
9 | Have a nice day,
10 |
11 | -The VPDB Server.
12 |
--------------------------------------------------------------------------------
/src/app/common/email-templates/validation-release-broken.handlebars:
--------------------------------------------------------------------------------
1 | Hi {{{ user.name }}},
2 |
3 | Your upload {{{ file.name }}} for {{{ game.title }}} has been checked by moderator {{ moderator.name }}.
4 |
5 | Unfortunately, {{ moderator.name }} couldn't get your file to play and therefore had to mark it as broken. Here are more details:
6 |
7 | {{{ message }}}
8 |
9 | If you think that we're missing something, please let us know in the moderation panel here:
10 |
11 | {{{ url }}}
12 |
13 | As soon as you upload a fix we'll re-validate it so everybody will know about the fixed version.
14 |
15 | Have a great day,
16 |
17 | -The VPDB Server.
18 |
--------------------------------------------------------------------------------
/src/app/common/email-templates/validation-release-playable.handlebars:
--------------------------------------------------------------------------------
1 | Hi {{{ user.name }}},
2 |
3 | Your upload {{{ file.name }}} for {{{ game.title }}} has been validated.
4 |
5 | That means that moderator {{ moderator.name }} downloaded your release, played and examinated it. Good news is that there weren't any major problems.
6 |
7 | However, here are a few suggestions on how to make your release even better:
8 |
9 | {{{ message }}}
10 |
11 | If you have any questions, you can always let us know through the moderation panel of your release:
12 |
13 | {{{ url }}}
14 |
15 | Have a great day,
16 |
17 | -The VPDB Server.
18 |
--------------------------------------------------------------------------------
/src/app/common/email-templates/validation-release-verified.handlebars:
--------------------------------------------------------------------------------
1 | Hi {{{ user.name }}},
2 |
3 | Good news, your file {{{ file.name }}} for {{{ game.title }}} has been validated.
4 |
5 | That means that moderator {{ moderator.name }} downloaded your release, played and examinated it, and was fully happy with it!
6 |
7 | Here are the comments:
8 |
9 | {{{ message }}}
10 |
11 | As always you can privately message the mods through the moderation panel:
12 |
13 | {{{ url }}}
14 |
15 | Have a great day,
16 |
17 | -The VPDB Server.
18 |
--------------------------------------------------------------------------------
/src/app/common/email-templates/welcome-local.handlebars:
--------------------------------------------------------------------------------
1 | Hi {{{ user.name }}},
2 |
3 | Welcome to the VPDB community!
4 |
5 | We hope you'll have a blast browsing the site. As a member you now have access to all our content and you can participate in our community.
6 |
7 | Note that we're still in beta, so there might be some bugs or glitches. If you encounter any, it would be great to let us know in the forum or by replying to this email.
8 |
9 | Cheers,
10 |
11 | -The VPDB Server.
--------------------------------------------------------------------------------
/src/app/common/email-templates/welcome-oauth.handlebars:
--------------------------------------------------------------------------------
1 | Hi {{{ user.name }}},
2 |
3 | Welcome to the VPDB community!
4 |
5 | We hope you'll have a blast browsing the site. As a member you now have access to all our content and you can participate in our community.
6 |
7 | Note that we're still in beta, so there might be some bugs or glitches. If you encounter any, it would be great to let us know in the forum or by replying to this email.
8 |
9 | By the way, your display name is "{{{ user.name }}}". You can change it any time here:
10 |
11 | {{{ profileUrl }}}
12 |
13 | There you can also create local credentials so if your account at {{ strategy }} gets deactivated for some reason, you can still log on to VPDB.
14 |
15 | Cheers,
16 |
17 | -The VPDB Server.
--------------------------------------------------------------------------------
/src/app/files/metadata/index.ts:
--------------------------------------------------------------------------------
1 | /*
2 | * VPDB - Virtual Pinball Database
3 | * Copyright (C) 2019 freezy
4 | *
5 | * This program is free software; you can redistribute it and/or
6 | * modify it under the terms of the GNU General Public License
7 | * as published by the Free Software Foundation; either version 2
8 | * of the License, or (at your option) any later version.
9 | *
10 | * This program is distributed in the hope that it will be useful,
11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 | * GNU General Public License for more details.
14 | *
15 | * You should have received a copy of the GNU General Public License
16 | * along with this program; if not, write to the Free Software
17 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
18 | */
19 |
20 | import { ArchiveMetadata } from './archive.metadata';
21 | import { Directb2sMetadata } from './directb2s.metadata';
22 | import { ImageMetadata } from './image.metadata';
23 | import { Metadata } from './metadata';
24 | import { VideoMetadata } from './video.metadata';
25 | import { VptMetadata } from './vpt.metadata';
26 |
27 | export const instances: Metadata[] = [
28 | new ArchiveMetadata(),
29 | new Directb2sMetadata(),
30 | new ImageMetadata(),
31 | new VideoMetadata(),
32 | new VptMetadata(),
33 | ];
34 |
--------------------------------------------------------------------------------
/src/app/log-event/log.event.api.router.ts:
--------------------------------------------------------------------------------
1 | /*
2 | * VPDB - Virtual Pinball Database
3 | * Copyright (C) 2019 freezy
4 | *
5 | * This program is free software; you can redistribute it and/or
6 | * modify it under the terms of the GNU General Public License
7 | * as published by the Free Software Foundation; either version 2
8 | * of the License, or (at your option) any later version.
9 | *
10 | * This program is distributed in the hope that it will be useful,
11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 | * GNU General Public License for more details.
14 | *
15 | * You should have received a copy of the GNU General Public License
16 | * along with this program; if not, write to the Free Software
17 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
18 | */
19 |
20 | import * as Router from 'koa-router';
21 | import { ApiRouter } from '../common/api.router';
22 | import { LogEventApi } from './log.event.api';
23 |
24 | export class LogEventApiRouter implements ApiRouter {
25 |
26 | private readonly router: Router;
27 |
28 | constructor() {
29 | const api = new LogEventApi();
30 | this.router = api.apiRouter();
31 |
32 | this.router.get('/v1/events', api.list().bind(api));
33 | }
34 |
35 | public getRouter(): Router {
36 | return this.router;
37 | }
38 | }
39 |
--------------------------------------------------------------------------------
/src/app/log-user/log.user.document.d.ts:
--------------------------------------------------------------------------------
1 | /*
2 | * VPDB - Virtual Pinball Database
3 | * Copyright (C) 2019 freezy
4 | *
5 | * This program is free software; you can redistribute it and/or
6 | * modify it under the terms of the GNU General Public License
7 | * as published by the Free Software Foundation; either version 2
8 | * of the License, or (at your option) any later version.
9 | *
10 | * This program is distributed in the hope that it will be useful,
11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 | * GNU General Public License for more details.
14 | *
15 | * You should have received a copy of the GNU General Public License
16 | * along with this program; if not, write to the Free Software
17 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
18 | */
19 |
20 | import { Document, Types } from 'mongoose';
21 | import { UserDocument } from '../users/user.document';
22 |
23 | export interface LogUserDocument extends Document {
24 | _user: UserDocument | Types.ObjectId;
25 | _actor: UserDocument | Types.ObjectId;
26 | event: string;
27 | payload: { [key: string]: any };
28 | result: 'success' | 'failure';
29 | message: string;
30 | request_id: string;
31 | ip: string;
32 | logged_at: Date;
33 |
34 | // populated
35 | user: UserDocument;
36 | actor: UserDocument;
37 | }
38 |
--------------------------------------------------------------------------------
/src/app/misc/index.ts:
--------------------------------------------------------------------------------
1 | /*
2 | * VPDB - Virtual Pinball Database
3 | * Copyright (C) 2019 freezy
4 | *
5 | * This program is free software; you can redistribute it and/or
6 | * modify it under the terms of the GNU General Public License
7 | * as published by the Free Software Foundation; either version 2
8 | * of the License, or (at your option) any later version.
9 | *
10 | * This program is distributed in the hope that it will be useful,
11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 | * GNU General Public License for more details.
14 | *
15 | * You should have received a copy of the GNU General Public License
16 | * along with this program; if not, write to the Free Software
17 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
18 | */
19 |
20 | import { EndPoint } from '../common/api.endpoint';
21 | import { ApiRouter } from '../common/api.router';
22 | import { MiscApiRouter } from './misc.api.router';
23 |
24 | export class MiscEndPoint extends EndPoint {
25 |
26 | public readonly name: string = 'Misc API';
27 | private readonly router = new MiscApiRouter();
28 |
29 | public getRouter(): ApiRouter {
30 | return this.router;
31 | }
32 | }
33 |
--------------------------------------------------------------------------------
/src/app/profile/index.ts:
--------------------------------------------------------------------------------
1 | /*
2 | * VPDB - Virtual Pinball Database
3 | * Copyright (C) 2019 freezy
4 | *
5 | * This program is free software; you can redistribute it and/or
6 | * modify it under the terms of the GNU General Public License
7 | * as published by the Free Software Foundation; either version 2
8 | * of the License, or (at your option) any later version.
9 | *
10 | * This program is distributed in the hope that it will be useful,
11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 | * GNU General Public License for more details.
14 | *
15 | * You should have received a copy of the GNU General Public License
16 | * along with this program; if not, write to the Free Software
17 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
18 | */
19 |
20 | import { EndPoint } from '../common/api.endpoint';
21 | import { ApiRouter } from '../common/api.router';
22 | import { ProfileApiRouter } from './profile.api.router';
23 |
24 | export class ProfileEndPoint extends EndPoint {
25 |
26 | public readonly name: string = 'User Profile API';
27 | private readonly router = new ProfileApiRouter();
28 |
29 | public getRouter(): ApiRouter {
30 | return this.router;
31 | }
32 | }
33 |
--------------------------------------------------------------------------------
/src/app/tags/initial-data/tags.ts:
--------------------------------------------------------------------------------
1 | /*
2 | * VPDB - Virtual Pinball Database
3 | * Copyright (C) 2019 freezy
4 | *
5 | * This program is free software; you can redistribute it and/or
6 | * modify it under the terms of the GNU General Public License
7 | * as published by the Free Software Foundation; either version 2
8 | * of the License, or (at your option) any later version.
9 | *
10 | * This program is distributed in the hope that it will be useful,
11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 | * GNU General Public License for more details.
14 | *
15 | * You should have received a copy of the GNU General Public License
16 | * along with this program; if not, write to the Free Software
17 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
18 | */
19 |
20 | export const initialTags = [
21 | { _id: 'dof', name: 'DOF', description: 'Support for Direct Output Framework.', is_active: true },
22 | { _id: 'hd', name: 'HD', description: 'All textures render crispy at Full HD resolution.', is_active: true },
23 | { _id: '3d', name: '3D', description: 'Table is modeled entirely in 3D (no 2D sprites are used).', is_active: true },
24 | { _id: 'wip', name: 'WIP', description: 'Work in Progress. This release is still unfinished and can contain bugs.', is_active: true },
25 | ];
26 |
--------------------------------------------------------------------------------
/src/app/tags/tag.document.d.ts:
--------------------------------------------------------------------------------
1 | /*
2 | * VPDB - Virtual Pinball Database
3 | * Copyright (C) 2019 freezy
4 | *
5 | * This program is free software; you can redistribute it and/or
6 | * modify it under the terms of the GNU General Public License
7 | * as published by the Free Software Foundation; either version 2
8 | * of the License, or (at your option) any later version.
9 | *
10 | * This program is distributed in the hope that it will be useful,
11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 | * GNU General Public License for more details.
14 | *
15 | * You should have received a copy of the GNU General Public License
16 | * along with this program; if not, write to the Free Software
17 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
18 | */
19 |
20 | import { Document, Types } from 'mongoose';
21 | import { UserDocument } from '../users/user.document';
22 |
23 | export interface TagDocument extends Document {
24 | // model
25 | _id: string;
26 | name: string;
27 | description: string;
28 | is_active: boolean;
29 | created_at: Date;
30 | _created_by?: UserDocument | Types.ObjectId;
31 |
32 | // serialized
33 | created_by?: UserDocument;
34 | }
35 |
--------------------------------------------------------------------------------
/src/app/users/authored-entity.d.ts:
--------------------------------------------------------------------------------
1 | /*
2 | * VPDB - Virtual Pinball Database
3 | * Copyright (C) 2019 freezy
4 | *
5 | * This program is free software; you can redistribute it and/or
6 | * modify it under the terms of the GNU General Public License
7 | * as published by the Free Software Foundation; either version 2
8 | * of the License, or (at your option) any later version.
9 | *
10 | * This program is distributed in the hope that it will be useful,
11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 | * GNU General Public License for more details.
14 | *
15 | * You should have received a copy of the GNU General Public License
16 | * along with this program; if not, write to the Free Software
17 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
18 | */
19 |
20 | import { Types } from 'mongoose';
21 | import { ContentAuthor } from './content.author';
22 | import { UserDocument } from './user.document';
23 |
24 | export interface AuthoredEntity {
25 | authors: ContentAuthor[];
26 | _created_by: UserDocument | Types.ObjectId;
27 | }
28 |
--------------------------------------------------------------------------------
/src/app/users/content.author.d.ts:
--------------------------------------------------------------------------------
1 | /*
2 | * VPDB - Virtual Pinball Database
3 | * Copyright (C) 2019 freezy
4 | *
5 | * This program is free software; you can redistribute it and/or
6 | * modify it under the terms of the GNU General Public License
7 | * as published by the Free Software Foundation; either version 2
8 | * of the License, or (at your option) any later version.
9 | *
10 | * This program is distributed in the hope that it will be useful,
11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 | * GNU General Public License for more details.
14 | *
15 | * You should have received a copy of the GNU General Public License
16 | * along with this program; if not, write to the Free Software
17 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
18 | */
19 |
20 | import { Document, Types } from 'mongoose';
21 | import { UserDocument } from './user.document';
22 |
23 | export interface ContentAuthor extends Document {
24 | /**
25 | * User from database, full object if populated or `ObjectId` otherwise.
26 | */
27 | _user?: UserDocument | Types.ObjectId;
28 | /**
29 | * Roles the user had during the development of the content.
30 | */
31 | roles: string[];
32 | /**
33 | * Serialized user
34 | */
35 | user?: UserDocument;
36 | }
37 |
--------------------------------------------------------------------------------
/src/app/users/content.author.schema.ts:
--------------------------------------------------------------------------------
1 | /*
2 | * VPDB - Virtual Pinball Database
3 | * Copyright (C) 2019 freezy
4 | *
5 | * This program is free software; you can redistribute it and/or
6 | * modify it under the terms of the GNU General Public License
7 | * as published by the Free Software Foundation; either version 2
8 | * of the License, or (at your option) any later version.
9 | *
10 | * This program is distributed in the hope that it will be useful,
11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 | * GNU General Public License for more details.
14 | *
15 | * You should have received a copy of the GNU General Public License
16 | * along with this program; if not, write to the Free Software
17 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
18 | */
19 |
20 | import { Schema } from 'mongoose';
21 |
22 | export const authorSchema = new Schema({
23 | _user: { type: Schema.Types.ObjectId, required: 'Reference to user must be provided.', ref: 'User' },
24 | roles: [ String ],
25 | }, { toObject: { virtuals: true, versionKey: false } });
26 |
--------------------------------------------------------------------------------
/src/app/users/user.doc.type.raml:
--------------------------------------------------------------------------------
1 | #%RAML 1.0 DataType
2 |
3 | type: object
4 | properties:
5 | id:
6 | type: string
7 | description: The user ID
8 | required: true
--------------------------------------------------------------------------------
/src/scripts/clear-cache.ts:
--------------------------------------------------------------------------------
1 | /*
2 | * VPDB - Virtual Pinball Database
3 | * Copyright (C) 2019 freezy
4 | *
5 | * This program is free software; you can redistribute it and/or
6 | * modify it under the terms of the GNU General Public License
7 | * as published by the Free Software Foundation; either version 2
8 | * of the License, or (at your option) any later version.
9 | *
10 | * This program is distributed in the hope that it will be useful,
11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 | * GNU General Public License for more details.
14 | *
15 | * You should have received a copy of the GNU General Public License
16 | * along with this program; if not, write to the Free Software
17 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
18 | */
19 |
20 | import { apiCache } from '../app/common/api.cache';
21 | import { logger } from '../app/common/logger';
22 |
23 | (async () => {
24 |
25 | logger.info(null, 'Clearing all API caches...');
26 |
27 | // clear all caches
28 | await apiCache.invalidateAll();
29 |
30 | logger.info(null, 'Done!');
31 |
32 | })();
33 |
--------------------------------------------------------------------------------
/src/scripts/migrations/18-25b2974-clear-cache.ts:
--------------------------------------------------------------------------------
1 | /*
2 | * VPDB - Virtual Pinball Database
3 | * Copyright (C) 2019 freezy
4 | *
5 | * This program is free software; you can redistribute it and/or
6 | * modify it under the terms of the GNU General Public License
7 | * as published by the Free Software Foundation; either version 2
8 | * of the License, or (at your option) any later version.
9 | *
10 | * This program is distributed in the hope that it will be useful,
11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 | * GNU General Public License for more details.
14 | *
15 | * You should have received a copy of the GNU General Public License
16 | * along with this program; if not, write to the Free Software
17 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
18 | */
19 |
20 | import { apiCache } from '../../app/common/api.cache';
21 | import { logger } from '../../app/common/logger';
22 |
23 | /**
24 | * Clears the entire API cache.
25 | */
26 | export async function up() {
27 |
28 | // clear all caches
29 | await apiCache.invalidateAll();
30 | logger.info(null, '[migrate-18] Cache invalidated.');
31 | }
32 |
--------------------------------------------------------------------------------
/src/scripts/migrations/19-cc60cb7-clear-cache.ts:
--------------------------------------------------------------------------------
1 | /*
2 | * VPDB - Virtual Pinball Database
3 | * Copyright (C) 2019 freezy
4 | *
5 | * This program is free software; you can redistribute it and/or
6 | * modify it under the terms of the GNU General Public License
7 | * as published by the Free Software Foundation; either version 2
8 | * of the License, or (at your option) any later version.
9 | *
10 | * This program is distributed in the hope that it will be useful,
11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 | * GNU General Public License for more details.
14 | *
15 | * You should have received a copy of the GNU General Public License
16 | * along with this program; if not, write to the Free Software
17 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
18 | */
19 |
20 | import { apiCache } from '../../app/common/api.cache';
21 | import { logger } from '../../app/common/logger';
22 |
23 | /**
24 | * Clears the entire API cache.
25 | */
26 | export async function up() {
27 |
28 | // clear all caches
29 | await apiCache.invalidateAll();
30 | logger.info(null, '[migrate-19] Cache invalidated.');
31 | }
32 |
--------------------------------------------------------------------------------
/src/scripts/tslint.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "../tslint.json",
3 | "rules": {
4 | "no-console": false
5 | }
6 | }
--------------------------------------------------------------------------------
/src/scripts/validate-settings.ts:
--------------------------------------------------------------------------------
1 | /*
2 | * VPDB - Virtual Pinball Database
3 | * Copyright (C) 2019 freezy
4 | *
5 | * This program is free software; you can redistribute it and/or
6 | * modify it under the terms of the GNU General Public License
7 | * as published by the Free Software Foundation; either version 2
8 | * of the License, or (at your option) any later version.
9 | *
10 | * This program is distributed in the hope that it will be useful,
11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 | * GNU General Public License for more details.
14 | *
15 | * You should have received a copy of the GNU General Public License
16 | * along with this program; if not, write to the Free Software
17 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
18 | */
19 |
20 | import { logger } from '../app/common/logger';
21 | import { settings } from '../app/common/settings';
22 |
23 | const valid = settings.validate();
24 | if (!valid) {
25 | logger.error(null, '[settings] Validation failed!');
26 | }
27 | process.exit(valid ? 0 : 1);
28 |
--------------------------------------------------------------------------------
/src/test/fixtures/afm.avi:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vpdb/server/c790f6ff0f6572edc6ccfcb1cf8f853db2829c80/src/test/fixtures/afm.avi
--------------------------------------------------------------------------------
/src/test/fixtures/afm.f4v:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vpdb/server/c790f6ff0f6572edc6ccfcb1cf8f853db2829c80/src/test/fixtures/afm.f4v
--------------------------------------------------------------------------------
/src/test/fixtures/backglass.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vpdb/server/c790f6ff0f6572edc6ccfcb1cf8f853db2829c80/src/test/fixtures/backglass.png
--------------------------------------------------------------------------------
/src/test/fixtures/dmd.rar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vpdb/server/c790f6ff0f6572edc6ccfcb1cf8f853db2829c80/src/test/fixtures/dmd.rar
--------------------------------------------------------------------------------
/src/test/fixtures/dmd.zip:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vpdb/server/c790f6ff0f6572edc6ccfcb1cf8f853db2829c80/src/test/fixtures/dmd.zip
--------------------------------------------------------------------------------
/src/test/fixtures/empty.vpt:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vpdb/server/c790f6ff0f6572edc6ccfcb1cf8f853db2829c80/src/test/fixtures/empty.vpt
--------------------------------------------------------------------------------
/src/test/fixtures/hulk.zip:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vpdb/server/c790f6ff0f6572edc6ccfcb1cf8f853db2829c80/src/test/fixtures/hulk.zip
--------------------------------------------------------------------------------
/src/test/fixtures/release.asset.folder.rar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vpdb/server/c790f6ff0f6572edc6ccfcb1cf8f853db2829c80/src/test/fixtures/release.asset.folder.rar
--------------------------------------------------------------------------------
/src/test/fixtures/release.asset.folder.zip:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vpdb/server/c790f6ff0f6572edc6ccfcb1cf8f853db2829c80/src/test/fixtures/release.asset.folder.zip
--------------------------------------------------------------------------------
/src/test/fixtures/release.asset.root.rar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vpdb/server/c790f6ff0f6572edc6ccfcb1cf8f853db2829c80/src/test/fixtures/release.asset.root.rar
--------------------------------------------------------------------------------
/src/test/fixtures/release.asset.root.zip:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vpdb/server/c790f6ff0f6572edc6ccfcb1cf8f853db2829c80/src/test/fixtures/release.asset.root.zip
--------------------------------------------------------------------------------
/src/test/fixtures/small_100x100.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vpdb/server/c790f6ff0f6572edc6ccfcb1cf8f853db2829c80/src/test/fixtures/small_100x100.png
--------------------------------------------------------------------------------
/src/test/fixtures/table-bumper.vpx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vpdb/server/c790f6ff0f6572edc6ccfcb1cf8f853db2829c80/src/test/fixtures/table-bumper.vpx
--------------------------------------------------------------------------------
/src/test/fixtures/table-empty.vpx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vpdb/server/c790f6ff0f6572edc6ccfcb1cf8f853db2829c80/src/test/fixtures/table-empty.vpx
--------------------------------------------------------------------------------
/src/test/fixtures/table-flipper.vpx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vpdb/server/c790f6ff0f6572edc6ccfcb1cf8f853db2829c80/src/test/fixtures/table-flipper.vpx
--------------------------------------------------------------------------------
/src/test/fixtures/table-gate.vpx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vpdb/server/c790f6ff0f6572edc6ccfcb1cf8f853db2829c80/src/test/fixtures/table-gate.vpx
--------------------------------------------------------------------------------
/src/test/fixtures/table-hit-target.vpx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vpdb/server/c790f6ff0f6572edc6ccfcb1cf8f853db2829c80/src/test/fixtures/table-hit-target.vpx
--------------------------------------------------------------------------------
/src/test/fixtures/table-kicker.vpx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vpdb/server/c790f6ff0f6572edc6ccfcb1cf8f853db2829c80/src/test/fixtures/table-kicker.vpx
--------------------------------------------------------------------------------
/src/test/fixtures/table-light.vpx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vpdb/server/c790f6ff0f6572edc6ccfcb1cf8f853db2829c80/src/test/fixtures/table-light.vpx
--------------------------------------------------------------------------------
/src/test/fixtures/table-primitive.vpx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vpdb/server/c790f6ff0f6572edc6ccfcb1cf8f853db2829c80/src/test/fixtures/table-primitive.vpx
--------------------------------------------------------------------------------
/src/test/fixtures/table-ramp-surface.vpx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vpdb/server/c790f6ff0f6572edc6ccfcb1cf8f853db2829c80/src/test/fixtures/table-ramp-surface.vpx
--------------------------------------------------------------------------------
/src/test/fixtures/table-ramp.vpx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vpdb/server/c790f6ff0f6572edc6ccfcb1cf8f853db2829c80/src/test/fixtures/table-ramp.vpx
--------------------------------------------------------------------------------
/src/test/fixtures/table-rubber.vpx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vpdb/server/c790f6ff0f6572edc6ccfcb1cf8f853db2829c80/src/test/fixtures/table-rubber.vpx
--------------------------------------------------------------------------------
/src/test/fixtures/table-sink.vpx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vpdb/server/c790f6ff0f6572edc6ccfcb1cf8f853db2829c80/src/test/fixtures/table-sink.vpx
--------------------------------------------------------------------------------
/src/test/fixtures/table-spinner.vpx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vpdb/server/c790f6ff0f6572edc6ccfcb1cf8f853db2829c80/src/test/fixtures/table-spinner.vpx
--------------------------------------------------------------------------------
/src/test/fixtures/table-surface.vpx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vpdb/server/c790f6ff0f6572edc6ccfcb1cf8f853db2829c80/src/test/fixtures/table-surface.vpx
--------------------------------------------------------------------------------
/src/test/fixtures/table-trigger.vpx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vpdb/server/c790f6ff0f6572edc6ccfcb1cf8f853db2829c80/src/test/fixtures/table-trigger.vpx
--------------------------------------------------------------------------------
/src/test/fixtures/table.vpt:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vpdb/server/c790f6ff0f6572edc6ccfcb1cf8f853db2829c80/src/test/fixtures/table.vpt
--------------------------------------------------------------------------------
/src/test/fixtures/test.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/vpdb/server/c790f6ff0f6572edc6ccfcb1cf8f853db2829c80/src/test/fixtures/test.mp3
--------------------------------------------------------------------------------
/src/test/legacy/auth-helper.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 |
3 | var fs = require('fs');
4 | var path = require('path');
5 | var expect = require('expect.js');
6 |
7 | exports.assertToken = function(request, done, noDoom) {
8 | var hlp = require('./helper');
9 | return function (err, res) {
10 | hlp.expectStatus(err, res, 200);
11 | expect(res.body.token).to.be.ok();
12 | if (!noDoom) {
13 | hlp.doomUser(res.body.user.id);
14 | }
15 | request.get('/api/v1/user').set('Authorization', 'Bearer ' + res.body.token).end(hlp.status(200, done));
16 | };
17 |
18 | };
--------------------------------------------------------------------------------
/src/tslint.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "tslint:recommended",
3 | "linterOptions": {
4 | "exclude": ["**/*.js"]
5 | },
6 | "rules": {
7 | "quotemark": [ true, "single", "avoid-escape" ],
8 | "indent": [ true, "tabs" ],
9 | "comment-format": false,
10 | "arrow-parens": false,
11 | "max-line-length": false,
12 | "object-literal-key-quotes": [ true, "as-needed" ],
13 | "no-var-requires": false,
14 | "object-literal-sort-keys": false,
15 | "no-object-literal-type-assertion": false,
16 | "interface-name": false,
17 | "max-classes-per-file": false,
18 | "member-ordering": false,
19 | "align": [true, "statements", "members"]
20 | }
21 | }
--------------------------------------------------------------------------------
/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "module": "commonjs",
4 | "esModuleInterop": true,
5 | "target": "es2017",
6 | "noImplicitAny": true,
7 | "moduleResolution": "node",
8 | "sourceMap": true,
9 | "baseUrl": ".",
10 | "allowJs": true,
11 | "outDir": "build",
12 | "paths": {
13 | "*": [ "typings/*" ]
14 | },
15 | "lib": [
16 | "dom",
17 | "es5",
18 | "es2015",
19 | "es2016.array.include",
20 | "esnext.asynciterable"
21 | ]
22 | },
23 | "include": [
24 | "src/**/*.ts"
25 | ],
26 | "exclude": [
27 | "node_modules"
28 | ]
29 | }
30 |
--------------------------------------------------------------------------------
/typings/mongoose/index.d.ts:
--------------------------------------------------------------------------------
1 |
2 | /*
3 | * VPDB - Virtual Pinball Database
4 | * Copyright (C) 2019 freezy
5 | *
6 | * This program is free software; you can redistribute it and/or
7 | * modify it under the terms of the GNU General Public License
8 | * as published by the Free Software Foundation; either version 2
9 | * of the License, or (at your option) any later version.
10 | *
11 | * This program is distributed in the hope that it will be useful,
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 | * GNU General Public License for more details.
15 | *
16 | * You should have received a copy of the GNU General Public License
17 | * along with this program; if not, write to the Free Software
18 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
19 | */
20 |
21 | declare module 'mongoose' {
22 | namespace Types {
23 | export interface ObjectId {
24 | _id: this;
25 | equals(id: ObjectId | string): boolean;
26 | }
27 | }
28 | }
--------------------------------------------------------------------------------