diff options
| author | Bobby <[email protected]> | 2025-09-24 18:44:44 +0530 |
|---|---|---|
| committer | Bobby <[email protected]> | 2025-09-24 18:44:44 +0530 |
| commit | a42336fec9c5ed6cd47e7dc0437c931ae06cfc0a (patch) | |
| tree | 79678ec3cb8913dc55513866e1f38c3eafd41c1a | |
| parent | effe1ba118911ea3f68c2c7256336ece4277dec2 (diff) | |
| download | thunderbird-ai-compose-server-a42336fec9c5ed6cd47e7dc0437c931ae06cfc0a.tar.xz thunderbird-ai-compose-server-a42336fec9c5ed6cd47e7dc0437c931ae06cfc0a.zip | |
created confid and add env loader
| -rw-r--r-- | config.go | 57 | ||||
| -rw-r--r-- | go.mod | 5 | ||||
| -rw-r--r-- | go.sum | 2 | ||||
| -rw-r--r-- | main.go | 41 | ||||
| -rw-r--r-- | types.go | 42 |
5 files changed, 107 insertions, 40 deletions
diff --git a/config.go b/config.go new file mode 100644 index 0000000..8629489 --- /dev/null +++ b/config.go @@ -0,0 +1,57 @@ +package main + +import ( + "log" + "os" + "strconv" + + "github.com/joho/godotenv" +) + +var Config ServerConfig + +func init() { + godotenv.Load() + + Config = ServerConfig{ + Port: getEnvAsInt("PORT"), + Provider: Provider(getEnv("PROVIDER")), + Model: getEnv("MODEL"), + APIKey: getEnv("API_KEY"), + } + + if Config.Port == 0 { + Config.Port = 3000 + } + + if Config.Provider == "" { + Config.Provider = Gemini + } + + if Config.Model == "" { + Config.Model = "gemini-2.5-flash" + } + + if Config.APIKey == "" { + log.Fatal("API_KEY environment variable is required") + } + + log.Printf("Configuration loaded: %+v\n", Config) +} + +func getEnv(key string) string { + if value, exists := os.LookupEnv(key); exists { + return value + } + + return "" +} + +func getEnvAsInt(key string) int { + valueStr := getEnv(key) + if value, err := strconv.Atoi(valueStr); err == nil { + return value + } + + return 0 +} @@ -2,7 +2,10 @@ module thunderbird-ai-compose-server go 1.25.1 -require github.com/gofiber/fiber/v2 v2.52.9 +require ( + github.com/gofiber/fiber/v2 v2.52.9 + github.com/joho/godotenv v1.5.1 +) require ( github.com/andybalholm/brotli v1.1.0 // indirect @@ -4,6 +4,8 @@ github.com/gofiber/fiber/v2 v2.52.9 h1:YjKl5DOiyP3j0mO61u3NTmK7or8GzzWzCFzkboyP5 github.com/gofiber/fiber/v2 v2.52.9/go.mod h1:YEcBbO/FB+5M1IZNBP9FO3J9281zgPAreiI1oqg8nDw= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0= +github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= github.com/klauspost/compress v1.17.9 h1:6KIumPrER1LHsvBVuDa0r5xaG0Es51mhhB9BQB2qeMA= github.com/klauspost/compress v1.17.9/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= @@ -2,56 +2,19 @@ package main import ( "log" - "time" "github.com/gofiber/fiber/v2" "github.com/gofiber/fiber/v2/middleware/cors" ) -type Identity struct { - ID string `json:"id,omitempty"` - Email string `json:"email,omitempty"` - Name string `json:"name,omitempty"` -} - -type ComposeDetails struct { - Subject string `json:"subject,omitempty"` - To []string `json:"to,omitempty"` - Cc []string `json:"cc,omitempty"` - Bcc []string `json:"bcc,omitempty"` - BodyPlain string `json:"bodyPlain,omitempty"` - BodyHTML string `json:"bodyHTML,omitempty"` - IdentityID string `json:"identityId,omitempty"` - IsHTML bool `json:"isHTML"` -} - -type ComposeContext struct { - Account Identity `json:"account"` - Compose ComposeDetails `json:"compose"` -} - -type Payload struct { - Prompt string `json:"prompt"` - Context ComposeContext `json:"context"` -} - func main() { app := fiber.New() - app.Use(cors.New(cors.Config{ - AllowOrigins: "*", - AllowMethods: "GET, HEAD, PUT, PATCH, POST, DELETE, OPTIONS", - AllowHeaders: "Origin, Content-Type, Accept, Authorization, X-Requested-With, X-API-Key, X-CSRF-Token", - ExposeHeaders: "Content-Length, Content-Type, Content-Disposition, X-Pagination, X-Total-Count", - MaxAge: 86400, - })) + app.Use(cors.New()) app.Post("/generate", func(c *fiber.Ctx) error { var payload Payload - // DEBUG: Simulate processing delay - time.Sleep(5 * time.Second) - if err := c.BodyParser(&payload); err != nil { return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{ "error": "Invalid request payload", @@ -64,6 +27,6 @@ func main() { }) }) - log.Println("Server is running on http://localhost:3000") + log.Printf("Starting server on port %d\n", Config.Port) log.Fatal(app.Listen(":3000")) } diff --git a/types.go b/types.go new file mode 100644 index 0000000..903705d --- /dev/null +++ b/types.go @@ -0,0 +1,42 @@ +package main + +type Provider string + +const ( + Gemini Provider = "gemini" + // OpenAI Provider = "openai" // TODO: Add support for OpenAI in the future +) + +type ServerConfig struct { + Port int + Provider Provider + Model string + APIKey string +} + +type Identity struct { + ID string `json:"id,omitempty"` + Email string `json:"email,omitempty"` + Name string `json:"name,omitempty"` +} + +type ComposeDetails struct { + Subject string `json:"subject,omitempty"` + To []string `json:"to,omitempty"` + Cc []string `json:"cc,omitempty"` + Bcc []string `json:"bcc,omitempty"` + BodyPlain string `json:"bodyPlain,omitempty"` + BodyHTML string `json:"bodyHTML,omitempty"` + IdentityID string `json:"identityId,omitempty"` + IsHTML bool `json:"isHTML"` +} + +type ComposeContext struct { + Account Identity `json:"account"` + Compose ComposeDetails `json:"compose"` +} + +type Payload struct { + Prompt string `json:"prompt"` + Context ComposeContext `json:"context"` +} |
