type-arango
Version:
ArangoDB Foxx decorators and utilities for TypeScript
62 lines (54 loc) • 1.73 kB
text/typescript
import {Collection, Entities, Route, RouteArg} from '../../../../src' // type-arango
import {User} from '../../shared'
// start a new collection containing User entities
(of => User)
// add collection specific roles to client requests (eg viewer for the own user)
.roles(
({session, _key}) => session().uid === _key ? ['viewer'] : []
)
// minimalistic route initializer to create, read & update users
.GET(roles => ['guest', 'viewer', 'admin'])
.PATCH(roles => ['viewer', 'admin'])
// the collection class, constructor.name is used as collection.name
export class Users extends Entities {
/**
* Creates a new user
*/
.POST('register', roles => ['guest'], $ => ({
...$(User),
password: $(String)
}))
static REGISTER({json}: RouteArg){
const auth = require('@arangodb/foxx/auth')()
const { password, ...user } = json()
return new User({
...user,
roles: ['user'],
secret: 42,
auth: auth.create(password)
}).save()
}
/**
* Login route
* Provides the X-Session-Id header required for further requests
*/
.POST('login', $ => ({
email: $(User).email,
password: $(String).min(6)
}))
static LOGIN({json,error,session}: RouteArg){
const { email, password } = json()
const user = Users.find({filter:{email}, keep:['_key', 'auth', 'roles']})
// authenticate
const auth = require('@arangodb/foxx/auth')()
if(!user || !auth.verify(user.auth, password))
return error('unauthorized')
// write and return session
return session({
uid: user._key,
data: {
roles: user.roles
}
})
}
}