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  }