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 }