const gatos = require("gatos")
gatos.routes = "./routes"
gatos.uploadDir = "../public/uploads"
gatos.documentation = { title: "My auto generated doc" }
gatos.clear.listen()
$$.get = {
"/ #hello-world": () => "Hello World",
}
const { Model } = require("gatos/models")
module.exports = class Book extends Model {
title = String.prototype
}
GATOS
npm install gatos
or
yarn add gatos
Overview
This library will make your life easy, just for fun!
example of a full controller file
src/routes/books.js
$$.get = {
"/ #get-all": async () => {
return []
}
"/:_id #get-by-id": async ({ params }) => {
return params
}
}
$$.post = {
"/ #create": async ({ body }) => {
}
}
$$.delete = {
"/:id #delete-by-id": async ({ params }) => {
}
}
Quick start
src/index.js
const gatos = require("gatos")
gatos.routes = "./routes"
gatos.uploadDir = "../public/uploads"
gatos.listen(3500)
Roles
By default you are an anonymous, the anonymous has no roles.
But you can change it with the gatos.roles
map object.
Example
src/index.js
const gatos = require("gatos")
gatos.roles.set("anonymous", "*")
gatos.routes = "./routes"
gatos.clear.listen()
see ? simple.
let's move to his own file now
you can create new roles
src/security/roles.js
const { roles } = require("gatos")
roles.set("anonymous", {
auth: "*",
})
roles.set("default", {
auth: {
"*": true,
"create-account": false,
},
})
roles.set("user", {
books: {
"get-all": true,
"get-by-id": true,
"create-one": false,
},
})
roles.set("author", {
books: "*",
})
roles.set("admin", "*")
to use the new roles, you need to declare profiles
src/security/profiles.js
const { profiles } = require("gatos")
profiles.set("user", ["default", "user"])
profiles.set("author", ["default", "author"])
profiles can have many specific roles!
const gatos = require("gatos")
require("./security/roles")
require("./security/profiles")
gatos.routes = "./routes"
gatos.models = "./models"
gatos.clear.listen()
Models
it is also very easy to create models for the mongodb!
let's create a model folder
where we create the Book model
src/models/Book.js
const { Model } = require("gatos/models")
module.exports = class Book extends Model {
name = String.prototype
pages = [String.prototype]
creationDate = Date.prototype
get pageCount() {
return this.pages.length
}
toString() {
return `[${this.name}] - ${this.pageCount} pages`
}
static getSpecialBooks() {
return this.find({
name: { $regex: /special/i },
})
}
}
easyyyyy
now let's go back to the routes
src/routes/books.js
const Book = require("../models/Book")
$$.get = {
"/ #get-all-books": async () => {
return await Book.find()
}
"/:_id #get-by-id": async ({ params }) => {
const book = await Book.findOne(params)
console.log(book.toString(), "found!")
return book
}
}
$$.post = {
"/ #create": async ({ body }) => {
body.$require("name")
body.$require("pages", [])
return await Book.insertOne(body)
}
}
$$.delete = {
"/:_id #delete-by-id": async ({ params }) => {
const { _id } = params
return await Book.deleteOne({ _id })
}
}
Auth
Let's create a user
src/models/User.js
const { Auth } = require("gatos/models")
module.exports = class User extends Auth {
username = String.prototype
firstName = String.prototype
lastName = String.prototype
get fullName() {
return `${this.firstName} ${this.lastName}`
}
}
src/routes/auth.js
const User = require("../models/User")
$$.get = {
"/ #get-current-user": ({ user }) => user,
}
$$.post = {
"/login #login": ({ body }) =>
User.login({
username: body.$require("username"),
password: body.$require("password"),
}),
"/register #create-account": ({ body }) => {
return User.register({
profiles: ["user"],
username: body.$require("username"),
firstName: body.$require("firstName"),
lastName: body.$require("lastName"),
password: body.$require("password"),
})
},
}
cool!
but I prefer "email" as the identifier and not "username"
simple!
src/models/User.js
const { Auth } = require("gatos/models")
process.env.GATOS_USER_IDENTIFIER_KEY = "email"
module.exports = class User extends Auth {
email = String.prototype
firstName = String.prototype
lastName = String.prototype
get fullName() {
return `${this.firstName} ${this.lastName}`
}
}
I want validation for my emails >:(
Well...
Types
src/types/Email.js
const { Type } = require("gatos/types")
module.exports = class Email extends Type {
sendTo(email, message) {
console.log(`Sending ${message} to ${email} from ${this.value}!`)
}
}
Email.validator = (v) => /emailregex/.test(v)
src/models/User.js
const { Auth } = require("gatos/models")
const Email = require("../types/Email")
module.exports = class User extends Auth {
email = Email.prototype
firstName = String.prototype
lastName = String.prototype
static get $$identifierKey() {
return "email"
}
get fullName() {
return `${this.firstName} ${this.lastName}`
}
}
Let's see...
src/routes/auth.js
const User = require("../models/User")
$$.get = {
"/ #get-current-user": ({ user }) => user,
}
$$.post = {
"/emails/:email #send-email-to": ({ user, body, params }) => {
const message = body.$require("message")
user.email.sendTo(params.email, message)
return user
},
}
have fun!