Browse Source

remove file

loic boulet 1 month ago
parent
commit
2f35f8df16

+ 5 - 17
cmd/api/main.go

@@ -15,12 +15,10 @@ import (
 
 	"git.linuxforward.com/byom/byom-onboard/internal/common/jwt"
 	"git.linuxforward.com/byom/byom-onboard/internal/domain/billing"
-	"git.linuxforward.com/byom/byom-onboard/internal/domain/provisioning"
 	"git.linuxforward.com/byom/byom-onboard/internal/domain/register"
 	"git.linuxforward.com/byom/byom-onboard/internal/platform/config"
 	"git.linuxforward.com/byom/byom-onboard/internal/platform/database"
 	"git.linuxforward.com/byom/byom-onboard/internal/platform/mailer"
-	"git.linuxforward.com/byom/byom-onboard/internal/platform/middleware"
 )
 
 var (
@@ -82,16 +80,14 @@ func (s *ServeCmd) Run(cli *CLI) error {
 	// Initialize services
 	stripeClient := billing.NewStripeClient(cfg.Stripe.SecretKey, cfg.Stripe.WebhookSecret)
 	mailerClient := mailer.NewMailer(&cfg.Mailer)
-	ovhClient := provisioning.NewOvhClient(cfg.OVH.Endpoint, cfg.OVH.AppKey, cfg.OVH.AppSecret)
-	registrationService := register.NewRegistrationService(db, jwtClient)
+	//ovhClient := provisioning.NewOvhClient(cfg.OVH.Endpoint, cfg.OVH.AppKey, cfg.OVH.AppSecret)
 
 	// Initialize handlers
 	billingHandler := billing.NewHandler(stripeClient, db)
-	provisioningHandler := provisioning.NewHandler(ovhClient, db)
-	registerHandler := register.NewHandler(registrationService, mailerClient, db)
-
+	//provisioningHandler := provisioning.NewHandler(ovhClient, db)
+	registerHandler := register.NewHandler(mailerClient, db, jwtClient)
 	// Setup server
-	server := setupServer(r, billingHandler, provisioningHandler, registerHandler, cfg)
+	server := setupServer(r, billingHandler, registerHandler, cfg)
 	server.Addr = fmt.Sprintf(":%d", s.Port)
 
 	// Start server in a goroutine
@@ -122,7 +118,6 @@ func (s *ServeCmd) Run(cli *CLI) error {
 func setupServer(
 	r *gin.Engine,
 	billingHandler *billing.Handler,
-	provisioningHandler *provisioning.Handler,
 	registerHandler *register.Handler,
 	config *config.Config,
 ) *http.Server {
@@ -130,6 +125,7 @@ func setupServer(
 	api := r.Group("/api/v1")
 	{
 		// Public routes
+		api.POST("/check-email", registerHandler.CheckEmail)
 		api.POST("/register", registerHandler.Register)
 		api.GET("/validate-email", registerHandler.ValidateEmail)
 
@@ -137,14 +133,6 @@ func setupServer(
 		api.POST("/payment", billingHandler.CreatePayment)
 		api.POST("/payment/webhook", billingHandler.HandleWebhook)
 
-		// Admin routes
-		adminMiddleware := middleware.NewAdminMiddleware()
-		admin := api.Group("/admin", adminMiddleware.Middleware())
-		{
-			admin.GET("/vms", provisioningHandler.ListVPS)
-			admin.POST("/vms", provisioningHandler.AddVPS)
-			admin.GET("/provisioning/:id", provisioningHandler.GetVPSStatus)
-		}
 	}
 
 	return &http.Server{

+ 0 - 80
config.sample.yml

@@ -1,80 +0,0 @@
-# Server Configuration
-server:
-  address: "0.0.0.0:8080"
-  port: 8080
-  tls:
-    enabled: false
-    cert_file: ""
-    key_file: ""
-  timeouts:
-    read: "15s"
-    write: "15s"
-    idle: "60s"
-
-# Database Configuration
-database:
-  url: "byom.db"  # SQLite database file
-  max_open_conns: 25
-  max_idle_conns: 5
-  conn_max_lifetime: "1h"
-  conn_max_idle_time: "30m"
-
-# Stripe Configuration
-stripe:
-  secret_key: "sk_test_your_stripe_secret_key"
-  webhook_secret: "whsec_your_stripe_webhook_secret"
-  currency: "EUR"
-
-# OVH Configuration
-ovh:
-  endpoint: "ovh-eu"
-  app_key: "your_ovh_app_key"
-  app_secret: "your_ovh_app_secret"
-  consumer_key: ""  # Optional, if you're using consumer key authentication
-
-# Mailer Configuration
-mailer:
-  enabled: true
-  host: "smtp.example.com"
-  port: "587"
-  username: "noreply@yourdomain.com"
-  password: "your_smtp_password"
-  from: "BYOM Service <noreply@yourdomain.com>"
-  encryption: "tls"
-
-# Logging Configuration
-logging:
-  level: "info"  # debug, info, warn, error
-  format: "json"  # json or text
-  output: "stdout"  # stdout, file
-  file_path: "logs/byom.log"  # Only used if output is set to file
-
-# Security Configuration
-security:
-  allowed_origins:
-    - "http://localhost:3000"
-    - "https://yourdomain.com"
-  rate_limit:
-    enabled: true
-    requests: 100
-    duration: "1m"
-
-# Admin Configuration
-admin:
-  username: "admin"  # Change this in production
-  password: "admin"  # Change this in production
-
-# VPS Plans Configuration
-vps_plans:
-  basic:
-    name: "Basic"
-    specs: "1-2-40"  # CPU-RAM-Storage
-    max_instances: 100
-  pro:
-    name: "Pro"
-    specs: "2-4-80"
-    max_instances: 50
-  enterprise:
-    name: "Enterprise"
-    specs: "16-16-160"
-    max_instances: 25

+ 4 - 3
go.mod

@@ -48,11 +48,11 @@ require (
 	go.uber.org/atomic v1.9.0 // indirect
 	go.uber.org/multierr v1.9.0 // indirect
 	golang.org/x/arch v0.8.0 // indirect
-	golang.org/x/crypto v0.23.0 // indirect
+	golang.org/x/crypto v0.32.0 // indirect
 	golang.org/x/exp v0.0.0-20230905200255-921286631fa9 // indirect
 	golang.org/x/oauth2 v0.18.0 // indirect
-	golang.org/x/sys v0.20.0 // indirect
-	golang.org/x/text v0.15.0 // indirect
+	golang.org/x/sys v0.29.0 // indirect
+	golang.org/x/text v0.21.0 // indirect
 	google.golang.org/appengine v1.6.8 // indirect
 	google.golang.org/protobuf v1.34.1 // indirect
 	gopkg.in/ini.v1 v1.67.0 // indirect
@@ -64,6 +64,7 @@ require (
 	github.com/google/uuid v1.6.0
 	github.com/joho/godotenv v1.5.1
 	github.com/ovh/go-ovh v1.6.0
+	github.com/wneessen/go-mail v0.6.1
 	golang.org/x/net v0.25.0 // indirect
 	gorm.io/gorm v1.25.12
 )

+ 41 - 0
go.sum

@@ -39,6 +39,7 @@ github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg
 github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
 github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU=
 github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
 github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
 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=
@@ -112,6 +113,8 @@ github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS
 github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=
 github.com/ugorji/go/codec v1.2.12 h1:9LC83zGrHhuUA9l16C9AHXAqEV/2wBQ4nkvumAE65EE=
 github.com/ugorji/go/codec v1.2.12/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg=
+github.com/wneessen/go-mail v0.6.1 h1:cDGqlGuEEhdILRe53VFzmM9WBk8Xh/QMvbO0oxrNJB4=
+github.com/wneessen/go-mail v0.6.1/go.mod h1:G702XlFhzHV0Z4w9j2VsH5K9dJDvj0hx+yOOp1oX9vc=
 github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
 go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE=
 go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
@@ -122,22 +125,39 @@ golang.org/x/arch v0.8.0 h1:3wRIsP3pM4yUptoR96otTUOXI367OS0+c9eeRi9doIc=
 golang.org/x/arch v0.8.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys=
 golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
 golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
+golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc=
+golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU=
 golang.org/x/crypto v0.23.0 h1:dIJU/v2J8Mdglj/8rJ6UUOM3Zc9zLZxVZwwxMooUSAI=
 golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8=
+golang.org/x/crypto v0.32.0 h1:euUpcYgM8WcP71gNpTqQCn6rC2t6ULUPiOzfWaXVVfc=
+golang.org/x/crypto v0.32.0/go.mod h1:ZnnJkOaASj8g0AjIduWNlq2NRxL0PlBrbKVyZ6V/Ugc=
 golang.org/x/exp v0.0.0-20230905200255-921286631fa9 h1:GoHiUyI/Tp2nVkLI2mCxVkOjsbSXD66ic0XW0js0R9g=
 golang.org/x/exp v0.0.0-20230905200255-921286631fa9/go.mod h1:S2oDrQGGwySpoQPVqRShND87VCbxmc6bL1Yd2oYrm6k=
 golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
+golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
+golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
+golang.org/x/mod v0.15.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
+golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
 golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
 golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
 golang.org/x/net v0.0.0-20210520170846-37e1c6afe023/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
 golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
+golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
+golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
+golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk=
+golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44=
 golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac=
 golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM=
 golang.org/x/oauth2 v0.18.0 h1:09qnuIAgzdx1XplqJvW6CQqMCtGZykZWcXzPMPUusvI=
 golang.org/x/oauth2 v0.18.0/go.mod h1:Wf7knwG0MPoWIMMBgFlEaSUDaKskp0dCfrlJRJXbBi8=
 golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y=
+golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
+golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
+golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
 golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
@@ -146,21 +166,42 @@ golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBc
 golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
 golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y=
 golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
+golang.org/x/sys v0.29.0 h1:TPYlXGxvx1MGTn2GiZDhnjPA9wZzZeGKHHmKhHYvgaU=
+golang.org/x/sys v0.29.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
+golang.org/x/telemetry v0.0.0-20240228155512-f48c80bd79b2/go.mod h1:TeRTkGYfJXctD9OcfyVLyj2J3IxLnKwHJR8f4D8a3YE=
 golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
 golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
+golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
+golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=
+golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU=
+golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk=
+golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY=
+golang.org/x/term v0.28.0/go.mod h1:Sw/lC2IAUZ92udQNf3WodGtn4k/XoLyZoh8v/8uiwek=
 golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
 golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
 golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
 golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
 golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ=
+golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
+golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
+golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
+golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
 golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk=
 golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
+golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo=
+golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ=
 golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
+golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
+golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58=
+golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk=
 golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4=
 golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=

+ 5 - 0
internal/domain/register/email.go

@@ -36,6 +36,11 @@ func (s *registrationService) InitiateRegistration(user *models.User) error {
 		return err
 	}
 
+	// Send email
+	if err := s.SendEmail(); err != nil {
+		return err
+	}
+
 	return nil
 }
 

+ 68 - 9
internal/domain/register/handler.go

@@ -1,23 +1,25 @@
 package register
 
 import (
+	"git.linuxforward.com/byom/byom-onboard/internal/common/jwt"
 	"git.linuxforward.com/byom/byom-onboard/internal/common/models"
 	"git.linuxforward.com/byom/byom-onboard/internal/platform/database"
 	"git.linuxforward.com/byom/byom-onboard/internal/platform/mailer"
 	"github.com/gin-gonic/gin"
+	"github.com/google/uuid"
 )
 
 type Handler struct {
-	registrationService RegistrationService
-	mailer              *mailer.Mailer
-	db                  *database.Database
+	mailer *mailer.Mailer
+	db     *database.Database
+	jwt    *jwt.JWTClient
 }
 
-func NewHandler(client RegistrationService, mailerClient *mailer.Mailer, db *database.Database) *Handler {
+func NewHandler(mailerClient *mailer.Mailer, db *database.Database, jwt *jwt.JWTClient) *Handler {
 	return &Handler{
-		registrationService: client,
-		mailer:              mailerClient,
-		db:                  db,
+		mailer: mailerClient,
+		db:     db,
+		jwt:    jwt,
 	}
 }
 
@@ -28,7 +30,24 @@ func (h *Handler) Register(c *gin.Context) {
 		return
 	}
 
-	if err := h.registrationService.InitiateRegistration(&req); err != nil {
+	// Generate email token
+	token, err := h.jwt.GenerateEmailVerificationToken(req.Email)
+	if err != nil {
+		c.JSON(500, gin.H{"error": err.Error()})
+		return
+	}
+
+	req.Token = token
+	req.Status = false
+
+	// Save registration details to database
+	if err := h.db.RegisterUser(&req); err != nil {
+		c.JSON(500, gin.H{"error": err.Error()})
+		return
+	}
+
+	// Send email
+	if err := h.mailer.SendVerifyEmail(req.Email, token); err != nil {
 		c.JSON(500, gin.H{"error": err.Error()})
 		return
 	}
@@ -36,10 +55,50 @@ func (h *Handler) Register(c *gin.Context) {
 	c.JSON(200, gin.H{"message": "Registration initiated successfully"})
 }
 
+func (h *Handler) CheckEmail(c *gin.Context) {
+	var req models.User
+	if err := c.ShouldBindJSON(&req); err != nil {
+		c.JSON(400, gin.H{"error": err.Error()})
+		return
+	}
+
+	// Generate email token
+	token, err := h.jwt.GenerateEmailVerificationToken(req.Email)
+	if err != nil {
+		c.JSON(500, gin.H{"error": err.Error()})
+		return
+	}
+
+	req.ID = uuid.New().String()
+
+	req.Token = token
+	req.Status = false
+
+	// Save registration details to database
+	if err := h.db.RegisterUser(&req); err != nil {
+		c.JSON(500, gin.H{"error": err.Error()})
+		return
+	}
+
+	// Send email
+	if err := h.mailer.SendVerifyEmail(req.Email, token); err != nil {
+		c.JSON(500, gin.H{"error": err.Error()})
+		return
+	}
+
+	c.JSON(200, gin.H{"message": "Email sent successfully"})
+}
+
 func (h *Handler) ValidateEmail(c *gin.Context) {
 	token := c.Query("token")
 
-	result, err := h.registrationService.ValidateEmail(token)
+	result, err := h.jwt.VerifyEmailToken(token)
+	if err != nil {
+		c.JSON(400, gin.H{"error": err.Error()})
+		return
+	}
+
+	err = h.db.ChangeSubscriptionStatus(result)
 	if err != nil {
 		c.JSON(500, gin.H{"error": err.Error()})
 		return

+ 14 - 0
internal/platform/database/register.go

@@ -2,6 +2,7 @@ package database
 
 import (
 	"git.linuxforward.com/byom/byom-onboard/internal/common/models"
+	"github.com/google/uuid"
 )
 
 func (d *Database) RegisterUser(user *models.User) error {
@@ -14,6 +15,17 @@ func (d *Database) RegisterUser(user *models.User) error {
 	return nil
 }
 
+// Add function to verify email token using email and token
+func (d *Database) VerifyEmailToken(email, token string) error {
+	// Verify the email token
+	err := d.db.Where("email = ? AND token = ?", email, token).First(&models.User{}).Error
+	if err != nil {
+		return err
+	}
+
+	return nil
+}
+
 func (d *Database) ChangeSubscriptionStatus(email string) error {
 	// Change the status of the user to active
 	user, err := d.getUserByEmail(email)
@@ -21,6 +33,8 @@ func (d *Database) ChangeSubscriptionStatus(email string) error {
 		return err
 	}
 
+	user.ID = uuid.New().String()
+
 	user.Status = true
 
 	err = d.updateUser(user)

+ 109 - 42
internal/platform/mailer/mailer.go

@@ -2,46 +2,91 @@ package mailer
 
 import (
 	"bytes"
+	"fmt"
 	"html/template"
-	"net/smtp"
+	"log"
+
+	"github.com/wneessen/go-mail"
 
 	"git.linuxforward.com/byom/byom-onboard/internal/platform/config"
 )
 
 const welcomeEmailTemplate = `
-Bienvenue sur Byom!
-
-Votre application a été configurée avec succès et est prête à être utilisée.
-
-Informations d'accès :
----------------------
-Nom d'utilisateur : {{.Username}}
-Mot de passe : {{.Password}}
-
-URL de votre application :
---------------------------
-{{range .Subdomains}}
-
-{{.}}
-{{end}}
-Application principale : {{.WebAppURL}}
-
-Pour bien commencer :
----------------------
-{{.SetupGuide}}
-
-Pour des raisons de sécurité, nous vous recommandons de changer votre mot de passe lors de votre première connexion.
-
-Si vous avez besoin d'aide, n'hésitez pas à contacter notre équipe d'assistance.
-
-Cordialement,
-Byom
+<!DOCTYPE html>
+<html lang="fr">
+<head>
+	<meta charset="UTF-8">
+	<meta name="viewport" content="width=device-width, initial-scale=1.0">
+	<title>Bienvenue sur Byom!</title>
+	<style>
+		body {
+			font-family: Arial, sans-serif;
+			line-height: 1.6;
+			color: #333;
+		}
+		.container {
+			width: 80%;
+			margin: 0 auto;
+			padding: 20px;
+			border: 1px solid #ddd;
+			border-radius: 5px;
+			background-color: #f9f9f9;
+		}
+		h1 {
+			color: #0056b3;
+		}
+		.info {
+			margin-bottom: 20px;
+		}
+		.info p {
+			margin: 5px 0;
+		}
+		.subdomains {
+			margin-bottom: 20px;
+		}
+		.subdomains p {
+			margin: 5px 0;
+		}
+		.footer {
+			margin-top: 20px;
+			font-size: 0.9em;
+			color: #777;
+		}
+	</style>
+</head>
+<body>
+	<div class="container">
+		<h1>Bienvenue sur Byom!</h1>
+		<p>Votre application a été configurée avec succès et est prête à être utilisée.</p>
+		<div class="info">
+			<h2>Informations d'accès :</h2>
+			<p><strong>Nom d'utilisateur :</strong> {{.Username}}</p>
+			<p><strong>Mot de passe :</strong> {{.Password}}</p>
+		</div>
+		<div class="subdomains">
+			<h2>URL de votre application :</h2>
+			{{range .Subdomains}}
+			<p>{{.}}</p>
+			{{end}}
+			<p><strong>Application principale :</strong> {{.WebAppURL}}</p>
+		</div>
+		<div class="setup-guide">
+			<h2>Pour bien commencer :</h2>
+			<p>{{.SetupGuide}}</p>
+		</div>
+		<div class="footer">
+			<p>Pour des raisons de sécurité, nous vous recommandons de changer votre mot de passe lors de votre première connexion.</p>
+			<p>Si vous avez besoin d'aide, n'hésitez pas à contacter notre équipe d'assistance.</p>
+			<p>Cordialement,<br>Byom</p>
+		</div>
+	</div>
+</body>
+</html>
 `
 
 type Mailer struct {
-	auth       *smtp.Auth
-	serverAddr string
-	from       string
+	client *mail.Client
+	from   string
 }
 
 type EmailData struct {
@@ -54,19 +99,21 @@ type EmailData struct {
 
 func NewMailer(config *config.MailerConfig) *Mailer {
 
-	auth := smtp.PlainAuth(
-		config.Identity,
-		config.Username,
-		config.Password,
-		config.Host,
-	)
+	log.Printf("Test mail successfully delivered.")
 
-	serverAddr := config.Host + ":" + config.Port
+	fmt.Println(config)
+
+	client, err := mail.NewClient(config.Host,
+		mail.WithSMTPAuth(mail.SMTPAuthPlain), mail.WithTLSPortPolicy(mail.DefaultTLSPolicy),
+		mail.WithUsername(config.Username), mail.WithPassword(config.Password),
+	)
+	if err != nil {
+		log.Fatalf("Failed to create mail client: %v", err)
+	}
 
 	return &Mailer{
-		auth:       &auth,
-		serverAddr: serverAddr,
-		from:       config.Username,
+		client: client,
+		from:   config.From,
 	}
 }
 
@@ -81,5 +128,25 @@ func (m *Mailer) SendEmail(to string, data *EmailData) error {
 
 	body := tpl.String()
 
-	return smtp.SendMail(m.serverAddr, *m.auth, m.from, []string{to}, []byte(body))
+	message := mail.NewMsg()
+	message.From(m.from)
+	message.To(to)
+	message.Subject("Bienvenue sur BYOM!")
+	message.SetBodyString(mail.TypeTextHTML, body)
+	message.ReplyTo(m.from)
+
+	return m.client.DialAndSend(message)
+}
+
+func (m *Mailer) SendVerifyEmail(to, token string) error {
+
+	message := mail.NewMsg()
+	message.From(m.from)
+	message.To(to)
+	message.Subject("Vérification de votre adresse email")
+	message.SetBodyString(mail.TypeTextHTML, "Cliquez sur le lien suivant pour vérifier votre adresse email: http://localhost:8080/verify-email?token="+token)
+	message.ReplyTo(m.from)
+
+	return m.client.DialAndSend(message)
+
 }