diff --git a/apps/auth/internal/app/app.go b/apps/auth/internal/app/app.go
index a73d828f4..6a1efe60e 100644
--- a/apps/auth/internal/app/app.go
+++ b/apps/auth/internal/app/app.go
@@ -2,17 +2,12 @@ package app
import (
"context"
- "github.com/kloudlite/api/apps/auth/internal/entities"
-
"github.com/99designs/gqlgen/graphql"
"github.com/gofiber/fiber/v2"
- "github.com/kloudlite/api/pkg/nats"
- "go.uber.org/fx"
- "google.golang.org/grpc"
-
"github.com/kloudlite/api/apps/auth/internal/app/graph"
"github.com/kloudlite/api/apps/auth/internal/app/graph/generated"
"github.com/kloudlite/api/apps/auth/internal/domain"
+ "github.com/kloudlite/api/apps/auth/internal/entities"
"github.com/kloudlite/api/apps/auth/internal/env"
"github.com/kloudlite/api/common"
"github.com/kloudlite/api/constants"
@@ -20,7 +15,10 @@ import (
"github.com/kloudlite/api/grpc-interfaces/kloudlite.io/rpc/comms"
httpServer "github.com/kloudlite/api/pkg/http-server"
"github.com/kloudlite/api/pkg/kv"
+ "github.com/kloudlite/api/pkg/nats"
"github.com/kloudlite/api/pkg/repos"
+ "go.uber.org/fx"
+ "google.golang.org/grpc"
)
type CommsClientConnection *grpc.ClientConn
diff --git a/apps/auth/internal/domain/domain.go b/apps/auth/internal/domain/domain.go
index 7419a7bab..b752dd56a 100644
--- a/apps/auth/internal/domain/domain.go
+++ b/apps/auth/internal/domain/domain.go
@@ -3,7 +3,6 @@ package domain
import (
"context"
"github.com/kloudlite/api/apps/auth/internal/entities"
-
"github.com/kloudlite/api/common"
"github.com/kloudlite/api/pkg/repos"
)
diff --git a/apps/comms/email-templates/contact-us/email.html b/apps/comms/email-templates/contact-us/email.html
new file mode 100644
index 000000000..3a32602a4
--- /dev/null
+++ b/apps/comms/email-templates/contact-us/email.html
@@ -0,0 +1,177 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+ |
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+ Hello {{.Name}},
+ |
+
+
+ |
+ I’m Karthik, the founder of Kloudlite Inc and I’d like to personally thank you for contacting us.
+ |
+
+
+ |
+ We have received your details and our team will get back to you shortly.
+ |
+
+
+ |
+ Best Regards,
+ |
+
+
+ |
+ Karthik
+ |
+
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+
diff --git a/apps/comms/email-templates/contact-us/email.mjml b/apps/comms/email-templates/contact-us/email.mjml
new file mode 100644
index 000000000..1083e32fb
--- /dev/null
+++ b/apps/comms/email-templates/contact-us/email.mjml
@@ -0,0 +1,32 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Hello {{.Name}},
+
+
+ I’m Karthik, the founder of Kloudlite Inc and I’d like to personally thank you for contacting us.
+
+
+ We have received your details and our team will get back to you shortly.
+
+
+ Best Regards,
+
+
+ Karthik
+
+
+
+
+
+
diff --git a/apps/comms/email-templates/contact-us/email.txt b/apps/comms/email-templates/contact-us/email.txt
new file mode 100644
index 000000000..adb60115d
--- /dev/null
+++ b/apps/comms/email-templates/contact-us/email.txt
@@ -0,0 +1,8 @@
+Hello {{.Name}},
+
+I’m Karthik, the founder of Kloudlite Inc and I’d like to personally thank you for contacting us.
+
+We have received your details and our team will get back to you shortly.
+
+Best Regards,
+Karthik
diff --git a/apps/comms/internal/app/grpc-server.go b/apps/comms/internal/app/grpc-server.go
index 9e9a88e64..c861d553c 100644
--- a/apps/comms/internal/app/grpc-server.go
+++ b/apps/comms/internal/app/grpc-server.go
@@ -206,6 +206,36 @@ func (r *commsSvc) SendVerificationEmail(ctx context.Context, input *comms.Verif
}
return &comms.Void{}, nil
}
+
+func (r *commsSvc) SendContactUsEmail(ctx context.Context, input *comms.SendContactUsEmailInput) (*comms.Void, error) {
+ plainText := new(bytes.Buffer)
+ args := map[string]any{
+ "Name": func() string {
+ if input.Name != "" {
+ return input.Name
+ }
+ return "there"
+ }(),
+ "CompanyName": input.CompanyName,
+ "Country": input.Country,
+ "Message": input.Message,
+ }
+
+ if err := r.eTemplattes.ContactUsEmail.PlainText.Execute(plainText, args); err != nil {
+ return nil, errors.NewEf(err, "failed to execute plain text template")
+ }
+
+ html := new(bytes.Buffer)
+ if err := r.eTemplattes.ContactUsEmail.Html.Execute(html, args); err != nil {
+ return nil, errors.NewEf(err, "failed to execute html template")
+ }
+
+ if err := r.sendSupportEmail(ctx, r.eTemplattes.ContactUsEmail.Subject, input.Email, input.Name, plainText.String(), html.String()); err != nil {
+ return nil, errors.NewE(err)
+ }
+ return &comms.Void{}, nil
+}
+
func newCommsSvc(mailer mail.Mailer, ev *env.Env, et *domain.EmailTemplates) comms.CommsServer {
return &commsSvc{
mailer: mailer,
diff --git a/apps/comms/internal/domain/mail-parser.go b/apps/comms/internal/domain/mail-parser.go
index 5f4ad5a18..9a2deaa4f 100644
--- a/apps/comms/internal/domain/mail-parser.go
+++ b/apps/comms/internal/domain/mail-parser.go
@@ -26,6 +26,7 @@ type EmailTemplates struct {
WelcomeEmail *EmailTemplate
WaitingEmail *EmailTemplate
AlertEmail *EmailTemplate
+ ContactUsEmail *EmailTemplate
}
func parseMailTemplate(et EmailTemplatesDir, templateName string, subject string) (*EmailTemplate, error) {
@@ -85,6 +86,11 @@ func GetEmailTemplates(et EmailTemplatesDir) (*EmailTemplates, error) {
return nil, err
}
+ contactUs, err := parseMailTemplate(et, "contact-us", "[Kloudlite] Contact Us")
+ if err != nil {
+ return nil, err
+ }
+
alert, err := parseMailTemplate(et, "alert", "[Kloudlite] Console Notification")
return &EmailTemplates{
@@ -94,6 +100,7 @@ func GetEmailTemplates(et EmailTemplatesDir) (*EmailTemplates, error) {
UserVerificationEmail: userVerification,
WelcomeEmail: welcome,
WaitingEmail: waiting,
+ ContactUsEmail: contactUs,
AlertEmail: alert,
}, nil
}
diff --git a/apps/webhook/Taskfile.yml b/apps/webhook/Taskfile.yml
index ff19ddbd8..d1f49b09b 100644
--- a/apps/webhook/Taskfile.yml
+++ b/apps/webhook/Taskfile.yml
@@ -24,6 +24,13 @@ tasks:
out: "{{.binary}}-{{.GOARCH}}"
GOARCH: "{{.GOARCH}}"
+ webhook:run:
+ dotenv:
+ - .secrets/env
+ cmds:
+ - go build -o bin/webhook .
+ - ./bin/webhook --dev
+
container:build-and-push:
requires:
vars:
diff --git a/apps/webhook/internal/app/app.go b/apps/webhook/internal/app/app.go
index 9e74243b0..fc053d5e4 100644
--- a/apps/webhook/internal/app/app.go
+++ b/apps/webhook/internal/app/app.go
@@ -1,17 +1,30 @@
package app
import (
+ "github.com/kloudlite/api/apps/webhook/internal/domain"
+ "github.com/kloudlite/api/grpc-interfaces/kloudlite.io/rpc/comms"
+ "github.com/kloudlite/api/pkg/grpc"
"github.com/kloudlite/api/pkg/messaging"
msgnats "github.com/kloudlite/api/pkg/messaging/nats"
"github.com/kloudlite/api/pkg/nats"
"go.uber.org/fx"
)
+type CommsGrpcClient grpc.Client
+
var Module = fx.Module(
"app",
fx.Provide(func(client *nats.JetstreamClient) messaging.Producer {
return msgnats.NewJetstreamProducer(client)
}),
+ fx.Provide(
+ func(conn CommsGrpcClient) comms.CommsClient {
+ return comms.NewCommsClient(conn)
+ },
+ ),
+
+ domain.Module,
+
LoadGitWebhook(),
)
diff --git a/apps/webhook/internal/app/git-webhook.go b/apps/webhook/internal/app/git-webhook.go
index d4d8c9fac..269990ddd 100644
--- a/apps/webhook/internal/app/git-webhook.go
+++ b/apps/webhook/internal/app/git-webhook.go
@@ -1,11 +1,13 @@
package app
import (
+ "bytes"
"crypto/hmac"
"crypto/sha256"
"encoding/hex"
"encoding/json"
"fmt"
+ "github.com/kloudlite/api/apps/webhook/internal/domain"
"github.com/kloudlite/api/common"
"github.com/kloudlite/api/constants"
httpServer "github.com/kloudlite/api/pkg/http-server"
@@ -102,8 +104,56 @@ func gitRepoUrl(provider string, hookBody []byte) (string, error) {
func LoadGitWebhook() fx.Option {
return fx.Invoke(
- func(server httpServer.Server, envVars *env.Env, producer messaging.Producer, logr logging.Logger) error {
+ func(server httpServer.Server, envVars *env.Env, producer messaging.Producer, logr logging.Logger, d domain.Domain) error {
app := server.Raw()
+
+ app.Get("/healthy", func(c *fiber.Ctx) error {
+ return c.SendString("OK")
+ })
+
+ app.Post("/contact-us", func(ctx *fiber.Ctx) error {
+ var data *domain.ContactUsData
+
+ if err := ctx.BodyParser(&data); err != nil {
+ return ctx.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": "Invalid request payload"})
+ }
+
+ err := d.SendContactUsEmail(ctx.Context(), data)
+ if err != nil {
+ return errors.NewE(err)
+ }
+
+ discordWebhookURL := envVars.DiscordWebhookUrl
+ if discordWebhookURL != "" {
+ discordMessage := fmt.Sprintf(
+ ""+
+ "🚨 **NEW CONTACT US SUBMISSION** 🚨\n**Name:** %s\n**Email:** %s\n**Mobile:** %s\n**Company:** %s\n**Country:** %s\n**Message:** %s\n",
+ data.Name, data.Email, data.MobileNumber, data.CompanyName, data.Country, data.Message,
+ )
+
+ payload := map[string]string{
+ "content": discordMessage,
+ }
+
+ payloadBytes, err := json.Marshal(payload)
+ if err != nil {
+ return ctx.Status(fiber.StatusInternalServerError).JSON(fiber.Map{"error": "Failed to marshal Discord payload"})
+ }
+
+ resp, err := http.Post(discordWebhookURL, "application/json", bytes.NewBuffer(payloadBytes))
+ if err != nil {
+ return ctx.Status(fiber.StatusInternalServerError).JSON(fiber.Map{"error": "Failed to send message to Discord"})
+ }
+ defer resp.Body.Close()
+
+ if resp.StatusCode != http.StatusNoContent {
+ return ctx.Status(fiber.StatusInternalServerError).JSON(fiber.Map{"error": "Discord API returned an error"})
+ }
+ }
+
+ return ctx.Status(fiber.StatusOK).JSON(fiber.Map{"success": true})
+ })
+
app.Post(
"/git/:provider", func(ctx *fiber.Ctx) error {
logger := logr.WithName("git-webhook")
diff --git a/apps/webhook/internal/domain/api.go b/apps/webhook/internal/domain/api.go
new file mode 100644
index 000000000..e561c8239
--- /dev/null
+++ b/apps/webhook/internal/domain/api.go
@@ -0,0 +1,18 @@
+package domain
+
+import (
+ "context"
+)
+
+type ContactUsData struct {
+ Name string `json:"name"`
+ Email string `json:"email"`
+ MobileNumber string `json:"mobileNumber"`
+ CompanyName string `json:"CompanyName"`
+ Country string `json:"country"`
+ Message string `json:"message"`
+}
+
+type Domain interface {
+ SendContactUsEmail(ctx context.Context, contactUsData *ContactUsData) error
+}
diff --git a/apps/webhook/internal/domain/domain.go b/apps/webhook/internal/domain/domain.go
new file mode 100644
index 000000000..00fca3321
--- /dev/null
+++ b/apps/webhook/internal/domain/domain.go
@@ -0,0 +1,42 @@
+package domain
+
+import (
+ "context"
+ "github.com/kloudlite/api/apps/webhook/internal/env"
+ "github.com/kloudlite/api/grpc-interfaces/kloudlite.io/rpc/comms"
+ "github.com/kloudlite/api/pkg/errors"
+ "go.uber.org/fx"
+)
+
+type domain struct {
+ env *env.Env
+ commsClient comms.CommsClient
+}
+
+func (d *domain) SendContactUsEmail(ctx context.Context, contactUsData *ContactUsData) error {
+ _, err := d.commsClient.SendContactUsEmail(ctx, &comms.SendContactUsEmailInput{
+ Email: contactUsData.Email,
+ Name: contactUsData.Name,
+ CompanyName: contactUsData.CompanyName,
+ Country: contactUsData.Country,
+ Message: contactUsData.Message,
+ MobileNumber: contactUsData.MobileNumber,
+ })
+ if err != nil {
+ return errors.NewE(err)
+ }
+
+ return nil
+}
+
+var Module = fx.Module("domain",
+ fx.Provide(func(
+ env *env.Env,
+ commsClient comms.CommsClient,
+ ) (Domain, error) {
+ return &domain{
+ env: env,
+ commsClient: commsClient,
+ }, nil
+ }),
+)
diff --git a/apps/webhook/internal/env/env.go b/apps/webhook/internal/env/env.go
index 190c34bf0..a3ee6688b 100644
--- a/apps/webhook/internal/env/env.go
+++ b/apps/webhook/internal/env/env.go
@@ -9,4 +9,7 @@ type Env struct {
GithubAuthzSecret string `env:"GITHUB_AUTHZ_SECRET" required:"false"`
GitlabAuthzSecret string `env:"GITLAB_AUTHZ_SECRET" required:"false"`
NatsURL string `env:"NATS_URL" required:"false"`
+
+ CommsService string `env:"COMMS_SERVICE" required:"true"`
+ DiscordWebhookUrl string `env:"DISCORD_WEBHOOK_URL" required:"false"`
}
diff --git a/apps/webhook/internal/framework/main.go b/apps/webhook/internal/framework/main.go
index 3dbe45dec..3627c7730 100644
--- a/apps/webhook/internal/framework/main.go
+++ b/apps/webhook/internal/framework/main.go
@@ -3,6 +3,7 @@ package framework
import (
"context"
"fmt"
+ "github.com/kloudlite/api/pkg/grpc"
"log/slog"
"github.com/kloudlite/api/apps/webhook/internal/app"
@@ -61,5 +62,10 @@ var Module = fx.Module(
},
})
}),
+
+ fx.Provide(func(ev *env.Env) (app.CommsGrpcClient, error) {
+ return grpc.NewGrpcClient(ev.CommsService)
+ }),
+
app.Module,
)
diff --git a/go.mod b/go.mod
index 291c7ebe9..9098e4b8e 100644
--- a/go.mod
+++ b/go.mod
@@ -19,7 +19,6 @@ require (
github.com/kloudlite/operator v0.0.0-20240725140628-a3dbbc898710
github.com/matoous/go-nanoid/v2 v2.0.0
github.com/pkg/errors v0.9.1
- github.com/rs/zerolog v1.29.1
github.com/sendgrid/sendgrid-go v3.11.1+incompatible
github.com/vektah/gqlparser/v2 v2.5.16
github.com/xanzy/go-gitlab v0.63.0
diff --git a/go.sum b/go.sum
index 13efacb0d..1e170c254 100644
--- a/go.sum
+++ b/go.sum
@@ -46,7 +46,6 @@ github.com/charmbracelet/log v0.4.0 h1:G9bQAcx8rWA2T3pWvx7YtPTPwgqpk7D68BX21IRW8
github.com/charmbracelet/log v0.4.0/go.mod h1:63bXt/djrizTec0l11H20t8FDSvA4CRZJ1KH22MdptM=
github.com/codingconcepts/env v0.0.0-20200821220118-a8fbf8d84482 h1:5/aEFreBh9hH/0G+33xtczJCvMaulqsm9nDuu2BZUEo=
github.com/codingconcepts/env v0.0.0-20200821220118-a8fbf8d84482/go.mod h1:TM9ug+H/2cI3EjyIDr5xKCkFGyNE59URgH1wu5NyU8E=
-github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
github.com/cpuguy83/go-md2man/v2 v2.0.4 h1:wfIWP927BUkWJb2NmU/kNDYIBTh/ziUX91+lVfRxZq4=
github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
@@ -94,7 +93,6 @@ github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEe
github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls=
github.com/gobuffalo/flect v1.0.2 h1:eqjPGSo2WmjgY2XlpGwo2NXgL3RucAKo4k4qQMNA5sA=
github.com/gobuffalo/flect v1.0.2/go.mod h1:A5msMlrHtLqh9umBSnvabjsMrCcCpAyzglnDvkbYKHs=
-github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
github.com/gofiber/adaptor/v2 v2.1.23 h1:VG0yAPnB2EJZjxy4Ul+Ra9e92PnqwXE97SUVuPGuoAA=
github.com/gofiber/adaptor/v2 v2.1.23/go.mod h1:hnYEQBPF2x1JaBHygutJJF5d0+J2eYnKKsUMCSsfxKk=
github.com/gofiber/fiber/v2 v2.32.0/go.mod h1:CMy5ZLiXkn6qwthrl03YMyW1NLfj0rhxz2LKl4t7ZTY=
@@ -194,10 +192,8 @@ github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJ
github.com/matoous/go-nanoid v1.5.0/go.mod h1:zyD2a71IubI24efhpvkJz+ZwfwagzgSO6UNiFsZKN7U=
github.com/matoous/go-nanoid/v2 v2.0.0 h1:d19kur2QuLeHmJBkvYkFdhFBzLoo1XVm2GgTpL+9Tj0=
github.com/matoous/go-nanoid/v2 v2.0.0/go.mod h1:FtS4aGPVfEkxKxhdWPAspZpZSh1cOjtM7Ej/So3hR0g=
-github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=
github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=
github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=
-github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=
github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
@@ -262,9 +258,6 @@ github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ=
github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88=
github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ=
github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog=
-github.com/rs/xid v1.4.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg=
-github.com/rs/zerolog v1.29.1 h1:cO+d60CHkknCbvzEWxP0S9K6KqyTjrCNUy1LdQLCGPc=
-github.com/rs/zerolog v1.29.1/go.mod h1:Le6ESbR7hc+DP6Lt1THiV8CQSdkkNrd3R0XbEgp3ZBU=
github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk=
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
github.com/sanity-io/litter v1.5.5 h1:iE+sBxPBzoK6uaEP5Lt3fHNgpKcHXc/A2HGETy0uJQo=
@@ -407,8 +400,6 @@ golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7w
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=
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220111092808-5a964db01320/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
diff --git a/grpc-interfaces/comms.proto b/grpc-interfaces/comms.proto
index 7ee2785ea..9734c26b0 100644
--- a/grpc-interfaces/comms.proto
+++ b/grpc-interfaces/comms.proto
@@ -9,6 +9,7 @@ service Comms {
rpc SendProjectMemberInviteEmail(ProjectMemberInviteEmailInput) returns (Void);
rpc SendWelcomeEmail(WelcomeEmailInput) returns (Void);
rpc SendWaitingEmail(WelcomeEmailInput) returns (Void);
+ rpc SendContactUsEmail(SendContactUsEmailInput) returns (Void);
}
message VerificationEmailInput{
@@ -44,5 +45,14 @@ message ProjectMemberInviteEmailInput{
string name = 5;
}
+message SendContactUsEmailInput{
+ string email = 1;
+ string name = 2;
+ string companyName = 3;
+ string country = 4;
+ string mobileNumber = 5;
+ string message = 6;
+}
+
message Void{
}
diff --git a/grpc-interfaces/kloudlite.io/rpc/comms/comms.pb.go b/grpc-interfaces/kloudlite.io/rpc/comms/comms.pb.go
index cde4c60ca..35c93117b 100644
--- a/grpc-interfaces/kloudlite.io/rpc/comms/comms.pb.go
+++ b/grpc-interfaces/kloudlite.io/rpc/comms/comms.pb.go
@@ -359,6 +359,93 @@ func (x *ProjectMemberInviteEmailInput) GetName() string {
return ""
}
+type SendContactUsEmailInput struct {
+ state protoimpl.MessageState
+ sizeCache protoimpl.SizeCache
+ unknownFields protoimpl.UnknownFields
+
+ Email string `protobuf:"bytes,1,opt,name=email,proto3" json:"email,omitempty"`
+ Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"`
+ CompanyName string `protobuf:"bytes,3,opt,name=companyName,proto3" json:"companyName,omitempty"`
+ Country string `protobuf:"bytes,4,opt,name=country,proto3" json:"country,omitempty"`
+ MobileNumber string `protobuf:"bytes,5,opt,name=mobileNumber,proto3" json:"mobileNumber,omitempty"`
+ Message string `protobuf:"bytes,6,opt,name=message,proto3" json:"message,omitempty"`
+}
+
+func (x *SendContactUsEmailInput) Reset() {
+ *x = SendContactUsEmailInput{}
+ if protoimpl.UnsafeEnabled {
+ mi := &file_comms_proto_msgTypes[5]
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ ms.StoreMessageInfo(mi)
+ }
+}
+
+func (x *SendContactUsEmailInput) String() string {
+ return protoimpl.X.MessageStringOf(x)
+}
+
+func (*SendContactUsEmailInput) ProtoMessage() {}
+
+func (x *SendContactUsEmailInput) ProtoReflect() protoreflect.Message {
+ mi := &file_comms_proto_msgTypes[5]
+ if protoimpl.UnsafeEnabled && x != nil {
+ ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+ if ms.LoadMessageInfo() == nil {
+ ms.StoreMessageInfo(mi)
+ }
+ return ms
+ }
+ return mi.MessageOf(x)
+}
+
+// Deprecated: Use SendContactUsEmailInput.ProtoReflect.Descriptor instead.
+func (*SendContactUsEmailInput) Descriptor() ([]byte, []int) {
+ return file_comms_proto_rawDescGZIP(), []int{5}
+}
+
+func (x *SendContactUsEmailInput) GetEmail() string {
+ if x != nil {
+ return x.Email
+ }
+ return ""
+}
+
+func (x *SendContactUsEmailInput) GetName() string {
+ if x != nil {
+ return x.Name
+ }
+ return ""
+}
+
+func (x *SendContactUsEmailInput) GetCompanyName() string {
+ if x != nil {
+ return x.CompanyName
+ }
+ return ""
+}
+
+func (x *SendContactUsEmailInput) GetCountry() string {
+ if x != nil {
+ return x.Country
+ }
+ return ""
+}
+
+func (x *SendContactUsEmailInput) GetMobileNumber() string {
+ if x != nil {
+ return x.MobileNumber
+ }
+ return ""
+}
+
+func (x *SendContactUsEmailInput) GetMessage() string {
+ if x != nil {
+ return x.Message
+ }
+ return ""
+}
+
type Void struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
@@ -368,7 +455,7 @@ type Void struct {
func (x *Void) Reset() {
*x = Void{}
if protoimpl.UnsafeEnabled {
- mi := &file_comms_proto_msgTypes[5]
+ mi := &file_comms_proto_msgTypes[6]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
@@ -381,7 +468,7 @@ func (x *Void) String() string {
func (*Void) ProtoMessage() {}
func (x *Void) ProtoReflect() protoreflect.Message {
- mi := &file_comms_proto_msgTypes[5]
+ mi := &file_comms_proto_msgTypes[6]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
@@ -394,7 +481,7 @@ func (x *Void) ProtoReflect() protoreflect.Message {
// Deprecated: Use Void.ProtoReflect.Descriptor instead.
func (*Void) Descriptor() ([]byte, []int) {
- return file_comms_proto_rawDescGZIP(), []int{5}
+ return file_comms_proto_rawDescGZIP(), []int{6}
}
var File_comms_proto protoreflect.FileDescriptor
@@ -441,7 +528,19 @@ var file_comms_proto_rawDesc = []byte{
0x74, 0x65, 0x64, 0x42, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x04,
0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x6e,
0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22,
- 0x06, 0x0a, 0x04, 0x56, 0x6f, 0x69, 0x64, 0x32, 0xe7, 0x02, 0x0a, 0x05, 0x43, 0x6f, 0x6d, 0x6d,
+ 0xbd, 0x01, 0x0a, 0x17, 0x53, 0x65, 0x6e, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x55,
+ 0x73, 0x45, 0x6d, 0x61, 0x69, 0x6c, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65,
+ 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69,
+ 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52,
+ 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x6e, 0x79,
+ 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6d, 0x70,
+ 0x61, 0x6e, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x75, 0x6e, 0x74,
+ 0x72, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x72,
+ 0x79, 0x12, 0x22, 0x0a, 0x0c, 0x6d, 0x6f, 0x62, 0x69, 0x6c, 0x65, 0x4e, 0x75, 0x6d, 0x62, 0x65,
+ 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6d, 0x6f, 0x62, 0x69, 0x6c, 0x65, 0x4e,
+ 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65,
+ 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22,
+ 0x06, 0x0a, 0x04, 0x56, 0x6f, 0x69, 0x64, 0x32, 0x9e, 0x03, 0x0a, 0x05, 0x43, 0x6f, 0x6d, 0x6d,
0x73, 0x12, 0x37, 0x0a, 0x15, 0x53, 0x65, 0x6e, 0x64, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63,
0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x17, 0x2e, 0x56, 0x65, 0x72,
0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6d, 0x61, 0x69, 0x6c, 0x49, 0x6e,
@@ -464,9 +563,12 @@ var file_comms_proto_rawDesc = []byte{
0x69, 0x64, 0x12, 0x2d, 0x0a, 0x10, 0x53, 0x65, 0x6e, 0x64, 0x57, 0x61, 0x69, 0x74, 0x69, 0x6e,
0x67, 0x45, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x12, 0x2e, 0x57, 0x65, 0x6c, 0x63, 0x6f, 0x6d, 0x65,
0x45, 0x6d, 0x61, 0x69, 0x6c, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x1a, 0x05, 0x2e, 0x56, 0x6f, 0x69,
- 0x64, 0x42, 0x18, 0x5a, 0x16, 0x6b, 0x6c, 0x6f, 0x75, 0x64, 0x6c, 0x69, 0x74, 0x65, 0x2e, 0x69,
- 0x6f, 0x2f, 0x72, 0x70, 0x63, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f,
- 0x74, 0x6f, 0x33,
+ 0x64, 0x12, 0x35, 0x0a, 0x12, 0x53, 0x65, 0x6e, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74,
+ 0x55, 0x73, 0x45, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x18, 0x2e, 0x53, 0x65, 0x6e, 0x64, 0x43, 0x6f,
+ 0x6e, 0x74, 0x61, 0x63, 0x74, 0x55, 0x73, 0x45, 0x6d, 0x61, 0x69, 0x6c, 0x49, 0x6e, 0x70, 0x75,
+ 0x74, 0x1a, 0x05, 0x2e, 0x56, 0x6f, 0x69, 0x64, 0x42, 0x18, 0x5a, 0x16, 0x6b, 0x6c, 0x6f, 0x75,
+ 0x64, 0x6c, 0x69, 0x74, 0x65, 0x2e, 0x69, 0x6f, 0x2f, 0x72, 0x70, 0x63, 0x2f, 0x63, 0x6f, 0x6d,
+ 0x6d, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
}
var (
@@ -481,14 +583,15 @@ func file_comms_proto_rawDescGZIP() []byte {
return file_comms_proto_rawDescData
}
-var file_comms_proto_msgTypes = make([]protoimpl.MessageInfo, 6)
+var file_comms_proto_msgTypes = make([]protoimpl.MessageInfo, 7)
var file_comms_proto_goTypes = []interface{}{
(*VerificationEmailInput)(nil), // 0: VerificationEmailInput
(*WelcomeEmailInput)(nil), // 1: WelcomeEmailInput
(*PasswordResetEmailInput)(nil), // 2: PasswordResetEmailInput
(*AccountMemberInviteEmailInput)(nil), // 3: AccountMemberInviteEmailInput
(*ProjectMemberInviteEmailInput)(nil), // 4: ProjectMemberInviteEmailInput
- (*Void)(nil), // 5: Void
+ (*SendContactUsEmailInput)(nil), // 5: SendContactUsEmailInput
+ (*Void)(nil), // 6: Void
}
var file_comms_proto_depIdxs = []int32{
0, // 0: Comms.SendVerificationEmail:input_type -> VerificationEmailInput
@@ -497,14 +600,16 @@ var file_comms_proto_depIdxs = []int32{
4, // 3: Comms.SendProjectMemberInviteEmail:input_type -> ProjectMemberInviteEmailInput
1, // 4: Comms.SendWelcomeEmail:input_type -> WelcomeEmailInput
1, // 5: Comms.SendWaitingEmail:input_type -> WelcomeEmailInput
- 5, // 6: Comms.SendVerificationEmail:output_type -> Void
- 5, // 7: Comms.SendPasswordResetEmail:output_type -> Void
- 5, // 8: Comms.SendAccountMemberInviteEmail:output_type -> Void
- 5, // 9: Comms.SendProjectMemberInviteEmail:output_type -> Void
- 5, // 10: Comms.SendWelcomeEmail:output_type -> Void
- 5, // 11: Comms.SendWaitingEmail:output_type -> Void
- 6, // [6:12] is the sub-list for method output_type
- 0, // [0:6] is the sub-list for method input_type
+ 5, // 6: Comms.SendContactUsEmail:input_type -> SendContactUsEmailInput
+ 6, // 7: Comms.SendVerificationEmail:output_type -> Void
+ 6, // 8: Comms.SendPasswordResetEmail:output_type -> Void
+ 6, // 9: Comms.SendAccountMemberInviteEmail:output_type -> Void
+ 6, // 10: Comms.SendProjectMemberInviteEmail:output_type -> Void
+ 6, // 11: Comms.SendWelcomeEmail:output_type -> Void
+ 6, // 12: Comms.SendWaitingEmail:output_type -> Void
+ 6, // 13: Comms.SendContactUsEmail:output_type -> Void
+ 7, // [7:14] is the sub-list for method output_type
+ 0, // [0:7] is the sub-list for method input_type
0, // [0:0] is the sub-list for extension type_name
0, // [0:0] is the sub-list for extension extendee
0, // [0:0] is the sub-list for field type_name
@@ -577,6 +682,18 @@ func file_comms_proto_init() {
}
}
file_comms_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
+ switch v := v.(*SendContactUsEmailInput); i {
+ case 0:
+ return &v.state
+ case 1:
+ return &v.sizeCache
+ case 2:
+ return &v.unknownFields
+ default:
+ return nil
+ }
+ }
+ file_comms_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*Void); i {
case 0:
return &v.state
@@ -595,7 +712,7 @@ func file_comms_proto_init() {
GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
RawDescriptor: file_comms_proto_rawDesc,
NumEnums: 0,
- NumMessages: 6,
+ NumMessages: 7,
NumExtensions: 0,
NumServices: 1,
},
diff --git a/grpc-interfaces/kloudlite.io/rpc/comms/comms_grpc.pb.go b/grpc-interfaces/kloudlite.io/rpc/comms/comms_grpc.pb.go
index a8a8a4083..2105b41ad 100644
--- a/grpc-interfaces/kloudlite.io/rpc/comms/comms_grpc.pb.go
+++ b/grpc-interfaces/kloudlite.io/rpc/comms/comms_grpc.pb.go
@@ -25,6 +25,7 @@ const (
Comms_SendProjectMemberInviteEmail_FullMethodName = "/Comms/SendProjectMemberInviteEmail"
Comms_SendWelcomeEmail_FullMethodName = "/Comms/SendWelcomeEmail"
Comms_SendWaitingEmail_FullMethodName = "/Comms/SendWaitingEmail"
+ Comms_SendContactUsEmail_FullMethodName = "/Comms/SendContactUsEmail"
)
// CommsClient is the client API for Comms service.
@@ -37,6 +38,7 @@ type CommsClient interface {
SendProjectMemberInviteEmail(ctx context.Context, in *ProjectMemberInviteEmailInput, opts ...grpc.CallOption) (*Void, error)
SendWelcomeEmail(ctx context.Context, in *WelcomeEmailInput, opts ...grpc.CallOption) (*Void, error)
SendWaitingEmail(ctx context.Context, in *WelcomeEmailInput, opts ...grpc.CallOption) (*Void, error)
+ SendContactUsEmail(ctx context.Context, in *SendContactUsEmailInput, opts ...grpc.CallOption) (*Void, error)
}
type commsClient struct {
@@ -101,6 +103,15 @@ func (c *commsClient) SendWaitingEmail(ctx context.Context, in *WelcomeEmailInpu
return out, nil
}
+func (c *commsClient) SendContactUsEmail(ctx context.Context, in *SendContactUsEmailInput, opts ...grpc.CallOption) (*Void, error) {
+ out := new(Void)
+ err := c.cc.Invoke(ctx, Comms_SendContactUsEmail_FullMethodName, in, out, opts...)
+ if err != nil {
+ return nil, err
+ }
+ return out, nil
+}
+
// CommsServer is the server API for Comms service.
// All implementations must embed UnimplementedCommsServer
// for forward compatibility
@@ -111,6 +122,7 @@ type CommsServer interface {
SendProjectMemberInviteEmail(context.Context, *ProjectMemberInviteEmailInput) (*Void, error)
SendWelcomeEmail(context.Context, *WelcomeEmailInput) (*Void, error)
SendWaitingEmail(context.Context, *WelcomeEmailInput) (*Void, error)
+ SendContactUsEmail(context.Context, *SendContactUsEmailInput) (*Void, error)
mustEmbedUnimplementedCommsServer()
}
@@ -136,6 +148,9 @@ func (UnimplementedCommsServer) SendWelcomeEmail(context.Context, *WelcomeEmailI
func (UnimplementedCommsServer) SendWaitingEmail(context.Context, *WelcomeEmailInput) (*Void, error) {
return nil, status.Errorf(codes.Unimplemented, "method SendWaitingEmail not implemented")
}
+func (UnimplementedCommsServer) SendContactUsEmail(context.Context, *SendContactUsEmailInput) (*Void, error) {
+ return nil, status.Errorf(codes.Unimplemented, "method SendContactUsEmail not implemented")
+}
func (UnimplementedCommsServer) mustEmbedUnimplementedCommsServer() {}
// UnsafeCommsServer may be embedded to opt out of forward compatibility for this service.
@@ -257,6 +272,24 @@ func _Comms_SendWaitingEmail_Handler(srv interface{}, ctx context.Context, dec f
return interceptor(ctx, in, info, handler)
}
+func _Comms_SendContactUsEmail_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+ in := new(SendContactUsEmailInput)
+ if err := dec(in); err != nil {
+ return nil, err
+ }
+ if interceptor == nil {
+ return srv.(CommsServer).SendContactUsEmail(ctx, in)
+ }
+ info := &grpc.UnaryServerInfo{
+ Server: srv,
+ FullMethod: Comms_SendContactUsEmail_FullMethodName,
+ }
+ handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+ return srv.(CommsServer).SendContactUsEmail(ctx, req.(*SendContactUsEmailInput))
+ }
+ return interceptor(ctx, in, info, handler)
+}
+
// Comms_ServiceDesc is the grpc.ServiceDesc for Comms service.
// It's only intended for direct use with grpc.RegisterService,
// and not to be introspected or modified (even as a copy)
@@ -288,6 +321,10 @@ var Comms_ServiceDesc = grpc.ServiceDesc{
MethodName: "SendWaitingEmail",
Handler: _Comms_SendWaitingEmail_Handler,
},
+ {
+ MethodName: "SendContactUsEmail",
+ Handler: _Comms_SendContactUsEmail_Handler,
+ },
},
Streams: []grpc.StreamDesc{},
Metadata: "comms.proto",