messenger

package module
v0.0.0-...-1386a44 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Mar 20, 2024 License: MIT Imports: 21 Imported by: 0

README

messenger

Build Status | codecov | Go Report Card | GoDoc

A simple messenger with socket notification. (This implementation should use for example rabbitmq to keep messages when shutdown)

Support for

Http

If i miss something or you have something interesting, please be part of this project. Let me know! My contact is at the end.

Dependency Management

Dep

Project dependencies are managed using Dep. Read more about Dep.

  • Install dependencies: dep ensure
  • Update dependencies: dep ensure -update

Configuration

{
  "messenger": {
    "host": "localhost:8001",
    "token_key": "banana",
    "socket": {
      "client": {
        "server_address": "localhost:9001/api/v1",
        "log": {
          "level": "info"
        }
      },
      "server": {
        "address": ":9001",
        "log": {
          "level": "info"
        }
      }
    },
    "dbr": {
      "db": {
        "driver": "postgres",
        "datasource": "postgres://user:password@localhost:7000/postgres?sslmode=disable&search_path=messenger"
      }
    },
    "log": {
      "level": "info"
    },
    "migration": {
      "path": {
        "database": "schema/db/postgres"
      },
      "db": {
        "schema": "messenger",
        "driver": "postgres",
        "datasource": "postgres://user:password@localhost:7000/postgres?sslmode=disable&search_path=messenger"
      },
      "log": {
        "level": "info"
      }
    }
  },
  "manager": {
    "log": {
      "level": "info"
    }
  },
  "socket": {
    "client": {
      "server_address": "localhost:9001/api/v1",
      "log": {
        "level": "info"
      }
    }
  }
}
Go
go get github.com/joaosoft/messenger

Usage

This examples are available in the project at messenger/examples

Server example

func main() {
	m, err := messenger.NewMessenger()
	if err != nil {
		panic(err)
	}

	if err := m.Start(); err != nil {
		panic(err)
	}
}

Client example

func main() {
	var user string
	flag.StringVar(&user, "listen", "", "The user identifier")
	flag.Parse()

	if user == "" {
		panic("invalid user identifier")
	}

	client, err := socket.NewClient()
	if err != nil {
		panic(err)
	}

	if err := client.Start(); err != nil {
		panic(err)
	}

	if err := client.Subscribe(user, "messenger::in-box"); err != nil {
		panic(err)
	}

	client.Listen(user, "messenger-in-box", func(message []byte) error {
		fmt.Printf("\nreceived on listener the message %s", string(message))
		return nil
	})

	// Unsubscribe
	//if err := client.Unsubscribe("topic_1", "channel_1"); err != nil {
	//	panic(err)
	//}

	client.Wait()
}
How to run this?
  1. go run main/main.go

  2. go run main/client.go -listen user_one

  3. go run main/client.go -listen user_two

  4. Make the next http requests to send messages

    4.1. from user_one to user_two

    Method: POST

    Route: http://localhost:8001/api/v1/messenger/message/users/user_two

    Header: user: user_one

    Body:

    {
        "message": "hello my friend"
    }
    

    4.2 from user_two to user_one

    Method: POST

    Route: http://localhost:8001/api/v1/messenger/message/users/user_one

    Header: user: user_two

    Body:

    {
        "message": "hello my friend"
    }
    

Known issues

Follow me at

Facebook: https://www.facebook.com/joaosoft

LinkedIn: https://www.linkedin.com/in/jo%C3%A3o-ribeiro-b2775438/

If you have something to add, please let me know joaosoft@gmail.com

Documentation

Index

Constants

This section is empty.

Variables

View Source
var (
	ErrorNotFound = errors.New(errors.LevelError, int(web.StatusNotFound), "not found")
)

Functions

This section is empty.

Types

type AppConfig

type AppConfig struct {
	Messenger *MessengerConfig `json:"messenger"`
}

AppConfig ...

func NewConfig

func NewConfig() (*AppConfig, manager.IConfig, error)

newConfig ...

type Controller

type Controller struct {
	// contains filtered or unexported fields
}

func NewController

func NewController(config *MessengerConfig, interactor *Interactor) *Controller

func (*Controller) GetMessagesHandler

func (c *Controller) GetMessagesHandler(ctx *web.Context) error

func (*Controller) RegisterRoutes

func (c *Controller) RegisterRoutes(web manager.IWeb) error

func (*Controller) SendMessageHandler

func (c *Controller) SendMessageHandler(ctx *web.Context) error

type ErrorResponse

type ErrorResponse struct {
	Code    web.Status `json:"code,omitempty"`
	Message string     `json:"message,omitempty"`
	Cause   string     `json:"cause,omitempty"`
}

type GetMessagesRequest

type GetMessagesRequest struct {
	User string `json:"user" validate:"notzero"`
}

type GetMessagesResponse

type GetMessagesResponse []*Message

type IStorage

type IStorage interface {
	SaveMessage(message *Message) error
	GetMessages(user string) ([]*Message, error)
}

type Interactor

type Interactor struct {
	// contains filtered or unexported fields
}

func NewInteractor

func NewInteractor(config *MessengerConfig, storageDB IStorage, socket *socket.Client) *Interactor

func (*Interactor) GetMessages

func (i *Interactor) GetMessages(user string) ([]*Message, error)

func (*Interactor) SaveMessage

func (i *Interactor) SaveMessage(message *Message) error

type Message

type Message struct {
	IdMessage string    `json:"id_message" db:"id_message"`
	From      string    `json:"from" db:"from"`
	To        string    `json:"to" db:"to"`
	Message   string    `json:"message" db:"message"`
	CreatedAt time.Time `json:"created_at" db.read:"created_at"`
}

type Messenger

type Messenger struct {
	// contains filtered or unexported fields
}

func NewMessenger

func NewMessenger(options ...SessionOption) (*Messenger, error)

NewMessenger ...

func (*Messenger) Reconfigure

func (session *Messenger) Reconfigure(options ...SessionOption)

Reconfigure ...

func (*Messenger) Start

func (m *Messenger) Start() error

Start ...

func (*Messenger) Stop

func (m *Messenger) Stop() error

Stop ...

type MessengerConfig

type MessengerConfig struct {
	Host              string                     `json:"host"`
	Socket            *socket.SocketConfig       `json:"socket"`
	Dbr               *dbr.DbrConfig             `json:"dbr"`
	TokenKey          string                     `json:"token_key"`
	ExpirationMinutes int64                      `json:"expiration_minutes"`
	Migration         *migration.MigrationConfig `json:"migration"`
	Log               struct {
		Level string `json:"level"`
	} `json:"log"`
}

MessengerConfig ...

type SendMessageRequest

type SendMessageRequest struct {
	From string `json:"from" validate:"notzero"`
	To   string `json:"to" validate:"notzero"`
	Body struct {
		Message string `json:"message"`
	} `json:"body"`
}

type SendMessageResponse

type SendMessageResponse struct {
	Success bool `json:"success"`
}

type SessionOption

type SessionOption func(client *Messenger)

SessionOption ...

func WithConfiguration

func WithConfiguration(config *MessengerConfig) SessionOption

WithConfiguration ...

func WithLogLevel

func WithLogLevel(level logger.Level) SessionOption

WithLogLevel ...

func WithLogger

func WithLogger(logger logger.ILogger) SessionOption

WithLogger ...

func WithManager

func WithManager(mgr *manager.Manager) SessionOption

WithManager ...

type StoragePostgres

type StoragePostgres struct {
	// contains filtered or unexported fields
}

func NewStoragePostgres

func NewStoragePostgres(config *MessengerConfig) (*StoragePostgres, error)

func (*StoragePostgres) GetMessages

func (storage *StoragePostgres) GetMessages(user string) ([]*Message, error)

func (*StoragePostgres) SaveMessage

func (storage *StoragePostgres) SaveMessage(message *Message) error

Directories

Path Synopsis

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL