feedback/internal/repository/feedback.go
2023-04-20 07:03:21 +05:00

116 lines
2.3 KiB
Go

package repository
import (
"encoding/json"
"go.etcd.io/bbolt"
"go.uber.org/zap"
"penahub.gitlab.yandexcloud.net/backend/templategen_feedback/internal/models"
"time"
)
type FeedbackRepository struct {
logger *zap.Logger
db *bbolt.DB
}
var feedbackBucket = []byte("feedbacks")
func NewFeedback(logger *zap.Logger, db *bbolt.DB) *FeedbackRepository {
r := &FeedbackRepository{logger: logger, db: db}
return r
}
// CreateBucket - создать корзину
func (r *FeedbackRepository) CreateBucket() error {
fn := func(tx *bbolt.Tx) error {
_, err := tx.CreateBucketIfNotExists(feedbackBucket)
if r.err(err) {
return err
}
return nil
}
return r.db.Update(fn)
}
// Insert - вставить запись
func (r *FeedbackRepository) Insert(record *models.Feedback) error {
fn := func(tx *bbolt.Tx) error {
b := tx.Bucket(feedbackBucket)
encoded, err := json.Marshal(record)
if r.err(err) {
return err
}
err = b.Put([]byte(record.CreatedAt.Format(time.StampNano)), encoded)
if r.err(err) {
return err
}
return nil
}
return r.db.Update(fn)
}
// GetAll - получить все записи
func (r *FeedbackRepository) GetAll() ([]*models.Feedback, error) {
var result []*models.Feedback
fn := func(tx *bbolt.Tx) error {
b := tx.Bucket(feedbackBucket)
return b.ForEach(func(_, v []byte) error {
var data models.Feedback
err := json.Unmarshal(v, &data)
if r.err(err) {
return err
}
result = append(result, &data)
return nil
})
}
return result, r.db.View(fn)
}
// Get - получить запись по id
func (r *FeedbackRepository) Get(id string) (*models.Feedback, error) {
var data models.Feedback
fn := func(tx *bbolt.Tx) error {
b := tx.Bucket(feedbackBucket)
body := b.Get([]byte(id))
err := json.Unmarshal(body, &data)
if r.err(err) {
return err
}
return nil
}
return &data, r.db.View(fn)
}
// Delete - удалить запись по id
func (r *FeedbackRepository) Delete(id string) error {
fn := func(tx *bbolt.Tx) error {
b := tx.Bucket(feedbackBucket)
return b.Delete([]byte(id))
}
return r.db.Update(fn)
}
// err - логгирует если есть ошибка и возвращает true
func (r *FeedbackRepository) err(err error) bool {
if err != nil {
r.logger.Error("RepositoryFeedback", zap.Error(err))
return true
}
return false
}