diff --git a/backend/.env-example b/.env-example similarity index 58% rename from backend/.env-example rename to .env-example index e0da1e7..332f0d4 100644 --- a/backend/.env-example +++ b/.env-example @@ -1,2 +1,4 @@ +# API key for chatgpt +CHATGPT_KEY=api key for chatgpt # This is secret key for jwt signature JWT_SECRET=just a random string here diff --git a/.gitignore b/.gitignore index 1269488..fdb27c3 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,3 @@ data +.DS_Store +.env diff --git a/backend/config/config.go b/backend/config/config.go index 1fed1db..91e7963 100644 --- a/backend/config/config.go +++ b/backend/config/config.go @@ -19,4 +19,5 @@ func LoadEnv() { Env["db"] = defaultValue(os.Getenv("POSTGRES_DB"), "postgresql://postgres:postgres@db:5432/cover-letter") Env["JWT_SECRET"] = defaultValue(os.Getenv("JWT_SECRET"), "just a random string here") Env["Environment"] = defaultValue(os.Getenv("Environment"), "dev") + Env["CHATGPT_KEY"] = defaultValue(os.Getenv("CHATGPT_KEY"), "") } diff --git a/backend/controllers/cover/cover.go b/backend/controllers/cover/cover.go new file mode 100644 index 0000000..170aecb --- /dev/null +++ b/backend/controllers/cover/cover.go @@ -0,0 +1,55 @@ +package cover + +import ( + "backend/models/template" + "backend/utils" + "backend/utils/jwt" + res "backend/utils/responses" + "net/http" + + "github.com/gin-gonic/gin" + "github.com/go-playground/validator/v10" +) + +var validate = validator.New() + +func Get(c *gin.Context) { +} + +type CoverPost struct { + TemplateId string `json:"templateId" validate:"required,number,min=1"` + Application string `json:"application" validate:"required,min=50"` +} + +func Post(c *gin.Context) { + // Receive data from frontend, check if data is okay, hash password, call model + var data CoverPost + if err := utils.BindAndValidate(&data, c); err != nil { + res.Error(c, err.Error(), http.StatusBadRequest) + return + } + + // Get user data from the token + user, err := jwt.GetUser(c) + if err != nil { + res.NeedsToLogin(c) + return + } + + // Get tempalte + templates, err := template.Get("user_id = $1 AND id = $2", user.Id, data.TemplateId) + if err != nil { + res.Error(c, err.Error(), http.StatusInternalServerError) + return + } + + // Call chat and ask for cover letter nicely + + res.Success(c, templates) +} + +func Put(c *gin.Context) { +} + +func Delete(c *gin.Context) { +} diff --git a/backend/routes/routes.go b/backend/routes/routes.go index d6fb9c9..3c1221e 100644 --- a/backend/routes/routes.go +++ b/backend/routes/routes.go @@ -1,6 +1,7 @@ package routes import ( + "backend/controllers/cover" "backend/controllers/template" "backend/controllers/user" "backend/middleware" @@ -29,5 +30,9 @@ func SetupRoutes() *gin.Engine { // PUT (Edit) // DELETE (Delete) + // Cover letter routes + covers := auth.Group("/cover") + covers.POST("", cover.Post) + return r } diff --git a/backend/utils/chatgpt/chatgpt.go b/backend/utils/chatgpt/chatgpt.go new file mode 100644 index 0000000..336a9b0 --- /dev/null +++ b/backend/utils/chatgpt/chatgpt.go @@ -0,0 +1 @@ +package chatgpt diff --git a/backend/utils/checkData.go b/backend/utils/checkData.go new file mode 100644 index 0000000..0ee8dae --- /dev/null +++ b/backend/utils/checkData.go @@ -0,0 +1,29 @@ +package utils + +import ( + "fmt" + + "github.com/gin-gonic/gin" + "github.com/go-playground/validator/v10" +) + +var validate = validator.New() + +func BindAndValidate(data any, c *gin.Context) error { + fmt.Println("🔍 BindAndValidate called") + + if err := c.ShouldBindJSON(data); err != nil { + fmt.Println("❌ Bind error:", err) + return err + } + + fmt.Println("✅ Bind success:", data) + + if err := validate.Struct(data); err != nil { + fmt.Println("❌ Validation error:", err) + return err + } + + fmt.Println("✅ Validation success") + return nil +} diff --git a/development.yml b/development.yml index ad16ffa..69a87f5 100644 --- a/development.yml +++ b/development.yml @@ -10,7 +10,7 @@ services: volumes: - "./backend:/app" env_file: - - ./backend/.env + - .env environment: # - GIN_MODE=release # For production - GIN_MODE=debug diff --git a/frontend/src/components/forms/Select.tsx b/frontend/src/components/forms/Select.tsx index 627666e..de905d8 100644 --- a/frontend/src/components/forms/Select.tsx +++ b/frontend/src/components/forms/Select.tsx @@ -28,8 +28,10 @@ export default function SelectField({ data, label, className = "" }: SelectProps )}