37
loading...
This website collects cookies to deliver better user experience
$ npm init adonis-ts-app@latest my-project-name
choisir project structure API
cd my-project-name
node ace serve -w
npm i @adonisjs/lucid
node ace configure @adonisjs/lucid
choisir SQLite
npm i @adonisjs/auth
node ace configure @adonisjs/auth
- choisir Lucid
- Saisir modèle User
- choisir API Tokens
- choisir créer la migration
- choisir utiliser une base de donnée et créer la table pour stocker les Tokens
@column()
public username: string
table.string('username', 255).notNullable()
table.string('email', 255)->notNullable().unique()
node ace migration:run
npm i phc-argon2
Route.post('users', 'AuthController.register')
node ace make:validator Auth/StoreUser
import { schema, rules } from @ioc:Adonis/Core/Validator
public schema = schema.create({
email: schema.string({ trim: true }, [
rules.email(),
rules.unique({ table: 'users', column: 'email ' }),
]),
username: schema.string({ trim: true }),
password: schema.string(),
})
node ace make:controller Auth
public async register({ request, response } : HttpContextContract) {
const payload = await request.validate(StoreUserValidator)
const user = await User.create(payload.user)
return response.created(user) // 201 CREATED
}
Route.post('users/login', 'AuthController.login')
node ace make:validator Auth/Login
import { schema, rules } from @ioc:Adonis/Core/Validator
public schema = schema.create({
email: schema.string({}, [rules.email()]),
password: schema.string()
})
public async login({ auth, request, response }: HttpContextContract) {
const { email, password } = await request.validate(LoginValidator)
const token = await auth.attempt(email, password)
const user = auth.user!
return response.ok({
"token": token,
...user.serialize(),
})
}
Route.get('user', 'AuthController.me').middleware(['auth'])
public async me({auth, response} : HttpContextContract) {
return response.ok({ auth.user })
}
Server.middleware.registerNamed({ auth: () => import('App/Middleware/Auth') })
Route.put('users', 'AuthController.update').middleware(['auth'])
node ace make:validator Auth/UpdateUser
import { schema, rules } from @ioc:Adonis/Core/Validator
public schema = schema.create({
email: schema.string.optional({ trim: true }, [
rules.email(),
rules.unique({ table: 'users', column: 'email' }),
]),
username: schema.string.optional({ trim: true }),
password: schema.string.optional(),
})
public async update({ auth, request, response } : HttpContextContract) {
const payload = await request.validate(UpdateUserValidator)
const user = await auth.user!.merge(payload).save()
return response.ok(user) // 200 OK
}
node ace make:model Task -cm
public async up () {
this.schema.createTable(this.tableName, (table) => {
table.increments('id')
table.integer('user_id').unsigned().references('users.id').onDelete('CASCADE')
table.string('name').notNullable()
table.boolean('is_done').defaultTo(false)
table.timestamp('created_at', { useTz: true })
table.timestamp('updated_at', { useTz: true })
})
}
import { DateTime } from 'luxon'
import { BaseModel, BelongsTo, belongsTo, column, hasMany, HasMany } from '@ioc:Adonis/Lucid/Orm'
import User from './User'
export default class Task extends BaseModel {
@column({ isPrimary: true })
public id: number
@column.dateTime({ autoCreate: true })
public createdAt: DateTime
@column.dateTime({ autoCreate: true, autoUpdate: true })
public updatedAt: DateTime
@column()
public name: string
@column()
public is_done: boolean
@belongsTo(() => User)
public user: BelongsTo<typeof User>
}
@hasMany(() => Task)
public tasks: HasMany<typeof Task>
Route.resource('tasks', 'TaskController').apiOnly()
// Cette ligne de code va créer 5 chemin urls pour le CRUD
// Liste des tâches: GET /tasks (tasks.index)
// Sauvegarder une tâches: POST /tasks (tasks.store)
// Lire une tâche: GET tasks/:id (tasks.show)
// Mise à jour d'une tâche: PUT tasks/:id (tasks.update)
// Effacer une tâche: DELETE tasks/:id (tasks.destroy)
import { HttpContextContract } from '@ioc:Adonis/Core/HttpContext'
import Task from 'App/Models/Task'
import StoreTaskValidator from 'App/Validators/Tasks/StoreTaskValidator'
import UpdateTaskValidator from 'App/Validators/Tasks/UpdateTaskValidator'
export default class TasksController {
public async index ({response}: HttpContextContract) {
const tasks = await Task.all()
return response.ok(tasks)
}
public async store ({ request, response }: HttpContextContract) {
const payload = await request.validate(StoreTaskValidator)
const task = await Task.create(payload)
return response.created(task)
}
public async show ({ response, params }: HttpContextContract) {
console.log(params)
const task = await Task.findOrFail(params.id)
return response.ok(task)
}
public async update ({ request, response, params }: HttpContextContract) {
const task = await Task.findOrFail(params.id)
const payload = await request.validate(UpdateTaskValidator)
task.merge(payload).save()
return response.ok(task)
}
public async destroy ({ response, params }: HttpContextContract) {
const task = await Task.findOrFail(params.id)
task.delete()
return response.ok(task)
}
}
node ace make:validator Tasks/StoreTask
public schema = schema.create({
name: schema.string(),
is_done: schema.boolean(),
})
node ace make:validator Tasks/UpdateTask
public schema = schema.create({
name: schema.string.optinal(),
is_done: schema.boolean.optional(),
})