delete_thing.go 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. package thing
  2. import (
  3. "context"
  4. "database/sql"
  5. "errors"
  6. "git.dmitriygnatenko.ru/dima/go-common/logger"
  7. "github.com/gofiber/fiber/v2"
  8. "git.dmitriygnatenko.ru/dima/homethings/internal/factory"
  9. "git.dmitriygnatenko.ru/dima/homethings/internal/helpers/request"
  10. )
  11. // @Router /api/v1/things/{thingId} [delete]
  12. // @Param thingId path int true "Thing ID"
  13. // @Success 200 {object} dto.EmptyResponse
  14. // @Failure 400 {object} dto.ErrorResponse
  15. // @Failure 500 {object} dto.ErrorResponse
  16. // @Summary Delete thing
  17. // @Tags Things
  18. // @security APIKey
  19. // @Accept json
  20. // @Produce json
  21. func DeleteThingHandler(
  22. tm TransactionManager,
  23. thingRepository ThingRepository,
  24. thingTagRepository ThingTagRepository,
  25. placeThingRepository PlaceThingRepository,
  26. thingImageRepository ThingImageRepository,
  27. thingNotificationRepository ThingNotificationRepository,
  28. fileRepository FileRepository,
  29. ) fiber.Handler {
  30. return func(fctx *fiber.Ctx) error {
  31. ctx := fctx.Context()
  32. id, err := request.ConvertToUint64(fctx, "thingId")
  33. if err != nil {
  34. logger.Info(ctx, err.Error())
  35. return fiber.NewError(fiber.StatusBadRequest, err.Error())
  36. }
  37. if _, err = thingRepository.Get(ctx, id); err != nil {
  38. if errors.Is(err, sql.ErrNoRows) {
  39. logger.Info(ctx, err.Error())
  40. return fiber.NewError(fiber.StatusBadRequest, "")
  41. }
  42. logger.Error(ctx, err.Error())
  43. return fiber.NewError(fiber.StatusInternalServerError, err.Error())
  44. }
  45. err = tm.ReadCommitted(ctx, func(ctx context.Context) error {
  46. if txErr := placeThingRepository.DeleteThing(ctx, id); txErr != nil {
  47. return txErr
  48. }
  49. images, txErr := thingImageRepository.GetByThingID(ctx, id)
  50. if txErr != nil {
  51. return txErr
  52. }
  53. imageURLs := make([]string, 0, len(images))
  54. for i := range images {
  55. imageURLs = append(imageURLs, images[i].Image)
  56. if txErr = thingImageRepository.Delete(ctx, images[i].ID); txErr != nil {
  57. return txErr
  58. }
  59. }
  60. if txErr = thingTagRepository.DeleteByThingID(ctx, id); txErr != nil {
  61. return txErr
  62. }
  63. if txErr = thingNotificationRepository.Delete(ctx, id); txErr != nil {
  64. return txErr
  65. }
  66. if txErr = thingRepository.Delete(ctx, id); txErr != nil {
  67. return txErr
  68. }
  69. if len(imageURLs) > 0 {
  70. for i := range imageURLs {
  71. if txErr = fileRepository.Delete(imageURLs[i]); txErr != nil {
  72. return txErr
  73. }
  74. }
  75. }
  76. return nil
  77. })
  78. if err != nil {
  79. logger.Error(ctx, err.Error())
  80. return fiber.NewError(fiber.StatusInternalServerError, err.Error())
  81. }
  82. return fctx.JSON(factory.CreateEmptyResponse())
  83. }
  84. }