package repository import ( "encoding/json" "go.etcd.io/bbolt" "go.uber.org/zap" "gitea.pena/PenaSide/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 }