aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBobby <[email protected]>2025-09-24 18:44:44 +0530
committerBobby <[email protected]>2025-09-24 18:44:44 +0530
commita42336fec9c5ed6cd47e7dc0437c931ae06cfc0a (patch)
tree79678ec3cb8913dc55513866e1f38c3eafd41c1a
parenteffe1ba118911ea3f68c2c7256336ece4277dec2 (diff)
downloadthunderbird-ai-compose-server-a42336fec9c5ed6cd47e7dc0437c931ae06cfc0a.tar.xz
thunderbird-ai-compose-server-a42336fec9c5ed6cd47e7dc0437c931ae06cfc0a.zip
created confid and add env loader
-rw-r--r--config.go57
-rw-r--r--go.mod5
-rw-r--r--go.sum2
-rw-r--r--main.go41
-rw-r--r--types.go42
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
+}
diff --git a/go.mod b/go.mod
index 2229fb3..d742779 100644
--- a/go.mod
+++ b/go.mod
@@ -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
diff --git a/go.sum b/go.sum
index 339ed77..1ac26d0 100644
--- a/go.sum
+++ b/go.sum
@@ -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=
diff --git a/main.go b/main.go
index 548a3e9..cc0fef7 100644
--- a/main.go
+++ b/main.go
@@ -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"`
+}