github.com/e154/smart-home@v0.17.2-0.20240311175135-e530a6e5cd45/db/entity_state.go (about)

     1  // This file is part of the Smart Home
     2  // Program complex distribution https://github.com/e154/smart-home
     3  // Copyright (C) 2016-2023, Filippov Alex
     4  //
     5  // This library is free software: you can redistribute it and/or
     6  // modify it under the terms of the GNU Lesser General Public
     7  // License as published by the Free Software Foundation; either
     8  // version 3 of the License, or (at your option) any later version.
     9  //
    10  // This library is distributed in the hope that it will be useful,
    11  // but WITHOUT ANY WARRANTY; without even the implied warranty of
    12  // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
    13  // Library General Public License for more details.
    14  //
    15  // You should have received a copy of the GNU Lesser General Public
    16  // License along with this library.  If not, see
    17  // <https://www.gnu.org/licenses/>.
    18  
    19  package db
    20  
    21  import (
    22  	"context"
    23  	"fmt"
    24  	"strings"
    25  	"time"
    26  
    27  	"github.com/jackc/pgerrcode"
    28  	"github.com/jackc/pgx/v5/pgconn"
    29  
    30  	"github.com/e154/smart-home/common/apperr"
    31  
    32  	"github.com/e154/smart-home/common"
    33  	"github.com/pkg/errors"
    34  	"gorm.io/gorm"
    35  )
    36  
    37  // EntityStates ...
    38  type EntityStates struct {
    39  	Db *gorm.DB
    40  }
    41  
    42  // EntityState ...
    43  type EntityState struct {
    44  	Id          int64 `gorm:"primary_key"`
    45  	Name        string
    46  	Description string
    47  	Icon        *string
    48  	Entity      *Entity
    49  	EntityId    common.EntityId
    50  	Image       *Image
    51  	ImageId     *int64
    52  	Style       string
    53  	CreatedAt   time.Time `gorm:"<-:create"`
    54  	UpdatedAt   time.Time
    55  }
    56  
    57  // TableName ...
    58  func (d *EntityState) TableName() string {
    59  	return "entity_states"
    60  }
    61  
    62  // Add ...
    63  func (n EntityStates) Add(ctx context.Context, v *EntityState) (id int64, err error) {
    64  	if err = n.Db.WithContext(ctx).Create(&v).Error; err != nil {
    65  		var pgErr *pgconn.PgError
    66  		if errors.As(err, &pgErr) {
    67  			switch pgErr.Code {
    68  			case pgerrcode.UniqueViolation:
    69  				if strings.Contains(pgErr.Message, "name_at_entity_states_unq") {
    70  					err = errors.Wrap(apperr.ErrEntityStateAdd, fmt.Sprintf("state name \"%s\" not unique", v.Name))
    71  					return
    72  				}
    73  			default:
    74  				fmt.Printf("unknown code \"%s\"\n", pgErr.Code)
    75  			}
    76  		}
    77  		err = errors.Wrap(apperr.ErrEntityStateAdd, err.Error())
    78  		return
    79  	}
    80  	id = v.Id
    81  	return
    82  }
    83  
    84  // GetById ...
    85  func (n EntityStates) GetById(ctx context.Context, id int64) (v *EntityState, err error) {
    86  	v = &EntityState{Id: id}
    87  	if err = n.Db.WithContext(ctx).First(&v).Error; err != nil {
    88  		if errors.Is(err, gorm.ErrRecordNotFound) {
    89  			err = errors.Wrap(apperr.ErrEntityStateNotFound, fmt.Sprintf("id \"%d\"", id))
    90  			return
    91  		}
    92  		err = errors.Wrap(apperr.ErrEntityStateGet, err.Error())
    93  	}
    94  	return
    95  }
    96  
    97  // Update ...
    98  func (n EntityStates) Update(ctx context.Context, m *EntityState) (err error) {
    99  	err = n.Db.WithContext(ctx).Model(&EntityState{Id: m.Id}).Updates(map[string]interface{}{
   100  		"name":        m.Name,
   101  		"description": m.Description,
   102  		"icon":        m.Icon,
   103  		//"device_state_id": m.DeviceStateId,
   104  		"entity_id": m.EntityId,
   105  		"image_id":  m.ImageId,
   106  		"style":     m.Style,
   107  	}).Error
   108  	if err != nil {
   109  		var pgErr *pgconn.PgError
   110  		if errors.As(err, &pgErr) {
   111  			switch pgErr.Code {
   112  			case pgerrcode.UniqueViolation:
   113  				if strings.Contains(pgErr.Message, "name_at_entity_states_unq") {
   114  					err = errors.Wrap(apperr.ErrEntityStateUpdate, fmt.Sprintf("state name \"%s\" not unique", m.Name))
   115  					return
   116  				}
   117  			default:
   118  				fmt.Printf("unknown code \"%s\"\n", pgErr.Code)
   119  			}
   120  		}
   121  		err = errors.Wrap(apperr.ErrEntityStateUpdate, err.Error())
   122  	}
   123  	return
   124  }
   125  
   126  // DeleteByEntityId ...
   127  func (n EntityStates) DeleteByEntityId(ctx context.Context, entityId common.EntityId) (err error) {
   128  	if err = n.Db.WithContext(ctx).Delete(&EntityState{}, "entity_id = ?", entityId).Error; err != nil {
   129  		err = errors.Wrap(apperr.ErrEntityStateDelete, err.Error())
   130  		return
   131  	}
   132  	return
   133  }
   134  
   135  // List ...
   136  func (n *EntityStates) List(ctx context.Context, limit, offset int, orderBy, sort string) (list []*EntityState, total int64, err error) {
   137  
   138  	if err = n.Db.WithContext(ctx).Model(EntityState{}).Count(&total).Error; err != nil {
   139  		err = errors.Wrap(apperr.ErrEntityStateList, err.Error())
   140  		return
   141  	}
   142  
   143  	list = make([]*EntityState, 0)
   144  	err = n.Db.WithContext(ctx).
   145  		Limit(limit).
   146  		Offset(offset).
   147  		Order(fmt.Sprintf("%s %s", sort, orderBy)).
   148  		Find(&list).
   149  		Error
   150  	if err != nil {
   151  		err = errors.Wrap(apperr.ErrEntityStateList, err.Error())
   152  		return
   153  	}
   154  	return
   155  }
   156  
   157  // AddMultiple ...
   158  func (n *EntityStates) AddMultiple(ctx context.Context, states []*EntityState) (err error) {
   159  	if err = n.Db.WithContext(ctx).Create(&states).Error; err != nil {
   160  		var pgErr *pgconn.PgError
   161  		if errors.As(err, &pgErr) {
   162  			switch pgErr.Code {
   163  			case pgerrcode.UniqueViolation:
   164  				if strings.Contains(pgErr.Message, "name_at_entity_states_unq") {
   165  					err = errors.Wrap(apperr.ErrEntityStateUpdate, "multiple insert")
   166  					return
   167  				}
   168  			default:
   169  				fmt.Printf("unknown code \"%s\"\n", pgErr.Code)
   170  			}
   171  		}
   172  		err = errors.Wrap(apperr.ErrEntityStateAdd, err.Error())
   173  	}
   174  	return
   175  }