move messages to mail (#56)

This commit is contained in:
Asim Aslam
2021-02-01 11:20:52 +00:00
committed by GitHub
parent 39c77b9aeb
commit 226a595590
10 changed files with 137 additions and 114 deletions

27
mail/Makefile Normal file
View File

@@ -0,0 +1,27 @@
GOPATH:=$(shell go env GOPATH)
.PHONY: init
init:
go get -u github.com/golang/protobuf/proto
go get -u github.com/golang/protobuf/protoc-gen-go
go get github.com/micro/micro/v3/cmd/protoc-gen-micro
.PHONY: proto
proto:
protoc --openapi_out=. --proto_path=. --micro_out=. --go_out=:. proto/mail.proto
.PHONY: docs
docs:
protoc --openapi_out=. --proto_path=. --micro_out=. --go_out=:. proto/mail.proto
@redoc-cli bundle api-protobuf.json
.PHONY: build
build:
go build -o mail *.go
.PHONY: test
test:
go test -v ./... -cover
.PHONY: docker
docker:
docker build . -t mail:latest

49
mail/README.md Normal file
View File

@@ -0,0 +1,49 @@
The mail service is a simplified service for sending mail, much like email.
# Mail Service
## Send a message
### CLI
```bash
> micro mail send --to=John --from=Barry --subject=HelloWorld --text="Hello John"
```
## List the mail a user has received
### CLI
```bash
> micro mail list --user=John
{
"mail": [
{
"id": "78efd836-ca51-4163-af43-65985f7c6587",
"to": "John",
"from": "Barry",
"subject": "HelloWorld",
"text": "Hello John",
"sent_at": "1602777240"
}
]
}
```
## Lookup an individual email by ID
### CLI
```bash
> micro mail read --id=78efd836-ca51-4163-af43-65985f7c6587
{
"message": {
"id": "78efd836-ca51-4163-af43-65985f7c6587",
"to": "John",
"from": "Barry",
"subject": "HelloWorld",
"text": "Hello John",
"sent_at": "1602777240"
}
}
```

116
mail/handler/handler.go Normal file
View File

@@ -0,0 +1,116 @@
package handler
import (
"context"
"encoding/json"
"strings"
"time"
"github.com/google/uuid"
"github.com/micro/micro/v3/service/errors"
"github.com/micro/micro/v3/service/store"
pb "github.com/micro/services/mail/proto"
)
const (
messagePrefix = "message"
joinKey = "/"
)
type Mail struct{}
// Send a message
func (m *Mail) Send(ctx context.Context, req *pb.SendRequest, rsp *pb.SendResponse) error {
// validate the request
if len(req.To) == 0 {
return errors.BadRequest("mail.Send.MissingTo", "Missing to")
}
if len(req.From) == 0 {
return errors.BadRequest("mail.Send.MissingFrom", "Missing from")
}
if len(req.Text) == 0 {
return errors.BadRequest("mail.Send.MissingText", "Missing text")
}
// construct the message and marshal it to json
msg := &pb.Message{
Id: uuid.New().String(),
To: req.To,
From: req.From,
Subject: req.Subject,
Text: req.Text,
SentAt: time.Now().Unix(),
}
bytes, err := json.Marshal(msg)
if err != nil {
return errors.BadRequest("mail.Send.Unknown", "Error encoding message")
}
// write the message to the store under the recipients key
key := strings.Join([]string{messagePrefix, req.To, msg.Id}, joinKey)
if err := store.Write(&store.Record{Key: key, Value: bytes}); err != nil {
return errors.BadRequest("mail.Send.Unknown", "Error writing to the store")
}
// write the message to the store under the id (so it can be looked up without needing to know
// the users id)
key = strings.Join([]string{messagePrefix, msg.Id}, joinKey)
if err := store.Write(&store.Record{Key: key, Value: bytes}); err != nil {
return errors.BadRequest("mail.Send.Unknown", "Error writing to the store")
}
return nil
}
// List mail for a user
func (m *Mail) List(ctx context.Context, req *pb.ListRequest, rsp *pb.ListResponse) error {
// validate the request
if len(req.User) == 0 {
return errors.BadRequest("mail.List.MissingUser", "Missing user")
}
// query the store for any mail sent to the user
prefix := strings.Join([]string{messagePrefix, req.User}, joinKey)
recs, err := store.Read(prefix, store.ReadPrefix())
if err != nil {
return errors.BadRequest("mail.List.Unknown", "Error reading from the store")
}
// serialize the result
rsp.Mail = make([]*pb.Message, len(recs))
for i, r := range recs {
var msg pb.Message
if err := json.Unmarshal(r.Value, &msg); err != nil {
return errors.BadRequest("mail.List.Unknown", "Error decoding message")
}
rsp.Mail[i] = &msg
}
return nil
}
// Read a message
func (m *Mail) Read(ctx context.Context, req *pb.ReadRequest, rsp *pb.ReadResponse) error {
// validate the request
if len(req.Id) == 0 {
return errors.BadRequest("mail.Read.MissingUser", "Missing user")
}
// query the store
key := strings.Join([]string{messagePrefix, req.Id}, joinKey)
recs, err := store.Read(key)
if err == store.ErrNotFound {
return errors.NotFound("message.Read.InvalidID", "Message not found with ID")
} else if err != nil {
return errors.BadRequest("mail.Read.Unknown", "Error reading from the store")
}
// serialize the response
var msg pb.Message
if err := json.Unmarshal(recs[0].Value, &msg); err != nil {
return errors.BadRequest("mail.Read.Unknown", "Error decoding message")
}
rsp.Message = &msg
return nil
}

25
mail/main.go Normal file
View File

@@ -0,0 +1,25 @@
package main
import (
"github.com/micro/micro/v3/service"
"github.com/micro/micro/v3/service/logger"
"github.com/micro/services/mail/handler"
pb "github.com/micro/services/mail/proto"
)
func main() {
// Create the service
srv := service.New(
service.Name("mail"),
service.Version("latest"),
)
// Register the handler against the server
pb.RegisterMailHandler(srv.Server(), new(handler.Mail))
// Run the service
if err := srv.Run(); err != nil {
logger.Fatal(err)
}
}

1
mail/micro.mu Normal file
View File

@@ -0,0 +1 @@
service mail

386
mail/proto/mail.pb.go Normal file
View File

@@ -0,0 +1,386 @@
// Code generated by protoc-gen-go. DO NOT EDIT.
// source: proto/mail.proto
package mail
import (
fmt "fmt"
proto "github.com/golang/protobuf/proto"
math "math"
)
// Reference imports to suppress errors if they are not otherwise used.
var _ = proto.Marshal
var _ = fmt.Errorf
var _ = math.Inf
// This is a compile-time assertion to ensure that this generated file
// is compatible with the proto package it is being compiled against.
// A compilation error at this line likely means your copy of the
// proto package needs to be updated.
const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
type Message struct {
Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
To string `protobuf:"bytes,2,opt,name=to,proto3" json:"to,omitempty"`
From string `protobuf:"bytes,3,opt,name=from,proto3" json:"from,omitempty"`
Subject string `protobuf:"bytes,4,opt,name=subject,proto3" json:"subject,omitempty"`
Text string `protobuf:"bytes,5,opt,name=text,proto3" json:"text,omitempty"`
SentAt int64 `protobuf:"varint,6,opt,name=sent_at,json=sentAt,proto3" json:"sent_at,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *Message) Reset() { *m = Message{} }
func (m *Message) String() string { return proto.CompactTextString(m) }
func (*Message) ProtoMessage() {}
func (*Message) Descriptor() ([]byte, []int) {
return fileDescriptor_92689585a3f577ba, []int{0}
}
func (m *Message) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_Message.Unmarshal(m, b)
}
func (m *Message) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_Message.Marshal(b, m, deterministic)
}
func (m *Message) XXX_Merge(src proto.Message) {
xxx_messageInfo_Message.Merge(m, src)
}
func (m *Message) XXX_Size() int {
return xxx_messageInfo_Message.Size(m)
}
func (m *Message) XXX_DiscardUnknown() {
xxx_messageInfo_Message.DiscardUnknown(m)
}
var xxx_messageInfo_Message proto.InternalMessageInfo
func (m *Message) GetId() string {
if m != nil {
return m.Id
}
return ""
}
func (m *Message) GetTo() string {
if m != nil {
return m.To
}
return ""
}
func (m *Message) GetFrom() string {
if m != nil {
return m.From
}
return ""
}
func (m *Message) GetSubject() string {
if m != nil {
return m.Subject
}
return ""
}
func (m *Message) GetText() string {
if m != nil {
return m.Text
}
return ""
}
func (m *Message) GetSentAt() int64 {
if m != nil {
return m.SentAt
}
return 0
}
type SendRequest struct {
To string `protobuf:"bytes,1,opt,name=to,proto3" json:"to,omitempty"`
From string `protobuf:"bytes,2,opt,name=from,proto3" json:"from,omitempty"`
Subject string `protobuf:"bytes,3,opt,name=subject,proto3" json:"subject,omitempty"`
Text string `protobuf:"bytes,4,opt,name=text,proto3" json:"text,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *SendRequest) Reset() { *m = SendRequest{} }
func (m *SendRequest) String() string { return proto.CompactTextString(m) }
func (*SendRequest) ProtoMessage() {}
func (*SendRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_92689585a3f577ba, []int{1}
}
func (m *SendRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_SendRequest.Unmarshal(m, b)
}
func (m *SendRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_SendRequest.Marshal(b, m, deterministic)
}
func (m *SendRequest) XXX_Merge(src proto.Message) {
xxx_messageInfo_SendRequest.Merge(m, src)
}
func (m *SendRequest) XXX_Size() int {
return xxx_messageInfo_SendRequest.Size(m)
}
func (m *SendRequest) XXX_DiscardUnknown() {
xxx_messageInfo_SendRequest.DiscardUnknown(m)
}
var xxx_messageInfo_SendRequest proto.InternalMessageInfo
func (m *SendRequest) GetTo() string {
if m != nil {
return m.To
}
return ""
}
func (m *SendRequest) GetFrom() string {
if m != nil {
return m.From
}
return ""
}
func (m *SendRequest) GetSubject() string {
if m != nil {
return m.Subject
}
return ""
}
func (m *SendRequest) GetText() string {
if m != nil {
return m.Text
}
return ""
}
type SendResponse struct {
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *SendResponse) Reset() { *m = SendResponse{} }
func (m *SendResponse) String() string { return proto.CompactTextString(m) }
func (*SendResponse) ProtoMessage() {}
func (*SendResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_92689585a3f577ba, []int{2}
}
func (m *SendResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_SendResponse.Unmarshal(m, b)
}
func (m *SendResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_SendResponse.Marshal(b, m, deterministic)
}
func (m *SendResponse) XXX_Merge(src proto.Message) {
xxx_messageInfo_SendResponse.Merge(m, src)
}
func (m *SendResponse) XXX_Size() int {
return xxx_messageInfo_SendResponse.Size(m)
}
func (m *SendResponse) XXX_DiscardUnknown() {
xxx_messageInfo_SendResponse.DiscardUnknown(m)
}
var xxx_messageInfo_SendResponse proto.InternalMessageInfo
type ListRequest struct {
User string `protobuf:"bytes,1,opt,name=user,proto3" json:"user,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *ListRequest) Reset() { *m = ListRequest{} }
func (m *ListRequest) String() string { return proto.CompactTextString(m) }
func (*ListRequest) ProtoMessage() {}
func (*ListRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_92689585a3f577ba, []int{3}
}
func (m *ListRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ListRequest.Unmarshal(m, b)
}
func (m *ListRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_ListRequest.Marshal(b, m, deterministic)
}
func (m *ListRequest) XXX_Merge(src proto.Message) {
xxx_messageInfo_ListRequest.Merge(m, src)
}
func (m *ListRequest) XXX_Size() int {
return xxx_messageInfo_ListRequest.Size(m)
}
func (m *ListRequest) XXX_DiscardUnknown() {
xxx_messageInfo_ListRequest.DiscardUnknown(m)
}
var xxx_messageInfo_ListRequest proto.InternalMessageInfo
func (m *ListRequest) GetUser() string {
if m != nil {
return m.User
}
return ""
}
type ListResponse struct {
Mail []*Message `protobuf:"bytes,1,rep,name=mail,proto3" json:"mail,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *ListResponse) Reset() { *m = ListResponse{} }
func (m *ListResponse) String() string { return proto.CompactTextString(m) }
func (*ListResponse) ProtoMessage() {}
func (*ListResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_92689585a3f577ba, []int{4}
}
func (m *ListResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ListResponse.Unmarshal(m, b)
}
func (m *ListResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_ListResponse.Marshal(b, m, deterministic)
}
func (m *ListResponse) XXX_Merge(src proto.Message) {
xxx_messageInfo_ListResponse.Merge(m, src)
}
func (m *ListResponse) XXX_Size() int {
return xxx_messageInfo_ListResponse.Size(m)
}
func (m *ListResponse) XXX_DiscardUnknown() {
xxx_messageInfo_ListResponse.DiscardUnknown(m)
}
var xxx_messageInfo_ListResponse proto.InternalMessageInfo
func (m *ListResponse) GetMail() []*Message {
if m != nil {
return m.Mail
}
return nil
}
type ReadRequest struct {
Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *ReadRequest) Reset() { *m = ReadRequest{} }
func (m *ReadRequest) String() string { return proto.CompactTextString(m) }
func (*ReadRequest) ProtoMessage() {}
func (*ReadRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_92689585a3f577ba, []int{5}
}
func (m *ReadRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ReadRequest.Unmarshal(m, b)
}
func (m *ReadRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_ReadRequest.Marshal(b, m, deterministic)
}
func (m *ReadRequest) XXX_Merge(src proto.Message) {
xxx_messageInfo_ReadRequest.Merge(m, src)
}
func (m *ReadRequest) XXX_Size() int {
return xxx_messageInfo_ReadRequest.Size(m)
}
func (m *ReadRequest) XXX_DiscardUnknown() {
xxx_messageInfo_ReadRequest.DiscardUnknown(m)
}
var xxx_messageInfo_ReadRequest proto.InternalMessageInfo
func (m *ReadRequest) GetId() string {
if m != nil {
return m.Id
}
return ""
}
type ReadResponse struct {
Message *Message `protobuf:"bytes,1,opt,name=message,proto3" json:"message,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *ReadResponse) Reset() { *m = ReadResponse{} }
func (m *ReadResponse) String() string { return proto.CompactTextString(m) }
func (*ReadResponse) ProtoMessage() {}
func (*ReadResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_92689585a3f577ba, []int{6}
}
func (m *ReadResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ReadResponse.Unmarshal(m, b)
}
func (m *ReadResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_ReadResponse.Marshal(b, m, deterministic)
}
func (m *ReadResponse) XXX_Merge(src proto.Message) {
xxx_messageInfo_ReadResponse.Merge(m, src)
}
func (m *ReadResponse) XXX_Size() int {
return xxx_messageInfo_ReadResponse.Size(m)
}
func (m *ReadResponse) XXX_DiscardUnknown() {
xxx_messageInfo_ReadResponse.DiscardUnknown(m)
}
var xxx_messageInfo_ReadResponse proto.InternalMessageInfo
func (m *ReadResponse) GetMessage() *Message {
if m != nil {
return m.Message
}
return nil
}
func init() {
proto.RegisterType((*Message)(nil), "mail.Message")
proto.RegisterType((*SendRequest)(nil), "mail.SendRequest")
proto.RegisterType((*SendResponse)(nil), "mail.SendResponse")
proto.RegisterType((*ListRequest)(nil), "mail.ListRequest")
proto.RegisterType((*ListResponse)(nil), "mail.ListResponse")
proto.RegisterType((*ReadRequest)(nil), "mail.ReadRequest")
proto.RegisterType((*ReadResponse)(nil), "mail.ReadResponse")
}
func init() { proto.RegisterFile("proto/mail.proto", fileDescriptor_92689585a3f577ba) }
var fileDescriptor_92689585a3f577ba = []byte{
// 317 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x6c, 0x52, 0xb1, 0x4e, 0xc3, 0x30,
0x14, 0x94, 0x13, 0xd3, 0x88, 0x97, 0x50, 0x81, 0x17, 0x2c, 0x24, 0xa4, 0xd6, 0x0b, 0x59, 0x52,
0x44, 0x19, 0x18, 0x98, 0x60, 0xa6, 0x4b, 0xd8, 0x58, 0xaa, 0x94, 0x18, 0x14, 0xd4, 0xc4, 0x25,
0x7e, 0x91, 0xf8, 0x00, 0xfe, 0x80, 0x1f, 0x46, 0xb6, 0x63, 0x61, 0xd4, 0x6e, 0x77, 0xef, 0x9d,
0x7d, 0xbe, 0x93, 0xe1, 0x74, 0xd7, 0x2b, 0x54, 0xd7, 0x6d, 0xd5, 0x6c, 0x17, 0x16, 0x32, 0x6a,
0xb0, 0xf8, 0x26, 0x90, 0xac, 0xa4, 0xd6, 0xd5, 0xbb, 0x64, 0x53, 0x88, 0x9a, 0x9a, 0x93, 0x19,
0xc9, 0x8f, 0xcb, 0xa8, 0xa9, 0x0d, 0x47, 0xc5, 0x23, 0xc7, 0x51, 0x31, 0x06, 0xf4, 0xad, 0x57,
0x2d, 0x8f, 0xed, 0xc4, 0x62, 0xc6, 0x21, 0xd1, 0xc3, 0xe6, 0x43, 0xbe, 0x22, 0xa7, 0x76, 0xec,
0xa9, 0x51, 0xa3, 0xfc, 0x42, 0x7e, 0xe4, 0xd4, 0x06, 0xb3, 0x73, 0x48, 0xb4, 0xec, 0x70, 0x5d,
0x21, 0x9f, 0xcc, 0x48, 0x1e, 0x97, 0x13, 0x43, 0x1f, 0x50, 0xac, 0x21, 0x7d, 0x96, 0x5d, 0x5d,
0xca, 0xcf, 0x41, 0x6a, 0x1c, 0x9d, 0xc9, 0x9e, 0x73, 0x74, 0xd8, 0x39, 0x3e, 0xec, 0x4c, 0xff,
0x9c, 0xc5, 0x14, 0x32, 0x67, 0xa0, 0x77, 0xaa, 0xd3, 0x52, 0xcc, 0x21, 0x7d, 0x6a, 0x34, 0x7a,
0x43, 0x06, 0x74, 0xd0, 0xb2, 0x1f, 0x2d, 0x2d, 0x16, 0x37, 0x90, 0x39, 0x89, 0x3b, 0xc2, 0xe6,
0x60, 0x2b, 0xe3, 0x64, 0x16, 0xe7, 0xe9, 0xf2, 0x64, 0x61, 0xbb, 0x1c, 0xbb, 0x2b, 0x5d, 0x9b,
0x97, 0x90, 0x96, 0xb2, 0x0a, 0x63, 0x84, 0x85, 0x8a, 0x3b, 0xc8, 0xdc, 0x7a, 0xbc, 0xf1, 0x0a,
0x92, 0xd6, 0x9d, 0xb7, 0xa2, 0xbd, 0x4b, 0xfd, 0x76, 0xf9, 0x43, 0x80, 0xae, 0xaa, 0x66, 0xcb,
0x0a, 0xa0, 0x26, 0x06, 0x3b, 0x73, 0xc2, 0xa0, 0xb3, 0x0b, 0x16, 0x8e, 0x46, 0x83, 0x02, 0xa8,
0x89, 0xe0, 0xe5, 0x41, 0x62, 0x2f, 0xff, 0x97, 0xb0, 0x00, 0x6a, 0xde, 0xe7, 0xe5, 0x41, 0x14,
0x2f, 0x0f, 0x9f, 0xff, 0x98, 0xbd, 0x80, 0xfd, 0x4a, 0xf7, 0x66, 0xb5, 0x99, 0x58, 0x7c, 0xfb,
0x1b, 0x00, 0x00, 0xff, 0xff, 0x7b, 0xb1, 0x5f, 0x20, 0x6a, 0x02, 0x00, 0x00,
}

127
mail/proto/mail.pb.micro.go Normal file
View File

@@ -0,0 +1,127 @@
// Code generated by protoc-gen-micro. DO NOT EDIT.
// source: proto/mail.proto
package mail
import (
fmt "fmt"
proto "github.com/golang/protobuf/proto"
math "math"
)
import (
context "context"
api "github.com/micro/micro/v3/service/api"
client "github.com/micro/micro/v3/service/client"
server "github.com/micro/micro/v3/service/server"
)
// Reference imports to suppress errors if they are not otherwise used.
var _ = proto.Marshal
var _ = fmt.Errorf
var _ = math.Inf
// This is a compile-time assertion to ensure that this generated file
// is compatible with the proto package it is being compiled against.
// A compilation error at this line likely means your copy of the
// proto package needs to be updated.
const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
// Reference imports to suppress errors if they are not otherwise used.
var _ api.Endpoint
var _ context.Context
var _ client.Option
var _ server.Option
// Api Endpoints for Mail service
func NewMailEndpoints() []*api.Endpoint {
return []*api.Endpoint{}
}
// Client API for Mail service
type MailService interface {
Send(ctx context.Context, in *SendRequest, opts ...client.CallOption) (*SendResponse, error)
List(ctx context.Context, in *ListRequest, opts ...client.CallOption) (*ListResponse, error)
Read(ctx context.Context, in *ReadRequest, opts ...client.CallOption) (*ReadResponse, error)
}
type mailService struct {
c client.Client
name string
}
func NewMailService(name string, c client.Client) MailService {
return &mailService{
c: c,
name: name,
}
}
func (c *mailService) Send(ctx context.Context, in *SendRequest, opts ...client.CallOption) (*SendResponse, error) {
req := c.c.NewRequest(c.name, "Mail.Send", in)
out := new(SendResponse)
err := c.c.Call(ctx, req, out, opts...)
if err != nil {
return nil, err
}
return out, nil
}
func (c *mailService) List(ctx context.Context, in *ListRequest, opts ...client.CallOption) (*ListResponse, error) {
req := c.c.NewRequest(c.name, "Mail.List", in)
out := new(ListResponse)
err := c.c.Call(ctx, req, out, opts...)
if err != nil {
return nil, err
}
return out, nil
}
func (c *mailService) Read(ctx context.Context, in *ReadRequest, opts ...client.CallOption) (*ReadResponse, error) {
req := c.c.NewRequest(c.name, "Mail.Read", in)
out := new(ReadResponse)
err := c.c.Call(ctx, req, out, opts...)
if err != nil {
return nil, err
}
return out, nil
}
// Server API for Mail service
type MailHandler interface {
Send(context.Context, *SendRequest, *SendResponse) error
List(context.Context, *ListRequest, *ListResponse) error
Read(context.Context, *ReadRequest, *ReadResponse) error
}
func RegisterMailHandler(s server.Server, hdlr MailHandler, opts ...server.HandlerOption) error {
type mail interface {
Send(ctx context.Context, in *SendRequest, out *SendResponse) error
List(ctx context.Context, in *ListRequest, out *ListResponse) error
Read(ctx context.Context, in *ReadRequest, out *ReadResponse) error
}
type Mail struct {
mail
}
h := &mailHandler{hdlr}
return s.Handle(s.NewHandler(&Mail{h}, opts...))
}
type mailHandler struct {
MailHandler
}
func (h *mailHandler) Send(ctx context.Context, in *SendRequest, out *SendResponse) error {
return h.MailHandler.Send(ctx, in, out)
}
func (h *mailHandler) List(ctx context.Context, in *ListRequest, out *ListResponse) error {
return h.MailHandler.List(ctx, in, out)
}
func (h *mailHandler) Read(ctx context.Context, in *ReadRequest, out *ReadResponse) error {
return h.MailHandler.Read(ctx, in, out)
}

44
mail/proto/mail.proto Normal file
View File

@@ -0,0 +1,44 @@
syntax = "proto3";
package mail;
option go_package = "proto;mail";
service Mail {
rpc Send(SendRequest) returns (SendResponse);
rpc List(ListRequest) returns (ListResponse);
rpc Read(ReadRequest) returns (ReadResponse);
}
message Message {
string id = 1;
string to = 2;
string from = 3;
string subject = 4;
string text = 5;
int64 sent_at = 6;
}
message SendRequest {
string to = 1;
string from = 2;
string subject = 3;
string text = 4;
}
message SendResponse {}
message ListRequest {
string user = 1;
}
message ListResponse {
repeated Message mail = 1;
}
message ReadRequest {
string id = 1;
}
message ReadResponse {
Message message = 1;
}

0
mail/skip Normal file
View File