const { App } = require("gatos")
App.middlewares = "./middlewares"
App.routes = "./routes"
App.files = "../public/uploads"
App.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 = {
"@doSomeStuff /:id #delete-by-id": async ({ params }) => {
}
}
Quick start
src/index.js
const { App } = require("gatos")
App.routes = "./routes"
App.middlewares = "./middlewares"
App.files = "../public/uploads"
App.listen(3500)
Roles
By default you are an anonymous, the anonymous has no roles.
But you can change it with the $$roles
global object.
Example
src/index.js
const { App } = require("gatos")
$$roles.anonymous = "*"
App.routes = "./routes"
App.middlewares = "./routes"
App.clear.listen()
see ? simple.
let's move to his own file now
you can create new roles
src/security/roles.js
$$roles.anonymous = {
auth: "*",
}
$$roles.default = {
auth: {
"*": true,
"create-account": false,
},
}
$$roles.user = {
books: {
"get-all": true,
"get-by-id": true,
"create-one": false,
},
}
$$roles.author = {
books: "*",
}
$$roles.admin = "*"
to use the new roles, you need to declare profiles
src/security/profiles.js
$$profiles.user = ["default", "user"]
$$profiles.author = ["default", "author"]
profiles can have many specific roles!
const { App } = require("gatos")
require("./security/roles")
require("./security/profiles")
App.routes = "./routes"
App.middlewares = "./routes"
App.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 = {
"@doSomeStuff /:_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")
$$User = 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({
identifier: body.require("username"),
password: body.require("password"),
}),
"/register #create-account": ({ body }) => {
body.requireAll(
"username"
"firstName",
"lastName",
"password"
)
return User.register(body)
},
}
cool!
but I prefer "email" as the identifier and not "username"
simple!
src/models/User.js
const { Auth } = require("gatos/models")
$$User = module.exports = class User extends Auth {
email = String.prototype
firstName = String.prototype
lastName = String.prototype
static get $$identifierKey() {
return "email"
}
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")
$$User = 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!