116 lines
2.3 KiB
Go
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
|
|
}
|