# Set-up Cloud Storage Google Cloud Platform\*

**Prerequisites: Google Cloud Platform account!**

{% hint style="danger" %} <mark style="color:red;">**NOTĂ IMPORTANTĂ: Este posibil ca adresa dv IP să se schimbe și asfel BD nu vă va mai accepta cererile de conectare. În cazul în care acest lucru se întâmplă, adăugați noua dv adresa IP în whitelist (Connections - ADD NETWORK. Instrucțiunile sunt în aceasta pagină, pasul 1)**</mark>
{% endhint %}

## 1. Crearea , configurarea,  pornirea instanței

* Din consola Google Platform, accesați Serviciul SQL

![](/files/qsUMSAqJ2dswhN8G4tOn)

* În fereastra deschisa, selectați **Create an instance,** apoi **Choose MySQL**
* Configurati instanța (am inclus un exemplu de setari minime mai jos) și apăsați pe **Create instance**

![](/files/huQxXdUf4vvpzPWa0vFP)

* Crearea instanței poate dura câteva minute, wait up
* Creați un user nou

![](/files/PGynS9BRt3d5mdNIp2PO)

* Creați o baza de date nouă

![](/files/mXGbYBYxMywY7lSUKK8i)

* By default, din motive de securitate, accesul la instanța nou creată este restricționată. De aceea va trebui să adăugăm măcar un IP "sigur" în secțiunea Connections.
* Connections, Authorized networks, Add network, **Add your IP Adress (Google it) and a name**, **Save** and wait up

![](/files/Ot1P7z4w7uzjeKlNnkVs)

* Acum ne putem conecta la baza de date și crea tabele

<mark style="color:red;">**ATENȚIE:**</mark> Ar fi indicat să opriți instanța (STOP în overview tab) atunci când nu o folosiți pentru a evita consumul resurselor gratuite.

## 2. Configurarea Bazei de Date

Putem configura baza de date nou creată atât folosind Shell-ul pus la dispoziție de Google Cloud Platform, dar și utilizând un program mai user-friendly precum **MySQL Workbench** (sau orice alt instrument cu care sunteți obișnuiți). În continuare vom folosi MySQL Workbench.

* În MySQL Workbench, click Database, **Manage Connections...** , click **New**
* Denumiți conexiunea, adăugați adresa IP Publică a instanței nou create (o găsiți în Google Cloud Platform, Overview, în secțiunea Connect to this instance), adăugați numele și parola user-ului creat anterior. Click Test Connection și ar trebui să primiți un mesaj de succes. În caz contrar, verificați ca pașii de mai sus să fi fost parcuși corect (user creat, parola corecta, adresa IP publică e corecta, adresa voastră e inclusă în whitelist...)

![](/files/qcPyDPN8QaNvDZ7UBIUq)

* Dacă mesajul de Succes a apărut, click close, mergeți toolbar, **Database, Connect to Database,** selectați conexiunea voastră, click OK
* Se va deschide o consolă în care puteți face interogări. Pentru a vedea bazele de date disponibile, utilizați comanda "**show databases**". În lista bazelor de date va apărea și baza de date creată mai devreme
* Vom crea prima tabela și vom introduce 2 rânduri rulând următoarele comenzi

```
USE `cc-db`;

CREATE TABLE messages (
    entryID INT NOT NULL AUTO_INCREMENT, PRIMARY KEY(entryID),
    senderName VARCHAR(255), 
    senderMail VARCHAR(255), 
    receiverMail VARCHAR(255), 
    messageContent TEXT(65535)
    );
    
    INSERT INTO messages (senderName, senderMail, receiverMail, messageContent) values ("Popescu Ion", "popescu_ion@gmail.com", "popescu_ioana@gmail.com", "Hello!");
    INSERT INTO messages (senderName, senderMail, receiverMail, messageContent) values ("Popescu Ion", "popescu_ion@gmail.com", "popescu_ioana@gmail.com", "Hello hello hello!");
```

* Rulați **SELECT \* FROM messages;** pentru a verifica introducerea datelor cu succes.

## 3. Conectarea Bazei de Date la Back-end

Ultimul pas constă în conectarea Bazei de Date din Cloud la Back-end-ul creat anterior.

* În proiectul asociat Back-end-ului **creați un fișier .env** - acesta va fi utilizat pentru a stoca informațiile de conectare la baza de date (aceleași informații pe care le-ați folosit și la crearea conexiunii in SQL Workbench). Acestea <mark style="color:red;">**ATENȚIE:**</mark> Nu va fi urmărit de git și nu trebuie niciodată afișat public deoarece poate compromite securitatea bazei de date.

```
// .env
NODE_ENV=development

INSTANCE_HOST="..."
DB_PORT=3306
DB_USER="cc-cms-user" 
DB_PASS="..." 
DB_NAME="cc-db"
```

* **Instalați pachetele "mysql" si "dotenv"** (npm install ...) (Dotenv is a zero-dependency module that loads environment variables from a `.env` file into [`process.env`](https://nodejs.org/docs/latest/api/process.html#process_process_env))
* Pentru a păstra fișierul index.js cât mai curat, vom **crea un fișier nou, db.js** pentru a realiza conexiunea la baza de date.

```
// db.js
const mysql = require("mysql");
const dotenv = require("dotenv");
dotenv.config();

const connection = mysql.createConnection({
  host: process.env.INSTANCE_HOST,
  port: process.env.DB_PORT,
  user: process.env.DB_USER,
  password: process.env.DB_PASS,
  database: process.env.DB_NAME,
});

connection.connect(function (err) {
  if (!err) {
    console.log("Database is connected!");
  } else {
    console.log("Database is not connected... " + err);
  }
});

module.exports = connection;
```

* Puteți observa că informațiile pentru conectarea la BD sunt "protejate" prin utilizarea fișierului .env
* În fișierul index.js, includeți modulul creat anterior

```
const connection = require("./db.js");
```

* Putem folosi acum conexiunea creată pentru a defini primul endpoint al API-ului nostru pentru **metoda GET**. Vom folosi **metoda .query()** pentru a interoga baza de date și a primi toate rândurile din tabela "messages". La final, fișierul index.js va avea următorul cod

```
// index.js
const express = require("express");
const connection = require("./db.js");

const app = express();
const port = process.env.PORT || 8080;

app.listen(port, () => {
  console.log(`Example app listening on port ${port}!`);
});

app.get("/messages", (req, res) => {
  connection.query("SELECT * FROM messages", (err, results) => {
    if (err) {
      return res.send(err);
    }

    return res.json({
      data: results,
    });
  });
});
```

* Putem testa funcționalitatea creată cu ajutorul Postman

![](/files/LQlj96wg9azZq3KmzOVA)

* Putem introduce acum și endpoint-uri pentru alte metode...


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://gurita-alexandru.gitbook.io/cloud-computing-2023-simpre/cloudcomputing2022/set-up-cloud-storage-google-cloud-platform.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
