Sistemsel Gereksinimler
Adonis
MySQL
Node
Postman

Bilinmesi Gerekli Bilgiler

· REST ve RESTful Web Servis Kavramı

· REST VE RESTFUL WEB SERVİS NEDİR?

· REST / SOAP API Nedir? Farkları Nelerdir?

· Postman : 1-Nedir

· Node.js’in Windows Üzerinde Kurulumu

AdonisJS Kurulumu

Öncelikle AdonisJs’i global olarak makinamıza yüklüyoruz. Terminalimizi açıp aşağıdaki kod bloğunu çalıştırıyoruz.

npm install -global @adonisjs/cli

Terminalimizden Adonis projesi oluşturuyoruz.

adonis new Adonis-RestFull-Api — api-only

Uygulamanın çalıştığını test etmek amacı ile Terminalimizde uygulamanın dizinine gidip uygulamamızı ayağa kaldırıyoruz.

cd Adonis-RestFull-Apiadonis serve — dev

Postman üzerinden 127.0.0.1:3333 adresine get isteği yaptığımızda bizi aşağıdaki sayfanın karşılaması gerekmekte.

Image for post

Bu eğitimimizde küçük bir Todo uygulaması yapacağız.

Image for post

Veritabanı Bağlantısı

Uygulamamızın dizininde .env dosyasını açarak aşağıdaki kısımları kendi veritabanımıza göre şekillendiriyoruz.

DB_CONNECTION=mysqlDB_HOST=127.0.0.1DB_PORT=3306DB_USER=rootDB_PASSWORD=DB_DATABASE=Adonis-RestFull-Api

DB_CONNECTION — -> Veritabanı Biz bu projede mysql kullanacağız
DB_HOST — -> Veritabanı adresi biz localhost’da çalıştığımız için 127.0.0.1 olarak bırakmaktayız.
DB_PORT — -> Veritabanı portunuz. Mysql varsayılan olarak 3306 portunda çalışır.
DB_USER — -> Veritabanı Kullanıcı Adınız.
DB_PASSWORD — -> Veritabanı şifreniz yazılır.
DB_DATABASE — -> Veritabanızın adı

Uygulamamıza npm’den mysql modülümüzü dahil ediyoruz.

npm install — save mysql

Uygulamamıza Todos Model ve Controller’ını oluşturuyoruz.

adonis make:model Todos -mc

database\migrations\xxxxxxxxxx_todos_schema.js dosyasını açıyoruz. Propertylerimizi oluşturuyoruz.

‘use strict’
/** @type {import(‘@adonisjs/lucid/src/Schema’)} */
const Schema = use(‘Schema’)
class TodosSchema extends Schema {
up() {
this.create(‘todos’, (table) => {
table.increments()
table.integer(‘userid’, 11).unsigned().references(‘id’).inTable(‘users’)
table.string(‘title’)
table.string(‘body’)
table.boolean(‘done’)
table.timestamps()
})
}
down() {
this.drop(‘todos’)
}
}
module.exports = TodosSchema

app/Models/User.js dosyasını açıyoruz. User Modeli ile bağlantısını yazıyoruz. Todos ile bağlantısını oluşturuyoruz.

‘use strict’
const Model = use(‘Model’)
const Hash = use(‘Hash’)
class User extends Model {
todos() {
return this.hasMany(‘App/Models/Todo’)
}
static boot() {
super.boot()
this.addHook(‘beforeSave’, async (userInstance) => {
if (userInstance.dirty.password) {
userInstance.password = await Hash.make(userInstance.password)
}
})
}
tokens() {
return this.hasMany(‘App/Models/Token’)
}
}
module.exports = User

Migration yaparak database’mizi oluşturuyoruz.

adonis migration:run

CRUD Controllerin oluşturulması

'use strict'
const Todo = use('App/Models/Todo');
const User = use('App/Models/User');
class TodoController {
//User'a Ait Todoların Gösterimi
async all({ request, response, view }) {
let todos = await User.query().with('todos').fetch()
return response.json(todos)
}
//Tüm Todoların Gösterimi
async index({ request, response, view }) {
let todos = await Todo.query().fetch()
return response.json(todos)
}
//Todo Ekleme
async save({ request, response }) {
const user_id = request.input('user_id')
const title = request.input('title')
const body = request.input('body')
const done = request.input('done')
const todo = new Todo()
todo.user_id = user_id
todo.title = title
todo.body = body
todo.done = done
await todo.save()
return response.json(todo)
}
//Todo Güncelleme
async update({ params, request, response }) {
const user_id = request.input('user_id')
const title = request.input('title')
const body = request.input('body')
const done = request.input('done')
let todo = await Todo.find(params.id)
todo.user_id = user_id
todo.title = title
todo.body = body
todo.done = done
await todo.save()
return response.json(todo)
}
//Todo Silme
async destroy({ params, request, response }) {
await Todo.find(params.id).delete()
return response.json({ message: 'Todo deleted!' })
}
}
module.exports = TodoController

Route’un Oluşturulması

start/routes.js dosyasının içerisine methodlar eklenir.

Route.put(‘/api/todos/:id’, ‘TodoController.update’)
Route.delete(‘/api/todos/id’, ‘TodoController.destroy’)
Route.post(‘/api/todos’, ‘TodoController.save’)
Route.get(‘/api/todos’, ‘TodoController.index’)
Route.get(‘/api/all’, ‘TodoController.all’)

Kodlarımızı şimdi test edebiliriz. Terminalimizden aşağıdaki kod bloğunu çalıştırarak uygulamamızı test edelim.

adonis serve --dev

JWT Kimlik Doğrulama

Bazı Endpoint’leri güvenlik gereği public yapmayız. Bu bakımdan genelde kullanılan JWT (JSON Web Tokens) entegre edeceğiz.

config/auth.js dosyamızı açarak authenticator property’sini değerini jwt yapalım.

module.exports = {
authenticator: 'jwt',

Sonrasında sayfanın biraz aşağısında bulunan JWT bloğuna gelerek Hangi modeli kullanacağımızı ve bu model üzerinde hangi property’lerin unique değer ve şifre olacağını tanımlıyoruz.

jwt: {
serializer: 'lucid',
model: 'App/Models/User',
scheme: 'jwt',
uid: 'email',
password: 'password',
options: {
secret: Env.get('APP_KEY')
}
},

Sonrasında Terminal üzerinden Token alınacak Controller’ımızı oluşturuyoruz.

adonis make:controller --type http AuthController

app\Controllers\Http\AuthController.js dosyamızı açarak kayıt ve login methodlarımızı yazıyoruz.

‘use strict’
const User = use(‘App/Models/User’);
class AuthController {
async register({ request, auth, response }) {
const username = request.input(“username”)
const email = request.input(“email”)
const password = request.input(“password”)
let user = new User()
user.username = username
user.email = email
user.password = password
await user.save()
let userdetail = await User.findBy(‘email’, email)
let accessToken = await auth.generate(userdetail)
return response.json({ “user”: user, “access_token”: accessToken })
}
async login({ request, auth, response }) {
const email = request.input(“email”)
const password = request.input(“password”);
try {
if (await auth.attempt(email, password)) {
let user = await User.findBy(‘email’, email)
let accessToken = await auth.generate(user)
return response.json({ “user”: user, “access_token”: accessToken })
}
}
catch (e) {
return response.json({ message: ‘User not found!’ })
}
}
}
module.exports = AuthController

start/routes.js sayfamızı açarak methodlarımızı tanımlıyoruz.

Route.post(‘/auth/register’, ‘AuthController.register’)
Route.post(‘/auth/login’, ‘AuthController.login’)

Daha öncesinden oluşturduğumuz Endpointlere JWT Middleware’lerimizi tanımlıyoruz.

Route.put(‘/api/todos/:id’, ‘TodoController.update’).middleware(‘auth’)
Route.delete(‘/api/todos/id’, ‘TodoController.destroy’).middleware(‘auth’)
Route.post(‘/api/todos’, ‘TodoController.store’).middleware(‘auth’)
Route.get(‘/api/todos’, ‘TodoController.index’).middleware(‘auth’)
Route.get(‘/api/all’, ‘TodoController.all’).middleware(‘auth’)

Github Repository Gözat

Bu eğitimde Adonis ile RestApi uygulaması oluşturduk. Ayrıca oturum açma ve oturum doğrlama için JWT’i entegre ettik. Bir sonraki eğitim serisinde görüşmek üzere. Eğitimdeki eksiklikler veya anlatılmayan kısımlar için lütfen yorumlarınızı eksik etmeyiniz.

CEVAP VER

Please enter your comment!
Please enter your name here