Advertisement
gravitiq

Untitled

Jun 19th, 2025
468
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Go 2.92 KB | None | 0 0
  1. package main
  2.  
  3. import (
  4.     "database/sql"
  5.     "fmt"
  6.     "log"
  7.  
  8.     _ "github.com/mattn/go-sqlite3"
  9.  
  10.     "github.com/nats-io/nats.go"
  11. )
  12.  
  13. // Storage — структура хранилища с клиентом *sql.DB
  14. type Storage struct {
  15.     db *sql.DB
  16. }
  17.  
  18. // NewStorage — конструктор хранилища, сам создает клиент *sql.DB
  19. func NewStorage(dsn string) (*Storage, error) {
  20.     db, err := sql.Open("sqlite3", dsn)
  21.     if err != nil {
  22.         return nil, err
  23.     }
  24.  
  25.     s := &Storage{
  26.         db: db,
  27.     }
  28.     return s, nil
  29. }
  30.  
  31. func (s *Storage) Set(key, value string) error {
  32.     _, err := s.db.Exec(`CREATE TABLE IF NOT EXISTS data (k TEXT PRIMARY KEY, v TEXT)`)
  33.     if err != nil {
  34.         return err
  35.     }
  36.  
  37.     _, err = s.db.Exec(`INSERT OR REPLACE INTO data(k, v) VALUES (?, ?)`, key, value)
  38.     if err != nil {
  39.         return err
  40.     }
  41.  
  42.     return nil
  43. }
  44.  
  45. func (s *Storage) Get(key string) (string, error) {
  46.     row := s.db.QueryRow(`SELECT v FROM data WHERE k = ?`, key)
  47.  
  48.     var value string
  49.  
  50.     err := row.Scan(&value)
  51.     if err != nil {
  52.         return "", err
  53.     }
  54.  
  55.     return value, nil
  56. }
  57.  
  58. // NATS — структура NATS с клиентом *nats.Conn
  59. type NATS struct {
  60.     conn *nats.Conn
  61. }
  62.  
  63. // NewNATS — конструктор, сам создает клиента *nats.Conn
  64. func NewNATS(url string) (*NATS, error) {
  65.     conn, err := nats.Connect(url)
  66.     if err != nil {
  67.         return nil, err
  68.     }
  69.  
  70.     n := &NATS{
  71.         conn: conn,
  72.     }
  73.     return n, nil
  74. }
  75.  
  76. func (n *NATS) Publish(subject, message string) error {
  77.     err := n.conn.Publish(subject, []byte(message))
  78.     if err != nil {
  79.         return err
  80.     }
  81.  
  82.     return nil
  83. }
  84.  
  85. // Service — бизнес логика
  86. type Service struct {
  87.     storage *Storage
  88.     nats    *NATS
  89. }
  90.  
  91. func NewService(storage *Storage, nats *NATS) *Service {
  92.     s := &Service{
  93.         storage: storage,
  94.         nats:    nats,
  95.     }
  96.     return s
  97. }
  98.  
  99. func (s *Service) SaveData(key, value string) error {
  100.     err := s.storage.Set(key, value)
  101.     if err != nil {
  102.         return err
  103.     }
  104.  
  105.     err = s.nats.Publish("updates", fmt.Sprintf("%s=%s", key, value))
  106.     if err != nil {
  107.         return err
  108.     }
  109.  
  110.     return nil
  111. }
  112.  
  113. // Handlers — структура хендлеров
  114. type Handlers struct {
  115.     service *Service
  116. }
  117.  
  118. func NewHandlers(service *Service) *Handlers {
  119.     h := &Handlers{
  120.         service: service,
  121.     }
  122.     return h
  123. }
  124.  
  125. func (h *Handlers) HandleRequest(key, value string) error {
  126.     err := h.service.SaveData(key, value)
  127.     if err != nil {
  128.         return err
  129.     }
  130.  
  131.     fmt.Println("Request handled")
  132.     return nil
  133. }
  134.  
  135. func main() {
  136.     storage, err := NewStorage(":memory:")
  137.     if err != nil {
  138.         log.Fatal(err)
  139.     }
  140.  
  141.     natsConn, err := NewNATS(nats.DefaultURL)
  142.     if err != nil {
  143.         log.Fatal(err)
  144.     }
  145.  
  146.     service := NewService(storage, natsConn)
  147.     handlers := NewHandlers(service)
  148.  
  149.     err = handlers.HandleRequest("foo", "bar")
  150.     if err != nil {
  151.         log.Fatal(err)
  152.     }
  153.  
  154.     value, err := storage.Get("foo")
  155.     if err != nil {
  156.         log.Fatal(err)
  157.     }
  158.  
  159.     fmt.Printf("Stored value: %s\n", value)
  160. }
  161.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement