# Gumawa ng Banking App Bahagi 3: Mga Paraan ng Pagkuha at Paggamit ng Data Isipin ang computer ng Enterprise sa Star Trek - kapag tinanong ni Captain Picard ang status ng barko, agad na lumalabas ang impormasyon nang hindi nagre-restart o nagre-rebuild ang buong interface. Ang seamless na daloy ng impormasyon na iyon ang eksaktong ginagawa natin dito gamit ang dynamic na pagkuha ng data. Sa ngayon, ang iyong banking app ay parang isang naka-print na pahayagan - nagbibigay ng impormasyon pero static. Gagawin natin itong parang mission control sa NASA, kung saan tuloy-tuloy ang daloy ng data at nag-a-update nang real-time nang hindi naaabala ang workflow ng user. Matututo kang makipag-ugnayan sa mga server nang asynchronous, mag-handle ng data na dumarating sa iba't ibang oras, at gawing makabuluhan ang raw na impormasyon para sa iyong mga user. Ito ang pagkakaiba ng demo sa production-ready na software. ## β‘ Mga Magagawa Mo sa Susunod na 5 Minuto **Mabilisang Landas para sa Abalang Developer** ```mermaid flowchart LR A[β‘ 5 minutes] --> B[Set up API server] B --> C[Test fetch with curl] C --> D[Create login function] D --> E[See data in action] ``` - **Minuto 1-2**: I-start ang iyong API server (`cd api && npm start`) at i-test ang koneksyon - **Minuto 3**: Gumawa ng basic na `getAccount()` function gamit ang fetch - **Minuto 4**: I-wire up ang login form gamit ang `action="javascript:login()"` - **Minuto 5**: I-test ang login at panoorin ang account data na lumabas sa console **Mabilisang Test Commands**: ```bash # Verify API is running curl http://localhost:5000/api # Test account data fetch curl http://localhost:5000/api/accounts/test ``` **Bakit Mahalaga Ito**: Sa loob ng 5 minuto, makikita mo ang magic ng asynchronous data fetching na nagpapatakbo sa bawat modernong web application. Ito ang pundasyon na nagpaparamdam sa mga app na responsive at buhay. ## πΊοΈ Ang Iyong Learning Journey sa Data-Driven Web Applications ```mermaid journey title From Static Pages to Dynamic Applications section Understanding the Evolution Traditional page reloads: 3: You Discover AJAX/SPA benefits: 5: You Master Fetch API patterns: 7: You section Building Authentication Create login functions: 4: You Handle async operations: 6: You Manage user sessions: 8: You section Dynamic UI Updates Learn DOM manipulation: 5: You Build transaction displays: 7: You Create responsive dashboards: 9: You section Professional Patterns Template-based rendering: 6: You Error handling strategies: 7: You Performance optimization: 8: You ``` **Destinasyon ng Iyong Paglalakbay**: Sa pagtatapos ng araling ito, maiintindihan mo kung paano kumukuha, nagpoproseso, at nagpapakita ng data ang mga modernong web application nang dynamic, na lumilikha ng seamless na karanasan para sa user na inaasahan sa mga propesyonal na aplikasyon. ## Pre-Lecture Quiz [Pre-lecture quiz](https://ff-quizzes.netlify.app/web/quiz/45) ### Mga Kinakailangan Bago sumabak sa pagkuha ng data, siguraduhing handa ka sa mga sumusunod na components: - **Nakaraang Aralin**: Kumpletuhin ang [Login at Registration Form](../2-forms/README.md) - magtatayo tayo sa pundasyong ito - **Local Server**: I-install ang [Node.js](https://nodejs.org) at [patakbuhin ang server API](../api/README.md) para magbigay ng account data - **API Connection**: I-test ang koneksyon ng iyong server gamit ang command na ito: ```bash curl http://localhost:5000/api # Expected response: "Bank API v1.0.0" ``` Ang mabilisang test na ito ay nagsisiguro na ang lahat ng components ay maayos na nag-uusap: - Pinapatunayan na ang Node.js ay maayos na tumatakbo sa iyong sistema - Kinukumpirma na ang iyong API server ay aktibo at tumutugon - Pinapatunayan na ang iyong app ay maabot ang server (parang pag-check ng radio contact bago ang isang misyon) ## π§ Overview ng Data Management Ecosystem ```mermaid mindmap root((Data Management)) Authentication Flow Login Process Form Validation Credential Verification Session Management User State Global Account Object Navigation Guards Error Handling API Communication Fetch Patterns GET Requests POST Requests Error Responses Data Formats JSON Processing URL Encoding Response Parsing Dynamic UI Updates DOM Manipulation Safe Text Updates Element Creation Template Cloning User Experience Real-time Updates Error Messages Loading States Security Considerations XSS Prevention textContent Usage Input Sanitization Safe HTML Creation CORS Handling Cross-Origin Requests Header Configuration Development Setup ``` **Pangunahing Prinsipyo**: Ang mga modernong web application ay mga sistema ng data orchestration - pinagsasama-sama ang user interfaces, server APIs, at browser security models para makalikha ng seamless, responsive na karanasan. --- ## Pag-unawa sa Pagkuha ng Data sa Modernong Web Apps Ang paraan ng pag-handle ng data ng mga web application ay lubos na nag-evolve sa nakalipas na dalawang dekada. Ang pag-unawa sa ebolusyong ito ay makakatulong sa iyo na ma-appreciate kung bakit ang mga modernong teknolohiya tulad ng AJAX at Fetch API ay napakalakas at kung bakit sila naging mahalagang tools para sa mga web developer. Tuklasin natin kung paano gumagana ang mga tradisyunal na website kumpara sa mga dynamic, responsive na application na ginagawa natin ngayon. ### Tradisyunal na Multi-Page Applications (MPA) Noong unang panahon ng web, bawat click ay parang pagpapalit ng channel sa lumang telebisyon - magbablanko ang screen, tapos dahan-dahang maglo-load ang bagong content. Ganito ang realidad ng mga unang web application, kung saan bawat interaction ay nangangahulugan ng ganap na pag-rebuild ng buong page mula sa simula. ```mermaid sequenceDiagram participant User participant Browser participant Server User->>Browser: Clicks link or submits form Browser->>Server: Requests new HTML page Note over Browser: Page goes blank Server->>Browser: Returns complete HTML page Browser->>User: Displays new page (flash/reload) ```  **Bakit pakiramdam na clunky ang approach na ito:** - Bawat click ay nangangahulugan ng pag-rebuild ng buong page mula sa simula - Naiistorbo ang mga user sa gitna ng kanilang iniisip dahil sa mga nakakainis na page flashes - Ang iyong internet connection ay nagtatrabaho nang sobra sa pag-download ng parehong header at footer nang paulit-ulit - Ang mga app ay parang pag-click sa filing cabinet kaysa sa paggamit ng software ### Modernong Single-Page Applications (SPA) Binago ng AJAX (Asynchronous JavaScript and XML) ang paradigm na ito nang buo. Tulad ng modular na disenyo ng International Space Station, kung saan maaaring palitan ng mga astronaut ang mga indibidwal na components nang hindi nire-rebuild ang buong istruktura, pinapayagan tayo ng AJAX na i-update ang mga partikular na bahagi ng webpage nang hindi nire-reload ang lahat. Kahit na binabanggit ng pangalan ang XML, kadalasan ay JSON ang ginagamit natin ngayon, pero nananatili ang pangunahing prinsipyo: i-update lang ang kailangang baguhin. ```mermaid sequenceDiagram participant User participant Browser participant JavaScript participant Server User->>Browser: Interacts with page Browser->>JavaScript: Triggers event handler JavaScript->>Server: Fetches only needed data Server->>JavaScript: Returns JSON data JavaScript->>Browser: Updates specific page elements Browser->>User: Shows updated content (no reload) ```  **Bakit mas maganda ang pakiramdam ng SPAs:** - Ang mga bahagi lang na talagang nagbago ang na-update (matalino, di ba?) - Wala nang nakakagulat na interruptions - nananatili ang mga user sa kanilang flow - Mas kaunting data ang dumadaan sa wire kaya mas mabilis ang pag-load - Lahat ay pakiramdam na snappy at responsive, tulad ng mga app sa iyong telepono ### Ang Ebolusyon sa Modernong Fetch API Nagbibigay ang mga modernong browser ng [`Fetch` API](https://developer.mozilla.org/docs/Web/API/Fetch_API), na pumapalit sa mas lumang [`XMLHttpRequest`](https://developer.mozilla.org/docs/Web/API/XMLHttpRequest/Using_XMLHttpRequest). Tulad ng pagkakaiba ng paggamit ng telegraph at email, gumagamit ang Fetch API ng promises para sa mas malinis na asynchronous na code at natural na hinahandle ang JSON. | Feature | XMLHttpRequest | Fetch API | |---------|----------------|----------| | **Syntax** | Kumplikadong callback-based | Malinis na promise-based | | **JSON Handling** | Kinakailangang manual parsing | Built-in na `.json()` method | | **Error Handling** | Limitadong impormasyon sa error | Komprehensibong detalye ng error | | **Modern Support** | Legacy compatibility | ES6+ promises at async/await | > π‘ **Browser Compatibility**: Magandang balita - gumagana ang Fetch API sa lahat ng modernong browser! Kung curious ka sa mga partikular na bersyon, [caniuse.com](https://caniuse.com/fetch) ang may kumpletong compatibility story. > **Ang bottom line:** - Gumagana nang mahusay sa Chrome, Firefox, Safari, at Edge (karamihan sa mga lugar kung nasaan ang iyong mga user) - Ang Internet Explorer lang ang nangangailangan ng dagdag na tulong (at honestly, panahon na para bitawan ang IE) - Perpektong nakahanda para sa eleganteng async/await patterns na gagamitin natin mamaya ### Pag-implement ng User Login at Pagkuha ng Data Ngayon, i-implement natin ang login system na magta-transform sa iyong banking app mula sa static na display patungo sa functional na application. Tulad ng authentication protocols na ginagamit sa mga secure na pasilidad ng militar, i-verify natin ang user credentials at pagkatapos ay magbibigay ng access sa kanilang partikular na data. Gagawin natin ito nang paunti-unti, simula sa basic authentication at pagkatapos ay idagdag ang data-fetching capabilities. #### Hakbang 1: Gumawa ng Foundation ng Login Function Buksan ang iyong `app.js` file at magdagdag ng bagong `login` function. Ito ang magha-handle ng proseso ng user authentication: ```javascript async function login() { const loginForm = document.getElementById('loginForm'); const user = loginForm.user.value; } ``` **I-breakdown natin ito:** - Ang `async` keyword? Sinasabi nito sa JavaScript "hey, maaaring maghintay ang function na ito para sa mga bagay" - Kinukuha natin ang form mula sa page (walang fancy, hinahanap lang ito gamit ang ID nito) - Pagkatapos, kinukuha natin ang anumang tinype ng user bilang kanilang username - Narito ang isang neat na trick: maaari mong ma-access ang anumang form input gamit ang `name` attribute nito - walang kailangan na dagdag na getElementById calls! > π‘ **Form Access Pattern**: Ang bawat form control ay maaaring ma-access gamit ang name (na itinakda sa HTML gamit ang `name` attribute) bilang property ng form element. Nagbibigay ito ng malinis, readable na paraan para makuha ang form data. #### Hakbang 2: Gumawa ng Account Data Fetching Function Susunod, gagawa tayo ng dedikadong function para kunin ang account data mula sa server. Sinusunod nito ang parehong pattern ng iyong registration function pero nakatuon sa pagkuha ng data: ```javascript async function getAccount(user) { try { const response = await fetch('//localhost:5000/api/accounts/' + encodeURIComponent(user)); return await response.json(); } catch (error) { return { error: error.message || 'Unknown error' }; } } ``` **Narito ang nagagawa ng code na ito:** - **Gumagamit** ng modernong `fetch` API para mag-request ng data nang asynchronous - **Nagko-construct** ng GET request URL gamit ang username parameter - **Nag-aapply** ng `encodeURIComponent()` para ligtas na ma-handle ang special characters sa URLs - **Kinoconvert** ang response sa JSON format para sa madaling data manipulation - **Nagha-handle** ng errors nang maayos sa pamamagitan ng pagbalik ng error object sa halip na mag-crash > β οΈ **Security Note**: Ang `encodeURIComponent()` function ay nagha-handle ng special characters sa URLs. Tulad ng encoding systems na ginagamit sa naval communications, sinisiguro nito na ang iyong mensahe ay darating nang eksakto sa intended na paraan, pinipigilan ang mga character tulad ng "#" o "&" na ma-misinterpret. > **Bakit ito mahalaga:** - Pinipigilan ang special characters na masira ang URLs - Pinoprotektahan laban sa URL manipulation attacks - Sinisiguro na ang iyong server ay makakatanggap ng intended na data - Sumusunod sa secure coding practices #### Pag-unawa sa HTTP GET Requests Narito ang isang bagay na maaaring magulat ka: kapag ginamit mo ang `fetch` nang walang anumang extra options, awtomatikong gumagawa ito ng [`GET`](https://developer.mozilla.org/docs/Web/HTTP/Methods/GET) request. Perpekto ito para sa ginagawa natin - humihiling sa server "hey, maaari ko bang makita ang account data ng user na ito?" Isipin ang GET requests na parang magalang na paghingi ng libro sa library - humihiling ka na makita ang isang bagay na umiiral na. Ang POST requests (na ginamit natin para sa registration) ay mas katulad ng pagsusumite ng bagong libro para idagdag sa koleksyon. | GET Request | POST Request | |-------------|-------------| | **Layunin** | Kunin ang umiiral na data | Magpadala ng bagong data sa server | | **Parameters** | Sa URL path/query string | Sa request body | | **Caching** | Maaaring i-cache ng browsers | Hindi karaniwang naka-cache | | **Security** | Nakikita sa URL/logs | Nakatago sa request body | ```mermaid sequenceDiagram participant B as Browser participant S as Server Note over B,S: GET Request (Data Retrieval) B->>S: GET /api/accounts/test S-->>B: 200 OK + Account Data Note over B,S: POST Request (Data Submission) B->>S: POST /api/accounts + New Account Data S-->>B: 201 Created + Confirmation Note over B,S: Error Handling B->>S: GET /api/accounts/nonexistent S-->>B: 404 Not Found + Error Message ``` #### Hakbang 3: Pagsasama-sama ng Lahat Ngayon para sa satisfying na bahagi - i-connect natin ang iyong account fetching function sa login process. Dito nagkakaroon ng click ang lahat: ```javascript async function login() { const loginForm = document.getElementById('loginForm'); const user = loginForm.user.value; const data = await getAccount(user); if (data.error) { return console.log('loginError', data.error); } account = data; navigate('/dashboard'); } ``` Ang function na ito ay sumusunod sa malinaw na sequence: - Kunin ang username mula sa form input - I-request ang account data ng user mula sa server - I-handle ang anumang errors na mangyayari sa proseso - I-store ang account data at mag-navigate sa dashboard kapag successful > π― **Async/Await Pattern**: Dahil ang `getAccount` ay isang asynchronous function, ginagamit natin ang `await` keyword para i-pause ang execution hanggang sa tumugon ang server. Pinipigilan nito ang code na magpatuloy nang undefined ang data. #### Hakbang 4: Gumawa ng Tahanan para sa Iyong Data Ang iyong app ay nangangailangan ng lugar para maalala ang impormasyon ng account kapag na-load na ito. Isipin ito na parang short-term memory ng iyong app - isang lugar para panatilihing handy ang data ng kasalukuyang user. Magdagdag ng linyang ito sa itaas ng iyong `app.js` file: ```javascript // This holds the current user's account data let account = null; ``` **Bakit natin ito kailangan:** - Pinapanatili ang account data na accessible mula sa kahit saan sa iyong app - Ang pagsisimula sa `null` ay nangangahulugang "wala pang naka-login" - Na-update kapag may nag-login o nag-register nang matagumpay - Kumilos bilang single source of truth - walang kalituhan kung sino ang naka-login #### Hakbang 5: I-wire Up ang Iyong Form Ngayon, i-connect natin ang iyong bagong login function sa iyong HTML form. I-update ang iyong form tag nang ganito: ```html
``` **Ano ang ginagawa ng maliit na pagbabago na ito:** - Pinipigilan ang form na gawin ang default nitong "i-reload ang buong page" na behavior - Tumatawag sa iyong custom na JavaScript function sa halip - Pinapanatili ang lahat na smooth at single-page-app-like - Binibigyan ka ng kumpletong kontrol sa kung ano ang mangyayari kapag pinindot ng user ang "Login" #### Hakbang 6: Pagandahin ang Iyong Registration Function Para sa consistency, i-update ang iyong `register` function para rin mag-store ng account data at mag-navigate sa dashboard: ```javascript // Add these lines at the end of your register function account = result; navigate('/dashboard'); ``` **Ang enhancement na ito ay nagbibigay:** - **Seamless** na transition mula sa registration patungo sa dashboard - **Consistent** na user experience sa pagitan ng login at registration flows - **Immediate** na access sa account data pagkatapos ng matagumpay na registration #### Testing ng Iyong Implementation ```mermaid flowchart TD A[User enters credentials] --> B[Login function called] B --> C[Fetch account data from server] C --> D{Data received successfully?} D -->|Yes| E[Store account data globally] D -->|No| F[Display error message] E --> G[Navigate to dashboard] F --> H[User stays on login page] ``` **Panahon na para subukan ito:** 1. Gumawa ng bagong account para masigurado na gumagana ang lahat 2. Subukang mag-login gamit ang parehong credentials 3. Silipin ang console ng iyong browser (F12) kung may anumang tila mali 4. Siguraduhin na mapunta ka sa dashboard pagkatapos ng matagumpay na login Kung may hindi gumagana, huwag mag-panic! Karamihan sa mga isyu ay simpleng ayusin tulad ng typos o pagkalimot na i-start ang API server. #### Isang Mabilis na Salita Tungkol sa Cross-Origin Magic Maaaring iniisip mo: "Paano nakikipag-usap ang aking web app sa API server na tumatakbo sa iba't ibang ports?" Magandang tanong! Ito ay tumutukoy sa isang bagay na bawat web developer ay natutuklasan kalaunan. > π **Cross-Origin Security**: Ang mga browser ay nagpapatupad ng "same-origin policy" para pigilan ang hindi awtorisadong komunikasyon sa pagitan ng iba't ibang domain. Tulad ng checkpoint system sa Pentagon, tinitiyak nila na ang komunikasyon ay awtorisado bago payagan ang data transfer. > **Sa ating setup:** - Ang iyong web app ay tumatakbo sa `localhost:3000` (development server) - Ang iyong API server ay tumatakbo sa `localhost:5000` (backend server) - Ang API server ay naglalaman ng [CORS headers](https://developer.mozilla.org/docs/Web/HTTP/CORS) na tahasang nag-aawtorisa ng komunikasyon mula sa iyong web app Ang configuration na ito ay sumasalamin sa real-world development kung saan ang frontend at backend applications ay karaniwang tumatakbo sa magkahiwalay na server. > π **Matuto Pa**: Tuklasin ang higit pa tungkol sa APIs at data fetching gamit ang komprehensibong [Microsoft Learn module tungkol sa APIs](https://docs.microsoft.com/learn/modules/use-apis-discover-museum-art/?WT.mc_id=academic-77807-sagibbon). ## Pagdadala ng Iyong Data sa Buhay sa HTML Ngayon, gagawin nating visible sa mga user ang fetched data sa pamamagitan ng DOM manipulation. Tulad ng proseso ng pag-develop ng mga litrato sa darkroom, gagawin nating nakikita at interactive ang invisible na data. Ang manipulasyon ng DOM ay isang teknik na nagbabago sa mga static na web page upang maging dynamic na aplikasyon na nag-a-update ng kanilang nilalaman batay sa interaksyon ng user at tugon ng server. ### Pagpili ng Tamang Tool para sa Trabaho Kapag nag-a-update ng iyong HTML gamit ang JavaScript, may ilang opsyon kang magagamit. Isipin ang mga ito bilang iba't ibang kasangkapan sa toolbox - bawat isa ay perpekto para sa partikular na gawain: | Pamamaraan | Magaling para sa | Kailan ito gagamitin | Antas ng Kaligtasan | |------------|------------------|---------------------|---------------------| | `textContent` | Ligtas na pagpapakita ng data ng user | Tuwing nagpapakita ng teksto | β Napaka-ligtas | | `createElement()` + `append()` | Pagbuo ng masalimuot na layout | Paglikha ng mga bagong seksyon/listahan | β Napaka-ligtas | | `innerHTML` | Pag-set ng nilalaman ng HTML | β οΈ Iwasan hangga't maaari | β Mapanganib | #### Ang Ligtas na Paraan ng Pagpapakita ng Teksto: textContent Ang [`textContent`](https://developer.mozilla.org/docs/Web/API/Node/textContent) property ay ang iyong pinakamagandang kaibigan kapag nagpapakita ng data ng user. Para itong bouncer ng iyong webpage - walang mapanganib na makakapasok: ```javascript // The safe, reliable way to update text const balanceElement = document.getElementById('balance'); balanceElement.textContent = account.balance; ``` **Mga Benepisyo ng textContent:** - Itinuturing ang lahat bilang plain text (pinipigilan ang pag-execute ng script) - Awtomatikong nililinis ang umiiral na nilalaman - Epektibo para sa simpleng pag-update ng teksto - Nagbibigay ng built-in na seguridad laban sa mapanganib na nilalaman #### Paglikha ng Dynamic na HTML Elements Para sa mas masalimuot na nilalaman, pagsamahin ang [`document.createElement()`](https://developer.mozilla.org/docs/Web/API/Document/createElement) sa [`append()`](https://developer.mozilla.org/docs/Web/API/ParentNode/append) method: ```javascript // Safe way to create new elements const transactionItem = document.createElement('div'); transactionItem.className = 'transaction-item'; transactionItem.textContent = `${transaction.date}: ${transaction.description}`; container.append(transactionItem); ``` **Pag-unawa sa pamamaraang ito:** - **Lumilikha** ng bagong DOM elements nang programmatically - **Nagbibigay** ng buong kontrol sa mga attribute at nilalaman ng elemento - **Nagpapahintulot** ng masalimuot, nested na istruktura ng elemento - **Pinapanatili** ang seguridad sa pamamagitan ng paghihiwalay ng istruktura mula sa nilalaman > β οΈ **Pagsasaalang-alang sa Seguridad**: Bagama't ang [`innerHTML`](https://developer.mozilla.org/docs/Web/API/Element/innerHTML) ay madalas lumalabas sa mga tutorial, maaari itong mag-execute ng embedded scripts. Tulad ng mga protocol ng seguridad sa CERN na pumipigil sa hindi awtorisadong pag-execute ng code, ang paggamit ng `textContent` at `createElement` ay nagbibigay ng mas ligtas na alternatibo. > **Mga Panganib ng innerHTML:** - Nag-eexecute ng anumang `