Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package main
- import (
- "database/sql"
- "fmt"
- "log"
- _ "github.com/mattn/go-sqlite3"
- "github.com/nats-io/nats.go"
- )
- // Storage — структура хранилища с клиентом *sql.DB
- type Storage struct {
- db *sql.DB
- }
- // NewStorage — конструктор хранилища, сам создает клиент *sql.DB
- func NewStorage(dsn string) (*Storage, error) {
- db, err := sql.Open("sqlite3", dsn)
- if err != nil {
- return nil, err
- }
- s := &Storage{
- db: db,
- }
- return s, nil
- }
- func (s *Storage) Set(key, value string) error {
- _, err := s.db.Exec(`CREATE TABLE IF NOT EXISTS data (k TEXT PRIMARY KEY, v TEXT)`)
- if err != nil {
- return err
- }
- _, err = s.db.Exec(`INSERT OR REPLACE INTO data(k, v) VALUES (?, ?)`, key, value)
- if err != nil {
- return err
- }
- return nil
- }
- func (s *Storage) Get(key string) (string, error) {
- row := s.db.QueryRow(`SELECT v FROM data WHERE k = ?`, key)
- var value string
- err := row.Scan(&value)
- if err != nil {
- return "", err
- }
- return value, nil
- }
- // NATS — структура NATS с клиентом *nats.Conn
- type NATS struct {
- conn *nats.Conn
- }
- // NewNATS — конструктор, сам создает клиента *nats.Conn
- func NewNATS(url string) (*NATS, error) {
- conn, err := nats.Connect(url)
- if err != nil {
- return nil, err
- }
- n := &NATS{
- conn: conn,
- }
- return n, nil
- }
- func (n *NATS) Publish(subject, message string) error {
- err := n.conn.Publish(subject, []byte(message))
- if err != nil {
- return err
- }
- return nil
- }
- // Service — бизнес логика
- type Service struct {
- storage *Storage
- nats *NATS
- }
- func NewService(storage *Storage, nats *NATS) *Service {
- s := &Service{
- storage: storage,
- nats: nats,
- }
- return s
- }
- func (s *Service) SaveData(key, value string) error {
- err := s.storage.Set(key, value)
- if err != nil {
- return err
- }
- err = s.nats.Publish("updates", fmt.Sprintf("%s=%s", key, value))
- if err != nil {
- return err
- }
- return nil
- }
- // Handlers — структура хендлеров
- type Handlers struct {
- service *Service
- }
- func NewHandlers(service *Service) *Handlers {
- h := &Handlers{
- service: service,
- }
- return h
- }
- func (h *Handlers) HandleRequest(key, value string) error {
- err := h.service.SaveData(key, value)
- if err != nil {
- return err
- }
- fmt.Println("Request handled")
- return nil
- }
- func main() {
- storage, err := NewStorage(":memory:")
- if err != nil {
- log.Fatal(err)
- }
- natsConn, err := NewNATS(nats.DefaultURL)
- if err != nil {
- log.Fatal(err)
- }
- service := NewService(storage, natsConn)
- handlers := NewHandlers(service)
- err = handlers.HandleRequest("foo", "bar")
- if err != nil {
- log.Fatal(err)
- }
- value, err := storage.Get("foo")
- if err != nil {
- log.Fatal(err)
- }
- fmt.Printf("Stored value: %s\n", value)
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement