github.com/e154/smart-home@v0.17.2-0.20240311175135-e530a6e5cd45/db/message_delivery.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 "time" 25 26 "github.com/e154/smart-home/common" 27 28 "github.com/e154/smart-home/common/apperr" 29 30 "github.com/pkg/errors" 31 "gorm.io/gorm" 32 ) 33 34 // MessageDeliveries ... 35 type MessageDeliveries struct { 36 Db *gorm.DB 37 } 38 39 // MessageDelivery ... 40 type MessageDelivery struct { 41 Id int64 `gorm:"primary_key"` 42 Message *Message 43 MessageId int64 44 Address string 45 EntityId *common.EntityId 46 Status string 47 ErrorMessageStatus *string `gorm:"column:error_system_code"` 48 ErrorMessageBody *string `gorm:"column:error_system_message"` 49 CreatedAt time.Time `gorm:"<-:create"` 50 UpdatedAt time.Time 51 } 52 53 // TableName ... 54 func (d *MessageDelivery) TableName() string { 55 return "message_deliveries" 56 } 57 58 // Add ... 59 func (n *MessageDeliveries) Add(ctx context.Context, msg *MessageDelivery) (id int64, err error) { 60 if err = n.Db.WithContext(ctx).Create(&msg).Error; err != nil { 61 err = errors.Wrap(apperr.ErrMessageDeliveryAdd, err.Error()) 62 return 63 } 64 id = msg.Id 65 return 66 } 67 68 func (n *MessageDeliveries) List(ctx context.Context, limit, offset int, orderBy, sort string, queryObj *MessageDeliveryQuery) (list []*MessageDelivery, total int64, err error) { 69 70 list = make([]*MessageDelivery, 0) 71 q := n.Db.WithContext(ctx).Model(&MessageDelivery{}). 72 Joins(`left join messages on messages.id = message_deliveries.message_id`) 73 74 if sort != "" && orderBy != "" { 75 q = q.Order(fmt.Sprintf("%s %s", sort, orderBy)) 76 } 77 78 q = q.Preload("Message") 79 if queryObj != nil { 80 if queryObj.StartDate != nil { 81 q = q.Where("message_deliveries.created_at >= ?", &queryObj.StartDate) 82 } 83 if queryObj.EndDate != nil { 84 q = q.Where("message_deliveries.created_at <= ?", &queryObj.EndDate) 85 } 86 if len(queryObj.Types) > 0 { 87 q = q.Where("messages.type in (?)", queryObj.Types) 88 } 89 } 90 91 if err = q.Count(&total).Error; err != nil { 92 err = errors.Wrap(apperr.ErrMessageDeliveryList, err.Error()) 93 return 94 } 95 96 err = q. 97 Limit(limit). 98 Offset(offset). 99 Find(&list). 100 Error 101 102 if err != nil { 103 err = errors.Wrap(apperr.ErrMessageDeliveryList, err.Error()) 104 } 105 return 106 } 107 108 // GetAllUncompleted ... 109 func (n *MessageDeliveries) GetAllUncompleted(ctx context.Context, limit, offset int) (list []*MessageDelivery, total int64, err error) { 110 111 if err = n.Db.WithContext(ctx).Model(&MessageDelivery{}).Count(&total).Error; err != nil { 112 err = errors.Wrap(apperr.ErrMessageDeliveryUpdate, err.Error()) 113 return 114 } 115 116 list = make([]*MessageDelivery, 0) 117 err = n.Db.WithContext(ctx). 118 Where("status in ('in_progress', 'new')"). 119 Limit(limit). 120 Offset(offset). 121 Preload("Message"). 122 Find(&list). 123 Error 124 if err != nil { 125 err = errors.Wrap(apperr.ErrMessageDeliveryUpdate, err.Error()) 126 } 127 return 128 } 129 130 // SetStatus ... 131 func (n *MessageDeliveries) SetStatus(ctx context.Context, msg *MessageDelivery) (err error) { 132 133 err = n.Db.WithContext(ctx).Model(&MessageDelivery{Id: msg.Id}). 134 Updates(map[string]interface{}{ 135 "status": msg.Status, 136 "error_system_code": msg.ErrorMessageStatus, 137 "error_system_message": msg.ErrorMessageBody, 138 }).Error 139 if err != nil { 140 err = errors.Wrap(apperr.ErrMessageDeliveryUpdate, err.Error()) 141 } 142 return 143 } 144 145 // Delete ... 146 func (n *MessageDeliveries) Delete(ctx context.Context, id int64) (err error) { 147 if err = n.Db.WithContext(ctx).Delete(&MessageDelivery{Id: id}).Error; err != nil { 148 err = errors.Wrap(apperr.ErrMessageDeliveryDelete, err.Error()) 149 } 150 return 151 } 152 153 // GetById ... 154 func (n *MessageDeliveries) GetById(ctx context.Context, id int64) (msg *MessageDelivery, err error) { 155 156 msg = &MessageDelivery{} 157 err = n.Db.WithContext(ctx).Model(msg). 158 Where("id = ?", id). 159 Preload("Message"). 160 First(&msg). 161 Error 162 if err != nil { 163 if errors.Is(err, gorm.ErrRecordNotFound) { 164 err = errors.Wrap(apperr.ErrMessageDeliveryNotFound, fmt.Sprintf("id \"%d\"", id)) 165 return 166 } 167 err = errors.Wrap(apperr.ErrMessageDeliveryGet, err.Error()) 168 } 169 return 170 } 171 172 // MessageDeliveryQuery ... 173 type MessageDeliveryQuery struct { 174 StartDate *time.Time `json:"start_date"` 175 EndDate *time.Time `json:"end_date"` 176 Types []string `json:"types"` 177 }