Skip to content

Commit 2f59cb2

Browse files
committed
add export functionality for projects to CSV
1 parent 5ad40b6 commit 2f59cb2

File tree

2 files changed

+48
-0
lines changed

2 files changed

+48
-0
lines changed

internal/handlers/projects.go

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
package handlers
22

33
import (
4+
"encoding/csv"
5+
"fmt"
46
"log"
57
"net/http"
68
"portfolio-backend/internal/db"
79
"portfolio-backend/internal/models"
10+
"strings"
811

912
"github.com/gin-gonic/gin"
1013
)
@@ -160,3 +163,45 @@ func FavoriteProjectHandler(c *gin.Context) {
160163

161164
c.Status(http.StatusNoContent)
162165
}
166+
167+
func ExportProjectsToCSVHandler(c *gin.Context) {
168+
user := c.MustGet("user").(models.User)
169+
170+
var projects []models.Project
171+
if err := db.DB.Where("user_id = ?", user.ID).Find(&projects).Error; err != nil {
172+
c.JSON(http.StatusInternalServerError, gin.H{"error": "Erro ao buscar projetos"})
173+
log.Println("Erro ao buscar projetos:", err)
174+
return
175+
}
176+
177+
var csvContent []string
178+
csvContent = append(csvContent, "ID,Nome,Descrição,Status,Repo URL,Tecnologias,Data de Criação")
179+
180+
for _, project := range projects {
181+
line := fmt.Sprintf("%s,%s,%s,%s,%s,%s,%s",
182+
project.ID.String(),
183+
project.Name,
184+
project.Description,
185+
project.Status,
186+
project.GitHubUrl,
187+
strings.Join(project.TechStack, "|"),
188+
project.CreatedAt.Format("2006-01-02 15:04:05"),
189+
)
190+
csvContent = append(csvContent, line)
191+
}
192+
193+
c.Header("Content-Type", "text/csv")
194+
c.Header("Content-Disposition", "attachment;filename=projetos.csv")
195+
c.Writer.WriteHeader(http.StatusOK)
196+
csvWriter := csv.NewWriter(c.Writer)
197+
198+
for _, line := range csvContent {
199+
record := strings.Split(line, ",")
200+
if err := csvWriter.Write(record); err != nil {
201+
c.JSON(http.StatusInternalServerError, gin.H{"error": "Erro ao gerar CSV"})
202+
log.Println("Erro ao escrever no CSV:", err)
203+
return
204+
}
205+
}
206+
csvWriter.Flush()
207+
}

internal/routes/routes.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,10 @@ func SetupRoutes(r *gin.Engine) {
2222
projects.GET("/:id", handlers.GetOneProjectHandler)
2323
projects.PUT("/:id", handlers.UpdateProjectHandler)
2424
projects.DELETE("/:id", handlers.DeleteProjectHandler)
25+
2526
projects.PATCH("/:id/favorite", handlers.FavoriteProjectHandler)
27+
28+
projects.GET("/export/csv", handlers.ExportProjectsToCSVHandler)
2629
}
2730
}
2831
}

0 commit comments

Comments
 (0)