<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: amry maftuh</title>
    <description>The latest articles on DEV Community by amry maftuh (@amry_maftuh).</description>
    <link>https://dev.to/amry_maftuh</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1729428%2F610f01ab-b077-46a6-8b8b-4d7c87764280.jpg</url>
      <title>DEV Community: amry maftuh</title>
      <link>https://dev.to/amry_maftuh</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/amry_maftuh"/>
    <language>en</language>
    <item>
      <title>Saba Framework: Mempermudah Pekerjaan Frontend dan Backend Developer</title>
      <dc:creator>amry maftuh</dc:creator>
      <pubDate>Sat, 31 Aug 2024 09:28:59 +0000</pubDate>
      <link>https://dev.to/amry_maftuh/saba-framework-mempermudah-pekerjaan-frontend-dan-backend-developer-5e7k</link>
      <guid>https://dev.to/amry_maftuh/saba-framework-mempermudah-pekerjaan-frontend-dan-backend-developer-5e7k</guid>
      <description>&lt;p&gt;Perkenalkan, saya seorang programmer otodidak yang ingin berbagi pengalaman dalam membangun web aplikasi. Dari berbagai bidang yang saya pelajari seperti desain grafis, video editing, music production, software development, dan lainnya, menurut saya, pengembangan software adalah yang paling menantang. Prosesnya panjang dan melibatkan banyak hal yang harus dipelajari. Berdasarkan pengalaman saya, berikut adalah rangkuman perjalanan belajar dan produksi yang saya lalui:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Proses Belajar:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Memilih dan mempelajari bahasa SQL (MSSQL/MYSQL/POSTGRE).&lt;/li&gt;
&lt;li&gt;Memilih dan mempelajari bahasa pemrograman untuk backend (PYTHON/PHP/.NET/JAVA).&lt;/li&gt;
&lt;li&gt;Memilih dan mempelajari satu framework untuk backend (LARAVEL/FLASK/DJANGO/SPRING, dll).&lt;/li&gt;
&lt;li&gt;Mempelajari dasar-dasar yang diperlukan untuk frontend (HTML, CSS, JavaScript).&lt;/li&gt;
&lt;li&gt;Memilih dan mempelajari satu framework untuk frontend (REACT/VUE/ANGULAR/FLUTTER, dll).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Proses Produksi:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Backend + Database:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Menggunakan Python dengan framework Flask.&lt;/li&gt;
&lt;li&gt;Memilih SQLAlchemy sebagai ORM untuk query dan koneksi ke database.&lt;/li&gt;
&lt;li&gt;Menggunakan fitur migrasi agar semua query dan model dapat dilakukan di backend, sehingga RDBMS yang digunakan bisa bervariasi.&lt;/li&gt;
&lt;li&gt;Membuat struktur model otentikasi (users, roles, permission, dll).&lt;/li&gt;
&lt;li&gt;Membuat middleware untuk otentikasi (termasuk JWT).&lt;/li&gt;
&lt;li&gt;Menyiapkan routing dan endpoint Flask, serta merespons dengan format JSON agar dapat dikonsumsi oleh aplikasi frontend.&lt;/li&gt;
&lt;li&gt;Membuat dokumentasi API menggunakan Swagger untuk memudahkan kolaborasi dengan tim frontend.&lt;/li&gt;
&lt;li&gt;Dan masih banyak lagi…&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Frontend:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Memilih template yang responsif sesuai dengan framework yang dipilih, misalnya React.js.&lt;/li&gt;
&lt;li&gt;Menyesuaikan aset dan properti statis awal (logo, warna, nama aplikasi, hak cipta, warna dasar, dll).&lt;/li&gt;
&lt;li&gt;Mengonfigurasi interceptor Axios untuk mekanisme HTTP request ke API backend.&lt;/li&gt;
&lt;li&gt;Membuat state management menggunakan Redux untuk mengelola data dengan efisien dan memungkinkan data digunakan oleh komponen lain.&lt;/li&gt;
&lt;li&gt;Mengembangkan berbagai halaman CRUD, mulai dari tabel data yang menampilkan data, filtering, dan pagination.&lt;/li&gt;
&lt;li&gt;Menyesuaikan tabel sesuai kebutuhan, apakah perlu server-side rendering atau tidak.&lt;/li&gt;
&lt;li&gt;Mengatur hak akses terhadap tombol edit/delete/tambah pada tabel.&lt;/li&gt;
&lt;li&gt;Menyesuaikan kolom-kolom yang ditampilkan sesuai dengan jenis dan formatnya.&lt;/li&gt;
&lt;li&gt;Mengembangkan halaman atau modal untuk edit/tambah dengan formulir yang memiliki jenis input dan aturan yang berbeda-beda.&lt;/li&gt;
&lt;li&gt;Mengimplementasikan mekanisme untuk input yang saling berkaitan satu sama lain.&lt;/li&gt;
&lt;li&gt;Dan masih banyak lagi…&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Membangun aplikasi dari awal memang sangat melelahkan. Biasanya, saya mengandalkan copy-paste dari kode sumber lama untuk mempercepat proses. Namun, terkadang, saya harus mengganti template, menyesuaikan teknologi terbaru, atau bahasa pemrograman yang mengharuskan membangun aplikasi dari awal.&lt;/p&gt;

&lt;p&gt;Di era yang serba otomatis dengan teknologi AI ini, sangat melelahkan bagi developer frontend maupun backend untuk terus membangun aplikasi dari nol seperti yang saya alami. Lebih baik waktu tersebut digunakan untuk mempelajari hal lain yang sedang tren, seperti LLMs, Machine Learning, SEO optimizer, dan sebagainya. Teknologi AI terus berkembang pesat di tahun 2024 ini.&lt;/p&gt;

&lt;p&gt;Berdasarkan pengalaman tersebut, dan dengan dukungan instansi tempat saya bekerja, kami telah menciptakan sebuah CMS/Framework/Tools/Source bernama “Saba Framework” untuk membantu developer backend dan frontend agar lebih cepat dan mudah dalam produksi web app, tanpa harus belajar dari awal.&lt;/p&gt;

&lt;p&gt;Perlu dicatat, Saba Framework bukan untuk menggantikan proses belajar dasar pemrograman yang seharusnya dikuasai. Namun, seperti yang saya sebutkan tadi, lebih baik waktunya digunakan untuk mempelajari hal lain yang lebih relevan dengan perkembangan zaman.&lt;/p&gt;

&lt;p&gt;Saba Framework tersedia dalam dua versi: versi frontend yang dibangun menggunakan React.js, dan versi backend yang dibangun menggunakan Python (Flask). Kami merancang Saba Framework agar se-fleksibel mungkin, terutama untuk frontend, dengan berbagai kondisi form, tabel, dan lainnya.&lt;/p&gt;

&lt;p&gt;Untuk informasi lebih lanjut tentang Saba Framework, silakan kunjungi tautan berikut:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://saba-framework.gitbook.io/saba-framework-documentation-react-version" rel="noopener noreferrer"&gt;Dokumentasi Saba Framework — Versi React&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/amry666/saba_framework_frontend" rel="noopener noreferrer"&gt;GitHub Repository — Saba Framework Frontend&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.instagram.com/sabaframework/" rel="noopener noreferrer"&gt;Instagram — Saba Framework&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/@SabaFramework" rel="noopener noreferrer"&gt;YouTube Channel — Saba Framework&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://sabaframework.web.app/website/naxos/saba.html" rel="noopener noreferrer"&gt;Website — Saba Framework&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>sabaframework</category>
      <category>saba</category>
      <category>framework</category>
      <category>cms</category>
    </item>
    <item>
      <title>Cara Memanggil REST API dari SQL Server Menggunakan Store Procedure</title>
      <dc:creator>amry maftuh</dc:creator>
      <pubDate>Thu, 04 Jul 2024 11:56:06 +0000</pubDate>
      <link>https://dev.to/amry_maftuh/cara-memanggil-rest-api-dari-sql-server-menggunakan-prosedur-tersimpan-5ebn</link>
      <guid>https://dev.to/amry_maftuh/cara-memanggil-rest-api-dari-sql-server-menggunakan-prosedur-tersimpan-5ebn</guid>
      <description>&lt;p&gt;Halo teman-teman developer!&lt;/p&gt;

&lt;p&gt;Saya sangat senang berbagi dengan Anda sebuah skrip prosedur tersimpan yang memungkinkan Anda memanggil REST API langsung dari SQL Server. Ini bisa sangat berguna dalam berbagai skenario, seperti mengintegrasikan data eksternal ke dalam aplikasi Anda, memvalidasi data terhadap layanan pihak ketiga, atau mengotomatiskan tugas yang memerlukan komunikasi dengan API eksternal.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Apa yang akan Anda pelajari:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cara mengatur dan menggunakan OLE Automation dalam SQL Server&lt;/li&gt;
&lt;li&gt;Membuat prosedur tersimpan yang memanggil REST API dan mengembalikan hasilnya&lt;/li&gt;
&lt;li&gt;Menangani respon JSON dari API dan mengolahnya di dalam SQL Server&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Kelebihan Utama:&lt;/strong&gt;&lt;br&gt;
Salah satu kelebihan utama dari store procedure yang saya buat adalah kemampuannya untuk menggunakan nama kolom dan respon API yang dinamis. Dengan fitur ini, Anda hanya perlu memasukkan mapping antara nama respon API dan nama kolom tabel yang ingin dibentuk sebagai parameter. Ini membuat store procedure ini sangat fleksibel dan mudah digunakan dalam berbagai skenario.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Kegunaan:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Integrasi data eksternal ke dalam basis data SQL Server Anda&lt;/li&gt;
&lt;li&gt;Validasi data secara real-time menggunakan layanan pihak ketiga&lt;/li&gt;
&lt;li&gt;Otomatisasi tugas yang memerlukan akses ke API eksternal&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Detail Skrip:&lt;/strong&gt;&lt;br&gt;
Saya telah menyertakan skrip lengkap beserta penjelasan langkah demi langkah sehingga Anda dapat dengan mudah memahami dan mengimplementasikannya dalam proyek Anda sendiri. Anda akan menemukan bagaimana cara membuat dan mengkonfigurasi prosedur tersimpan yang memanggil REST API, serta contoh penggunaannya dalam berbagai kasus praktis.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Eksekusi script ini di database Anda, setelah di eksekusi pastikan store procedure ini "SP_REQUEST_TO_API" (atau anda bisa menggatinya) sudah terbentuk di database pada bagian store procedure.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Berikut Script untuk Store Procedure nya :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/****** Object:  StoredProcedure [dbo].[SP_REQUEST_TO_API]    Script Date: 03/07/2024 00:29:10 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:      &amp;lt;Author,,Amry Maftuh&amp;gt;
-- Create date: &amp;lt;Create Date,,2024-07-03&amp;gt;
-- Description: &amp;lt;Description,,GET DATA FROM API&amp;gt;
-- =============================================
ALTER PROCEDURE [dbo].[SP_REQUEST_TO_API]
    @URL NVARCHAR(MAX), -- Alamat URL yang akan di-request
    @RESP_KEY NVARCHAR(MAX), -- Nama key berupa array dari response yang mau diambil
    @METHOD NVARCHAR(MAX), -- HTTP method: GET/POST/PUT/DELETE
    @Mapping NVARCHAR(MAX) -- Mapping key-value dalam format 'RESPONSE_KEY1:COLUMN_NAME1,RESPONSE_KEY2:COLUMN_NAME2,...'
AS

    -------- TEST INPUT
    --DECLARE @URL NVARCHAR(MAX), @RESP_KEY NVARCHAR(MAX), @METHOD NVARCHAR(MAX), @Mapping NVARCHAR(MAX)
    --SET @URL = 'https://api-sekolah-indonesia.vercel.app/sekolah?sort_dir=desc&amp;amp;page=1&amp;amp;perPage=100'
    --SET @URL = 'https://reqres.in/api/users?page=1'
    --SET @RESP_KEY = 'dataSekolah'
    --SET @METHOD = 'GET'
    --SET @Mapping = 'sekolah:NAMA_SEKOLAH,bentuk:JENJANG,alamat_jalan:ALAMAT,lintang:LAT,bujur:LNG'

     ----   EXEC SP_REQUEST_TO_API 
     ----   @URL = 'https://api-sekolah-indonesia.vercel.app/sekolah?sort_dir=desc&amp;amp;page=1&amp;amp;perPage=100',
     ----   @RESP_KEY = 'dataSekolah',
     ----   @METHOD = 'GET',
     ----   @Mapping = 'sekolah:NAMA_SEKOLAH,bentuk:JENJANG,alamat_jalan:ALAMAT,lintang:LAT,bujur:LNG';
    --------


    SET NOCOUNT ON;

    EXEC sp_configure 'show advanced options', 1;
    RECONFIGURE;
    EXEC sp_configure 'Ole Automation Procedures', 1;
    RECONFIGURE;

    DECLARE @TOKEN INT;
    DECLARE @RET INT;
    DECLARE @JSON AS TABLE(JSON_TABLE NVARCHAR(MAX));
    DECLARE @MappingResponse TABLE (RESPONSE_KEY NVARCHAR(250), COLUMN_NAME NVARCHAR(250));

    DECLARE @MappingSplit TABLE (ITEM NVARCHAR(MAX));
    INSERT INTO @MappingSplit (ITEM)
    SELECT value FROM STRING_SPLIT(@Mapping, ',');

    INSERT INTO @MappingResponse (RESPONSE_KEY, COLUMN_NAME)
    SELECT 
        PARSENAME(REPLACE(ITEM, ':', '.'), 2) AS RESPONSE_KEY,
        PARSENAME(REPLACE(ITEM, ':', '.'), 1) AS COLUMN_NAME
    FROM @MappingSplit;

    EXEC @RET = sp_OACreate 'MSXML2.XMLHTTP', @TOKEN OUT;
    IF @RET &amp;lt;&amp;gt; 0 RAISERROR('Unable to open HTTP connection.', 10, 1);
    EXEC @RET = sp_OAMethod @TOKEN, 'open', NULL, @METHOD, @URL, 'false';
    EXEC @RET = sp_OAMethod @TOKEN, 'send';
    INSERT INTO @JSON (JSON_TABLE)
    EXEC sp_OAGetProperty @TOKEN, 'responseText';

    DECLARE @Columns NVARCHAR(MAX), @Columns_Keys NVARCHAR(MAX), @COLUMN_NAMES NVARCHAR(MAX), @RESPONSE_KEYS NVARCHAR(MAX);
    SELECT @Columns = STRING_AGG(CONCAT('[', COLUMN_NAME, '] NVARCHAR(2000)'), ', ') FROM @MappingResponse;
    SELECT @Columns_Keys = STRING_AGG(CONCAT('', COLUMN_NAME, ' NVARCHAR(2000) ''$.' + RESPONSE_KEY + ''''), ', ') FROM @MappingResponse;
    SELECT @COLUMN_NAMES = STRING_AGG(COLUMN_NAME, ', ') FROM @MappingResponse;
    SELECT @RESPONSE_KEYS = STRING_AGG(RESPONSE_KEY, ', ') FROM @MappingResponse;

    IF OBJECT_ID('tempdb..##TEMP_TABLE') IS NOT NULL
        DROP TABLE ##TEMP_TABLE;

    DECLARE @CreateTableQuery NVARCHAR(MAX);
    SET @CreateTableQuery = 'CREATE TABLE ##TEMP_TABLE (ROW_ID INT IDENTITY(1,1),' + @Columns + ');';
    EXEC sp_executesql @CreateTableQuery;

    DECLARE @InsertQuery NVARCHAR(MAX);
    DECLARE @JSON2 NVARCHAR(MAX);
    SET @JSON2 = (SELECT JSON_TABLE FROM @JSON);

    SET @InsertQuery = '
        INSERT INTO ##TEMP_TABLE (' + @COLUMN_NAMES + ')
        SELECT ' + @COLUMN_NAMES + '
        FROM OPENJSON(@JSON2, ''$.' + @RESP_KEY + ''') 
        WITH (' + @Columns_Keys + ');
    ';

    EXEC sp_executesql @InsertQuery, N'@JSON2 NVARCHAR(MAX)', @JSON2 = @JSON2;
    SELECT * FROM ##TEMP_TABLE;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;cara menggunakan nya seperti ini :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;       EXEC SP_REQUEST_TO_API 
        @URL = 'https://api-sekolah-indonesia.vercel.app/sekolah?sort_dir=desc&amp;amp;page=1&amp;amp;perPage=100',
        @RESP_KEY = 'dataSekolah',
        @METHOD = 'GET',
        @Mapping = 'sekolah:NAMA_SEKOLAH,bentuk:JENJANG,alamat_jalan:ALAMAT,lintang:LAT,bujur:LNG';
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Saya harap skrip ini bermanfaat bagi Anda dan membantu dalam mempermudah integrasi API eksternal dengan SQL Server Anda. Jangan ragu untuk meninggalkan komentar atau pertanyaan jika Anda memiliki kesulitan atau masukan.&lt;/p&gt;

&lt;p&gt;Selamat coding!&lt;/p&gt;

</description>
      <category>sqlserver</category>
      <category>restapi</category>
      <category>sqlserverapi</category>
      <category>sqlserverconsumeapi</category>
    </item>
  </channel>
</rss>
