DEV Community

Cover image for Node js - cli app
Andi Ismail
Andi Ismail

Posted on

Node js - cli app

mkdir cli_app_2
cd cli_app_2
npm init
licensi MIT
Enter fullscreen mode Exit fullscreen mode

Image inquirer

npm install --save inquirer

Image prisma

npm install prisma
npx prisma init
Enter fullscreen mode Exit fullscreen mode

Image instalan awal

tambahkan type modul dan script start sehingga kita bisa node start

//package.json

{
  "name": "cli_app_2",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "type": "module", //tambahkan ini
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "start":"node index.js" //dan ini
  },
  "author": "andiismail",
  "license": "MIT",
  "dependencies": {
    "inquirer": "^9.1.4",
    "prisma": "^4.6.1"
  }
}
Enter fullscreen mode Exit fullscreen mode

selanjutnya kita akan buat index.js

//index.js

import inquirer from "inquirer";
console.clear()
console.log(`
===================================
APlikasi Cli 2
===================================
`)
Enter fullscreen mode Exit fullscreen mode

jalankan aplikasi dengan mengetikkan npm start

Image cli2

selanjutnya kita gunakan prisma

//index.js

import inquirer from "inquirer";
console.clear()
console.log(`
===================================
APlikasi Cli 2
===================================
`)

//kasih pilhan mau login atau mau register 
inquirer.prompt([
    {
        name : "option",
        message : "silahkan pilih : ",
        type : "list",
        choices : ["login", "register"]
    }
])
.then((ans)=>{
    console.log(ans.option)
})
.catch((err)=>{
    console.error(err)
})
Enter fullscreen mode Exit fullscreen mode

berhasil menampilkan option login da register

Image cliappp2

agar tidak menggunakan kata ans ketika memunculkan option terus maka kita akan menjadikan option sebagai objek ans

//index.js

import inquirer from "inquirer";
console.clear()
console.log(`
===================================
APlikasi Cli 2
===================================
`)

//kasih pilhan mau login atau mau register 
inquirer.prompt([
    {
        name : "option",
        message : "silahkan pilih : ",
        type : "list",
        choices : ["login", "register", "exit"]
    }
])
.then((ans)=>{
    //console.log(ans.option)
    const {option} = ans
    console.log(option)

})
.catch((err)=>{
    console.error(err)
})
Enter fullscreen mode Exit fullscreen mode

hasilnya

Image exit

Image figma jam

selanjutnya kita akan menggunakan pengkondisian

//index.js

import inquirer from "inquirer";
console.clear()
console.log(`
===================================
APlikasi Cli 2
===================================
`)

//kasih pilhan mau login atau mau register 
inquirer.prompt([
    {
        name : "option",
        message : "silahkan pilih : ",
        type : "list",
        choices : ["login", "register", "exit"]
    }
])
.then((ans)=>{

    //pengkondisian
    const {option} = ans

    //gunakan if
    if(option==="login"){
        console.clear()
        console.log("kamu memilih login")
        return
    }

    if(option==="register"){
        console.clear()
        console.log("kamu memilih register")
        return
    } 

    console.clear()
    console.log("terimakasih...")

})
.catch((err)=>{
    console.error(err)
})
Enter fullscreen mode Exit fullscreen mode

Image if

selanjutnya kita akan buat function function yang kan memanggil console log yang telah kit buat sebelumnya.

`//function login
function login (){
console.clear()
console.log("kamu memilih Login")
}

function resgister (){
console.clear()
console.log("kamu memilih Register")
}`

//index.js

import inquirer from "inquirer";
console.clear()
console.log(`
===================================
APlikasi Cli 2
===================================
`)

//kasih pilhan mau login atau mau register 
inquirer.prompt([
    {
        name : "option",
        message : "silahkan pilih : ",
        type : "list",
        choices : ["login", "register", "exit"]
    }
])
.then((ans)=>{

    //destruct option objek dari ans
    const {option} = ans

    //gunakan if
    if(option==="login"){
        return login()
    }

    if(option==="register"){
        return resgister()
    } 

    exit()

})
.catch((err)=>{
    console.error(err)
})


//function login 
function login (){
    console.clear()
    console.log("kamu memilih Login")
}

function resgister (){
    console.clear()
    console.log("kamu memilih Register")
}

function exit (){
    console.clear()
    console.log("Terimakasih...")
}
Enter fullscreen mode Exit fullscreen mode

hasilnya sama aja. selanjutnya kita akan buat database nya dengan prisma.
kita ganti databse url di file .env

DATABASE_URL="file:./db.sqlite"

selanjutnya kita ke schema prisma

//schema.prisma

generator client {
  provider = "prisma-client-js"
}

datasource db {
  provider = "sqlite"
  url      = env("DATABASE_URL")
}

model Users {
  //col name  type      option
  id          Int       @id @default(autoincrement())
  username    String    @unique
  password    String
  createdAt   DateTime  @default(now())
  updatedAt   DateTime  @updatedAt
}
Enter fullscreen mode Exit fullscreen mode

npx prisma generate
npx prisma db push
npx prisma studio

Image prisma

//package.json

{
  "name": "cli_app_2",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "type": "module",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "start": "node index.js"
  },
  "author": "andiismail",
  "license": "MIT",
  "dependencies": {
    "@prisma/client": "^4.6.1",
    "inquirer": "^9.1.4",
    "prisma": "^4.6.1"
  }
}
Enter fullscreen mode Exit fullscreen mode

selanjutnya kita buat file connection.js di prisma

//connection.js

import { PrismaClient } from "@prisma/client"

const db = new PrismaClient()
export default db
Enter fullscreen mode Exit fullscreen mode

selanjutnya kita ke index.js

//index.js

import inquirer from "inquirer";
import db from "./prisma/connection.js"

console.clear()
console.log(`
===================================
APlikasi Cli 2
===================================
`)

//kasih pilhan mau login atau mau register 
inquirer.prompt([
    {
        name : "option",
        message : "silahkan pilih : ",
        type : "list",
        choices : ["login", "register", "exit"]
    }
])
.then((ans)=>{

    //destruct option objek dari ans
    const {option} = ans

    //gunakan if
    if(option==="login"){
        return login()
    }

    if(option==="register"){
        return register()
    } 

    exit()

})
.catch((err)=>{
    console.error(err)
})

//function login
function login(){
    console.clear()
    console.log("kamu memilih login")
}

//function register
function register (){
    console.clear()
    //console.log("kamu memilih Login")

    //kita masukkan inquirer disini
    inquirer.prompt([
        {
            name : "username",
            message : "Masukkan username"
        },
        {
            name : "password",
            message : "Masukkan password",
            type : "password" 
        }
    ])
    .then((ans)=>{
        const {username, password} = ans

        //masukan data ke database
        db.users.create({
            data : {
                username : username,
                password : password
            }
        })
        .then((res)=>[
            console.log("data berhasil di simpan..")
        ])
        .catch((err)=>{
            console.error(err.message)
        })
    })
}

function exit (){
    console.clear()
    console.log("Terimakasih...")
}
Enter fullscreen mode Exit fullscreen mode

Image kakak

Image prisma kakak

prisma studio bisa tambah, edit dan hapus barang item

Image satu

permasalahan password kita belum di eskripsi kita bisa menggunaka bcrypt.js

Image dua

npm i bcryptjs

kita buat folder baru namanya utils

//hashPassword.js

import bcrypt from "bcryptjs"

/**
 * 
 * @param {string} password 
 * @returns 
 */
export function hashPassword(password){
    const salt = bcrypt.genSaltSync(10)
    const saltPassword = bcrypt.hashSync(password, salt)
    return saltPassword
}
Enter fullscreen mode Exit fullscreen mode

kita import hashPassword.js ke index.js
//masukan data ke database
db.users.create({
data : {
username : username,
password : hashPassword(password)
}
})

//index.js

import inquirer from "inquirer";
import db from "./prisma/connection.js"
import {hashPassword} from './utils/hashPassword.js'

console.clear()
console.log(`
===================================
APlikasi Cli 2
===================================
`)

//kasih pilhan mau login atau mau register 
inquirer.prompt([
    {
        name : "option",
        message : "silahkan pilih : ",
        type : "list",
        choices : ["login", "register", "exit"]
    }
])
.then((ans)=>{

    //destruct option objek dari ans
    const {option} = ans

    //gunakan if
    if(option==="login"){
        return login()
    }

    if(option==="register"){
        return register()
    } 

    exit()

})
.catch((err)=>{
    console.error(err)
})

//function login
function login(){
    console.clear()
    console.log("kamu memilih login")
}

//function register
function register (){
    console.clear()
    //console.log("kamu memilih Login")

    //kita masukkan inquirer disini
    inquirer.prompt([
        {
            name : "username",
            message : "Masukkan username"
        },
        {
            name : "password",
            message : "Masukkan password",
            type : "password" 
        }
    ])
    .then((ans)=>{
        const {username, password} = ans

        //masukan data ke database
        db.users.create({
            data : {
                username : username,
                password : hashPassword(password)
            }
        })
        .then((res)=>[
            console.log("data berhasil di simpan..")
        ])
        .catch((err)=>{
            console.error(err.message)
        })
    })
}

function exit (){
    console.clear()
    console.log("Terimakasih...")
}
Enter fullscreen mode Exit fullscreen mode

Image boby

Image prisma

selesai register. selanjutnya kita akan buat login encrypt passwordnya. di hashPassword kita buat sebuah compare password karena passwordnya sudah berubah tidak seperti awal.

//hashPassword.js

import bcrypt from "bcryptjs"

/**
 * 
 * @param {string} password 
 * @returns 
 */
export function hashPassword(password){
    const salt = bcrypt.genSaltSync(10)
    const saltPassword = bcrypt.hashSync(password, salt)
    return saltPassword
}

//compare password
/**
 * compare password dari databse
 * cara munculinnya garing bintang dua
 * @param {string} inputPassword 
 * @param {string} dbPassword 
 * @returns {boolean}
 */
export function comparePassword(inputPassword, dbPassword){
    return bcrypt.compareSync(inputPassword, dbPassword) //boolean
}
Enter fullscreen mode Exit fullscreen mode

Image vscode

//index.js

import inquirer from "inquirer";
import db from "./prisma/connection.js"
import {hashPassword, comparePassword} from './utils/hashPassword.js'

console.clear()
console.log(`
===================================
APlikasi Cli 2
===================================
`)

//kasih pilhan mau login atau mau register 
inquirer.prompt([
    {
        name : "option",
        message : "silahkan pilih : ",
        type : "list",
        choices : ["login", "register", "exit"]
    }
])
.then((ans)=>{

    //destruct option objek dari ans
    const {option} = ans

    //gunakan if
    if(option==="login"){
        return login()
    }

    if(option==="register"){
        return register()
    } 

    exit()

})
.catch((err)=>{
    console.error(err)
})

//function login
function login(){
    console.clear()
    //console.log("kamu memilih login") //mulai dari sini
    inquirer.prompt([
        {
            name : 'username',
            message : 'masukan username'
        },
        {
            name : 'password',
            message : 'masukkan password : ',
            type : 'password'
        }
    ]) 
    .then(async(ans)=>{
        const {username, password} = ans
        const getUserData = await db.users.findUnique({
            where : {
                username : username
            }
        })

        //jika username tidak ditemukan
        if(!getUserData){
            return console.log("username tidak ditemukan")
        }

        //compare passwordnya
        const tryComparePassword = await comparePassword(password, getUserData.password)

        //jika password tidak seusai
        if(!tryComparePassword){
            return console.log("password salah..")
        }

        //semua sesuai 
        console.log(`
=====================================
SELAMAT DATANG ${getUserData.username}
=====================================
        `)

    })
}

//function register
function register (){
    console.clear()
    //console.log("kamu memilih Login")

    //kita masukkan inquirer disini
    inquirer.prompt([
        {
            name : "username",
            message : "Masukkan username"
        },
        {
            name : "password",
            message : "Masukkan password",
            type : "password" 
        }
    ])
    .then((ans)=>{
        const {username, password} = ans

        //masukan data ke database
        db.users.create({
            data : {
                username : username,
                password : hashPassword(password)
            }
        })
        .then((res)=>[
            console.log("data berhasil di simpan..")
        ])
        .catch((err)=>{
            console.error(err.message)
        })
    })
}

function exit (){
    console.clear()
    console.log("Terimakasih...")
}
Enter fullscreen mode Exit fullscreen mode

Image tiga

Image boba

Terimakasih.

https://github.com/andiks2018/JvalleyNodejs-cliapp_2.git

Latest comments (0)