first commit

This commit is contained in:
2025-09-12 12:38:11 +02:00
commit 0db2fd0314
46 changed files with 23221 additions and 0 deletions

138
backend/cmd/server/main.go Normal file
View File

@@ -0,0 +1,138 @@
package main
import (
"log"
"project-dashboard/api"
"project-dashboard/middleware"
"project-dashboard/models"
"github.com/gin-contrib/cors"
"github.com/gin-gonic/gin"
)
func main() {
// Initialize database
models.InitDB()
defer models.CloseDB()
// Create default admin user if not exists
createDefaultAdmin()
// Set Gin mode
gin.SetMode(gin.ReleaseMode)
// Create Gin router
r := gin.Default()
// Configure CORS
config := cors.DefaultConfig()
config.AllowOrigins = []string{"http://localhost:3000", "http://localhost:3001"}
config.AllowMethods = []string{"GET", "POST", "PUT", "DELETE", "OPTIONS"}
config.AllowHeaders = []string{"Origin", "Content-Type", "Accept", "Authorization", "X-Requested-With"}
config.AllowCredentials = true
r.Use(cors.New(config))
// Serve static files
r.Static("/uploads", "./uploads")
// Health check endpoint
r.GET("/health", func(c *gin.Context) {
c.JSON(200, gin.H{
"status": "ok",
"message": "Project Dashboard API is running",
})
})
// API routes
v1 := r.Group("/api/v1")
{
// Authentication routes
auth := v1.Group("/auth")
{
auth.POST("/register", api.Register)
auth.POST("/login", api.Login)
auth.GET("/profile", middleware.AuthMiddleware(), api.GetProfile)
auth.PUT("/profile", middleware.AuthMiddleware(), api.UpdateProfile)
auth.PUT("/change-password", middleware.AuthMiddleware(), api.ChangePassword)
}
// Project routes
projects := v1.Group("/projects")
projects.Use(middleware.AuthMiddleware())
{
projects.POST("", api.CreateProject)
projects.GET("", api.GetProjects)
// Project-specific routes
project := projects.Group("/:project_id")
project.Use(middleware.ProjectAccessMiddleware())
{
project.GET("", api.GetProject)
project.PUT("", api.UpdateProject)
project.DELETE("", api.DeleteProject)
// Project members
project.POST("/members", api.AddMember)
project.DELETE("/members/:user_id", api.RemoveMember)
// Tasks
project.POST("/tasks", api.CreateTask)
project.GET("/tasks", api.GetTasks)
task := project.Group("/tasks/:task_id")
{
task.GET("", api.GetTask)
task.PUT("", api.UpdateTask)
task.DELETE("", api.DeleteTask)
// Task comments
task.POST("/comments", api.AddComment)
// Task subtasks
task.POST("/subtasks", api.CreateSubtask)
}
// Files
project.POST("/files", api.UploadFile)
project.GET("/files", api.GetFiles)
file := project.Group("/files/:file_id")
{
file.GET("", api.DownloadFile)
file.DELETE("", api.DeleteFile)
}
}
}
}
// Start server
log.Println("Starting server on :8080")
if err := r.Run(":8080"); err != nil {
log.Fatal("Failed to start server:", err)
}
}
func createDefaultAdmin() {
var admin models.User
if err := models.GetDB().Where("email = ?", "admin@example.com").First(&admin).Error; err != nil {
// Create default admin user
admin = models.User{
Email: "admin@example.com",
FirstName: "Admin",
LastName: "User",
Role: "admin",
}
if err := admin.HashPassword("admin123"); err != nil {
log.Printf("Failed to hash admin password: %v", err)
return
}
if err := models.GetDB().Create(&admin).Error; err != nil {
log.Printf("Failed to create admin user: %v", err)
return
}
log.Println("Default admin user created: admin@example.com / admin123")
}
}