feat: Initialize project with MySQL database and API for managing projects and technologies

- Created SQL script to set up database tables for projects and technologies.
- Added Docker Compose configuration for application and MySQL service.
- Implemented API endpoints for CRUD operations on technologies.
- Defined data types for projects and technologies.
- Established routing for API endpoints.
This commit is contained in:
2026-02-10 09:45:25 +01:00
parent 4335fd5cae
commit 4b5069d179
16 changed files with 615 additions and 178 deletions
+132 -62
View File
@@ -1,62 +1,132 @@
package requette
import (
"api_serveurless_go/bd"
"database/sql"
"log"
)
type Projet struct {
Id int `json:"id"`
Name string `json:"name"`
ShortDescription string `json:"shortdescription"`
}
func GetAllProjets() []Projet {
db := bd.GetDB()
stmt, err := db.Prepare("SELECT * FROM projet")
if err != nil {
log.Fatal(err)
}
row, err := stmt.Query()
defer stmt.Close()
if err != nil {
log.Fatal(err)
}
return hydrateProjets(row)
}
func GetProjetByID(id int) Projet {
db := bd.GetDB()
stmt, err := db.Prepare("SELECT * FROM projet WHERE id = ?")
if err != nil {
log.Fatal(err)
}
row := stmt.QueryRow(id)
defer stmt.Close()
return hydrateProjet(row)
}
func hydrateProjet(row *sql.Row) Projet {
var projet Projet
err := row.Scan(&projet.Id, &projet.Name, &projet.ShortDescription)
if err != nil {
log.Fatal(err)
}
return projet
}
func hydrateProjets(rows *sql.Rows) []Projet {
var projets []Projet
for rows.Next() {
var projet Projet
err := rows.Scan(&projet.Id, &projet.Name, &projet.ShortDescription)
if err != nil {
log.Fatal(err)
}
projets = append(projets, projet)
}
return projets
}
package requette
import (
"api_serveurless_go/bd"
"api_serveurless_go/types"
"database/sql"
"log"
"strings"
)
func GetAllProjets(nb int,page int) types.Projets {
db := bd.GetDB()
offset := (page - 1) * nb
stmt, err := db.Prepare("SELECT projet.id, projet.name, projet.shortdescriptionfr, GROUP_CONCAT(technologie.name SEPARATOR ',') as technologies FROM projet LEFT JOIN projet_technologie on projet.id = projet_technologie.projet_id LEFT JOIN technologie on projet_technologie.technologie_id = technologie.id GROUP BY projet.id, projet.name, projet.shortdescriptionfr LIMIT ? OFFSET ?")
if err != nil {
log.Fatal(err)
}
row, err := stmt.Query(nb, offset)
defer stmt.Close()
if err != nil {
log.Fatal(err)
}
stmt2, err := db.Prepare("SELECT count(*) FROM projet")
if err != nil {
log.Fatal(err)
}
row2, err := stmt2.Query()
defer stmt2.Close()
if err != nil {
log.Fatal(err)
}
var count int
for row2.Next() {
err := row2.Scan(&count)
if err != nil {
log.Fatal(err)
}
}
var projets types.Projets
projets.Projets = hydrateProjets(row)
projets.Count = count
return projets
}
func GetProjetByID(id int) types.ProjetFull {
db := bd.GetDB()
stmt, err := db.Prepare("SELECT id, name, shortdescriptionfr, longdescriptionfr, shortdescriptionen, longdescriptionen, linkGithub, linkWeb FROM projet WHERE id = ?")
if err != nil {
log.Fatal(err)
}
row := stmt.QueryRow(id)
defer stmt.Close()
return hydrateProjet(row)
}
func hydrateProjet(row *sql.Row) types.ProjetFull {
var projet types.ProjetFull
err := row.Scan(&projet.Id, &projet.Name, &projet.ShortDescriptionFr, &projet.LongDescriptionFr, &projet.ShortDescriptionEn, &projet.LongDescriptionEn, &projet.LinkGithub, &projet.LinkWeb)
if err != nil {
log.Fatal(err)
}
return projet
}
func hydrateProjets(rows *sql.Rows) []types.ProjetShort {
var projets []types.ProjetShort
for rows.Next() {
var projet types.ProjetShort
var techs sql.NullString
err := rows.Scan(&projet.Id, &projet.Name, &projet.ShortDescriptionFr, &techs)
if err != nil {
log.Fatal(err)
}
if techs.Valid && techs.String != "" {
projet.Technologies = strings.Split(techs.String, ",")
} else {
projet.Technologies = []string{}
}
projets = append(projets, projet)
}
return projets
}
func CreateProjet(projet types.Projetcreate) *types.Projetcreate {
db := bd.GetDB()
stmt, err := db.Prepare("INSERT INTO projet (name, shortdescriptionfr, longdescriptionfr, shortdescriptionen, longdescriptionen, linkGithub, linkWeb, datec) VALUES (?, ?, '', '', '', '', '', CURDATE())")
if err != nil {
log.Fatal(err)
}
_, err = stmt.Exec(projet.Name, projet.ShortDescription)
if err != nil {
log.Fatal(err)
return nil
}
defer stmt.Close()
return &projet
}
func UpdateProjet(projet types.ProjetFull) *types.ProjetFull {
db := bd.GetDB()
stmt, err := db.Prepare("UPDATE projet SET name = ?, shortdescriptionfr = ?, longdescriptionfr = ?, shortdescriptionen = ?, longdescriptionen = ?, linkGithub = ?, linkWeb = ? WHERE id = ?")
if err != nil {
log.Fatal(err)
}
_, err = stmt.Exec(projet.Name, projet.ShortDescriptionFr, projet.LongDescriptionFr, projet.ShortDescriptionEn, projet.LongDescriptionEn, projet.LinkGithub, projet.LinkWeb, projet.Id)
if err != nil {
log.Fatal(err)
return nil
}
defer stmt.Close()
return &projet
}
func DeleteProjet(id int) bool {
db := bd.GetDB()
stmt, err := db.Prepare("DELETE FROM projet WHERE id = ?")
if err != nil {
log.Fatal(err)
return false
}
_, err = stmt.Exec(id)
if err != nil {
log.Fatal(err)
return false
}
defer stmt.Close()
return true
}