initial commit

This commit is contained in:
2025-02-02 01:57:12 -07:00
commit 743ff93227
38 changed files with 4874 additions and 0 deletions

124
main.go Normal file
View File

@ -0,0 +1,124 @@
package main
import (
"fmt"
"log"
"net/http"
"time"
"github.com/gin-contrib/cors"
"github.com/gin-gonic/gin"
"gorm.io/driver/sqlite"
"gorm.io/gorm"
)
// Lead represents the basic lead information with JSON tags that include the ID.
type Lead struct {
ID uint `gorm:"primaryKey" json:"id"`
Name string `json:"name" binding:"required"`
Email string `json:"email" binding:"required,email"`
CreatedAt time.Time `json:"created_at"`
}
// Assessment stores the questionnaire responses and generated report.
type Assessment struct {
ID uint `gorm:"primaryKey" json:"id"`
LeadID uint `json:"lead_id"`
Answers string `json:"answers"` // JSON-encoded answers from the questionnaire.
Report string `json:"report"` // Generated assessment report.
CreatedAt time.Time `json:"created_at"`
}
func main() {
// Connect to SQLite.
db, err := gorm.Open(sqlite.Open("leads.db"), &gorm.Config{})
if err != nil {
log.Fatal("failed to connect to database:", err)
}
// Auto-migrate our schema.
if err := db.AutoMigrate(&Lead{}, &Assessment{}); err != nil {
log.Fatal("failed to migrate database:", err)
}
router := gin.Default()
// Provide CORS handling.
router.Use(cors.New(cors.Config{
AllowOrigins: []string{"http://localhost:5173", "http://localhost:8081"}, // adjust as needed
AllowMethods: []string{"GET", "POST", "PUT", "PATCH", "DELETE", "OPTIONS"},
AllowHeaders: []string{"Origin", "Content-Type", "Accept"},
ExposeHeaders: []string{"Content-Length"},
AllowCredentials: true,
MaxAge: 12 * time.Hour,
}))
// Lead creation endpoint.
router.POST("/api/leads", func(c *gin.Context) {
var lead Lead
if err := c.ShouldBindJSON(&lead); err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
return
}
result := db.Create(&lead)
if result.Error != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": "could not save lead"})
return
}
// Return the lead with its generated ID.
c.JSON(http.StatusOK, lead)
})
// Assessment endpoint.
router.POST("/api/assessments", func(c *gin.Context) {
var input struct {
LeadID uint `json:"lead_id" binding:"required"`
Answers map[string]any `json:"answers" binding:"required"`
}
if err := c.ShouldBindJSON(&input); err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
return
}
// Custom logic to generate the assessment report.
report := generateReport(input.Answers)
assessment := Assessment{
LeadID: input.LeadID,
Answers: stringifyAnswers(input.Answers),
Report: report,
}
result := db.Create(&assessment)
if result.Error != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": "could not save assessment"})
return
}
c.JSON(http.StatusOK, assessment)
})
router.Run(":8081")
}
// generateReport analyzes answers and returns a custom report.
func generateReport(answers map[string]any) string {
// This is a placeholder implementation.
strengths := []string{"Good posture", "High energy"}
areasToImprove := []string{"Lower back flexibility", "Core strength"}
return "Strengths: " + join(strengths) + "\nAreas for improvement: " + join(areasToImprove)
}
func join(items []string) string {
out := ""
for i, item := range items {
if i > 0 {
out += ", "
}
out += item
}
return out
}
// stringifyAnswers converts the answers map to a JSON string.
func stringifyAnswers(answers map[string]any) string {
return fmt.Sprintf("%v", answers)
}