personal-backend
Version:
A personal backend for personal projects
91 lines (64 loc) • 2.45 kB
Markdown
# A simple backend for personal projects
This is a simple Socket.io server for getting, putting, patching JSON-encodable data on a per-user basis.
Allows users to add collaborators which have read/write access to the granter's data. That's right! A personal backend with collaboration! I wrote this initially for a home inventory management app to be shared with my wife; so, kind of personal.
User data has a *version* number. Clients specify the current version for updates.
Updates may be full replacements or patches/merges.
Clients can fetch or get the full data or just some paths therein (e.g. `a.b.c`).
Clients can watch for changes to a user's data (including their own) as long as they are the owner of the data or a collaborator thereof.
## UserData
{
"metadata": {
"username": String,
"version": Number,
"collaborators": [Username],
"createdAt": Date,
"lastUpdate": { "at": Date, "by": Username }
},
"userdata": Object
}
## Client Messages
'signup'
'auth', token
'update', newData, version, targetUsername=null, patch=false
'fetch', targetUsername=null, fields=null
'watch', targetUsername
'unwatch', targetUsername
## Server Messages
'auth', username, token
'version', username, version
'error', message
'data', targetUsername, data
'change', targetUsername, data
## Error Messages
'invalid token'
'version mismatch'
'unauthorized'
## Updates
newData = {
metadata: {
version: int, // expected server version of data
collaborators: [String] // replaces entirely regardless of patch
},
userdata: Object // replacement or changes (for patch)
}
## Fields
fields = [
'a.b', // {a: {b: 1}}
'c', // {c: 'foo'}
'd.e.f'
]
Fields are a poor man's GraphQL. Specifying some fields to `fetch` or `watch` will only
return some fields and the `data` in a `data` or `change` message from the server will
take the same shape.
## Configuration
### ENV
PORT=8080
CACHE_SIZE=100
CACHE_MAX_AGE=900000
JWT_SECRET=...
MAX_DATA_SIZE_JSON=65536
DEBUG=api
## TODO
- Rate limit signups from the same IP but this is a cat and mouse game
## Author
Brian Hammond <brian@fictorial.com>