@moneypot/caas
v12.0.1
Published
(_caas_ = "controller as a server", a silly but hopefully memorable name.)
Downloads
716
Readme
@moneypot/caas
(caas = "controller as a server", a silly but hopefully memorable name.)
This library implements a controller server that manages users and balances across any number of Moneypot casinos.
You can use it to quickly create your own controller.
See https://github.com/moneypot/dice-controller/ for an example of how you can implement a dice game server by wrapping and extending @moneypot/caas
.
Install
$ npm install @moneypot/caas
Usage
import { defaultPlugins, ServerOptions, startAndListen } from "@moneypot/caas";
import path from "path";
const options: ServerOptions = {
// Name of the postgres schemas you're exposing to the GraphQL API (if any)
extraPgSchemas: ["app"],
plugins: [
...defaultPlugins,
// And any custom plugins you've written
],
// Where to save the GraphQL schema (derived from your database + plugins)
exportSchemaSDLPath: path.join(import.meta.dirname, "../schema.graphql"),
// Where your database migration files are located (if any)
userDatabaseMigrationsPath: path.join(import.meta.dirname, "../pg-versions"),
};
startAndListen(options, ({ port }) => {
console.log("Server is running on port", port);
});
Plugins
You can extend the GraphQL API with plugins.
@moneypot/caas
's comes with an array of defaultPlugins
that implements a few core GraphQL queries and mutations
that you probably want like caasAuthenticate()
. You'll notice that they're prefixed with caas
in the GraphQL API.
TODO: How to write a plugin
Migrations
To make it easier to keep your database in sync, @moneypot/caas
will autorun incremental migrations (.sql files) using
a simple library that expects consecutively numbered files in the given folder.
Example:
pg-versions
├── 001-schema.sql
├── 002-hashchain.sql
└── 003-dice.sql
TODO: How migrations work
Development
To work on the lib, there's a mini project in the ./demo
that uses @moneypot/caas
as a lib.
createdb caas_demo
Ensure this role exists:
CREATE ROLE app_postgraphile LOGIN PASSWORD 'pass';
Create .env
:
DATABASE_URL="postgres://app_postgraphile:pass@localhost/caas_demo"
SUPERUSER_DATABASE_URL="postgres://app_superuser:pass@localhost/caas_demo"
GRAPHILE_ENV=development
NODE_ENV=development
Run the demo:
cd demo
npm install
npm run dev
Change Log
v12.0.0
- Changes: Withdraw mutation
amount
fromFloat
toInt
to reflect changes in moneypot-server.- Non-integer amounts are are now graphql errors.
- This generally means you should floor amounts when converting to base unit esp to avoid floating point error,
Math.floor(amount * displayUnitScale)
. This will leave behind <1.0 base unit 'dust' in your system when users withdraw.
v11.2.0
Adds: Express types and
CaasRequest
for writing custom express routes.import { CaasRequest, Response, Express } from "@moneypot/caas/express"; configureApp((app: Express) => { app.get("/test", (req: CaasRequest, res: Response) => { console.log("Logged in as...", req.identity); res.json({ uname: identity.uname }); }); });
v11.0.1
- Adds: Pending transfer system.
- Adds
caas.transfer_status_kind
enum - Adds
caas.transfer_statuses
table caas.withdrawals
now always has anmp_transfer_id
but it starts in the pending state- process-transfers.ts now uses mp-server's new
completeTransfer(mpTransferId)
to make the idempotent transfer
- Adds
v10.1.1
- Changes: You can now boot a caas server in non-development mode with the hashchain server unconfigured.
v10.1.0
- Bugfix: Adds automigration 004 which updates balance change alert trigger to also run on balance inserts.
- Fixes issue where balance change alert subscription didn't fire on user's initial deposit.
- Adds:
getCasinoCurrencyByKey(pgClient, currencyKey)
helper to@moneypot/caas/db
. - Adds:
@moenypot/caas/db/util
namespace formaybeOneRow
andexactlyOneRow
helpers.