EAS PWEB - Gym Journal Applikasi Tracking Workout

Nama : Kadek Fajar Pramartha Yasodana

NRP : 5025231185

Kelas : PWEB


EAS PWEB

1. Apa yang dimaksud dengan Back-End. Jelaskan ruang lingkup pekerjaan Back-End Engineer dan skill yang dibutuhkan.

  • Backend merupakan sebuah profesi dalam bidang programming yang bertugas untuk membuat alurnya logika dari applikasi atau dalam kata lainnya membuat server dari suatu applikasi mau itu web atau mobile dan lainnya. Back-End mendapatkan istilahnya dengan halnya seperti Front-End, Back-End tidak terlihat secara langsung oleh pengguna yang menggunakan applikasi karena Back-End bisa dibilang merupakan server dari applikasi, beda dengan Front-End yang terlihat secara langsung seperti interface page applikasi.
  • Ruang Lingkup Pekerjaan Back-End Engineer meliputi merancang desain arsitektur server dari applikasi, merancang API, merancang query untuk pengintegrasian applikasi dan database, dan lingkup lainnya yang berbau hal server.
  • Skill yang dibutuhkan oleh Back-End Engineer adalah skill dalam pemahaman alur kerjanya integrasi server agar bisa memberikan interface kepada pengguna, memahami alur dari API Call meliputi request dan Response dari protocol HTTP, memahami cara untuk melakukan query pada database, serta memahami cara menggunakan terminal dengan baik, mengingat Back-End banyak berurusan dengan server dan network, skill menggunakan terminal terutama linux sangatlah menguntungkan untuk melakukan otomasi, debugging, dan lainnya.

2. Buatlah Rancangan Aplikasi yang diambil dalam Final Project

Applikasi yang kami buat merupakan sebuah applikasi untuk melakukan tracking progress GYM. Berikut adalah rancangan yang telah kami buat untuk applikasi kami.

Architecture

  • Frontend :
  1. View : Vanilla HTML, Vanilla CSS, TailwindCSS
  • Backend : 
  1. Runtime : NGINX, PHP-FPM
  2. Database : PostgreSQL
  3. Architecture : MVC
  4. Deployment : Docker

Design

  • Desain UI/UX



  • Desain Database




3. Deskripsikan kegunaan dan ruang lingkup aplikasi

Applikasi yang kami buat bernama Gym Jounal. Gym Journal merupakan sebuah website untuk melakukan tracking dari progress workout kita secara efisien, Applikasi Gym Journal juga menyediakan leaderboard untuk menambahkan motivasi dari pengguna untuk melakukan hal positive agar bisa meninggikan scorenya.

Ruang Lingkup dari Applikasi Meliputi: 

  • Landing Page : Merupakan landing page yang memberikan sedikit deskripsi dan overview dari applikasi, pada page ini terdapat tombol untuk melakukan sign in
  • Auth Page : Merupakan page yang bisa user gunakan untuk melakukan Sign In, pada applikasi ini, kami menggunakan Authentikasi dari Google yaitu Google OAuth untuk memudahkan user melakukan Sign-in tanpa memerlukan pembuatan password baru.
  • Verify Page : Merupakan page yang digunakan oleh user jika user baru pertama kali sign in, Verify page berisi penginputan nama user, date of birth, dan foto profile yang nantinya akan disubmit dan dilakukan update data dari user agar data lengkap
  • Home Page : Merupakan page yang digunakan user jika telah melakukan sign in dan sudah terverifikasi. Page ini berisi sebuah greeting untuk user, list Workout Plan yang sudah dibuat oleh user dan tombol untuk membuat workout plan baru, list Workout Log yang sudah di submit oleh user, dan 2 tombol untuk melakukan export PDF, 1 untuk mengeksport seluruh workout plan, 1 untuk mengeksport seluruh workout logs beserta profile user.
  • Plan Page : Merupakan page yang digunakan oleh user untuk mengedit sebuah Workout Plan, pada page ini user bisa mengganti nama plan. menambahkan atau mengurangi exercise, menambah atau mengurangi exercise set, dan mengganti weight dan reps pada sebuah set.
  • Train Page : Merupakan page yang digunakan oleh user jika user memulai sebuah plan, user bisa melakukan checklist sets, melihat timer, dan jika semua set sudah di checklist, user bisa menyelesaikan dan submit data ke database.
  • Leaderboard Page : Merupakan page yang digunakan oleh user untuk melihat siapa saja orang yang memiliki poin tertinggi, berdasarkan log dari user itu.

4. Implementasikan Aplikasi yang telah didesain dengan menggunakan teknologi web tanpa framework

Applikasi kami, kami implementasi tanpa menggunakan framework seperti Laravel, kami hanya menggunakan PHP Native yang dijalankan PHP-FPM dan beberapa library lainnya untuk menunjang jalannya applikasi kami seperti Google OAuth untuk login, Tailwindcss untuk mempermudah Front End, Jest untuk testing, FPDF untuk melakukan export PDF. Kami mengimplementasikan applikasi dengan waktu kurang lebih 2 minggu, berikut adalah source code dari project kami, beberapa code yang penting, dan beberapa screenshot dari applikasi jika di deploy.

Source Code : GitHub

index.php

<?php

require_once __DIR__ . '/../vendor/autoload.php';
use Symfony\Component\Dotenv\Dotenv;
use University\GymJournal\Backend\App\Router;
use University\GymJournal\Backend\Controller\LandingController;

$dotenv = new Dotenv();
$dotenv->load(__DIR__.'/../.env');

Router::load();
Router::use(new LandingController());

Router.php

<?php
namespace University\GymJournal\Backend\App;
use University\GymJournal\Backend\App\Controller;

class Router
{
    public static array $rawUriParsed;
    public static string $rawPath;
    public static string $method;
    public static array $paths;
    public static array $queries;
    public static $body;
    public static array $headers;

    private static ?Controller $now = null;
   
    public static function load()
    {
        self::$rawUriParsed = parse_url($_SERVER['REQUEST_URI']);
        self::$rawPath = self::$rawUriParsed['path'];
        self::$method = $_SERVER['REQUEST_METHOD'];

        self::$paths = explode('/', self::$rawPath);

        Logger::Info('Incoming '.self::$method.' '.self::$rawPath);

       
        self::$queries = [];
        if(isset(self::$rawUriParsed['query']))
        {
            parse_str(self::$rawUriParsed['query'], self::$queries);
        }

        $trimed = [];
        for($i = 0; $i < count(self::$paths); $i++)
        {
            $current = trim(self::$paths[$i]);
            if($current === '')
            {
                continue;
            }

            $trimed[] = $current;
        }
        self::$paths = $trimed;
        self::$headers = getallheaders();

        self::$body = [];
        $bodyStream = file_get_contents('php://input');

        if($bodyStream)
        {
            self::$body = json_decode($bodyStream, true);
        }
    }
    public static function use(Controller $controller)
    {
        $call = '/';
        self::$now = $controller;

        $controller->load();

        for($i = 0; $i < count(self::$paths); $i++)
        {
            $currentPath = '/'.self::$paths[$i];
            $routing = self::$now->routes[self::$method];

            if(!isset($routing[$currentPath]))
            {
                HTTPUtils::send404HTML();
                return;
            }
            $item = $routing[$currentPath];

            if($item instanceof Controller)
            {
                $item->load();
                self::$now = $item;
                $call = '/';
            }
            else if($i == (count(self::$paths) - 1))
            {
                if(is_callable($item))
                {
                    $call = $currentPath;
                    break;
                }
                else
                {
                    self::$now = null;
                    break;
                }
            }
            else
            {
                self::$now = null;
                break;
            }
        }

        if(self::$now === null)
        {
            HTTPUtils::send404HTML();
            return;
        }

        if(!isset(self::$now->routes[self::$method][$call]))
        {
            HTTPUtils::send404HTML();
            return;
        }
        $function = self::$now->routes[self::$method][$call];

        if(is_callable($function))
        {
            call_user_func($function);
        }
        else
        {
            HTTPUtils::send404HTML();
        }
    }
    public static function bodyOrNull($key)
    {
        if(!isset(self::$body[$key]))
        {
            return null;
        }

        return self::$body[$key];
    }
    public static function addKeyBodyOrNull($key, array &$arr, bool &$safeCheck)
    {
        if(!isset(self::$body[$key]))
        {
            $safeCheck = false;

            return;
        }

        $arr[$key] = self::$body[$key];
    }
}
?>

Screenshot









5. Buat PPT presentasi yang menunjang Demo Aplikasi

Link Google Slide : Google Slide


6. Demokan aplikasi dengan membuat video dan diupload di Youtube.

Link Profile Youtube : Youtube



Comments

Popular posts from this blog

Pertemuan 13 OOP - Abstraksi & Simulasi Fox & Rabit

Pertemuan 6 KPPL - Implementasi Web ChatBot Tech Support System, Web & Prototipe & Metodologi

Pertemuan 11 PWEB - Membuat Website CRUD PHP MySQL