delete_place.go 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. package place
  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. "git.dmitriygnatenko.ru/dima/homethings/internal/models"
  11. )
  12. // @Router /api/v1/places/{placeId} [delete]
  13. // @Param placeId path int true "Place ID"
  14. // @Success 200 {object} dto.EmptyResponse
  15. // @Failure 400 {object} dto.ErrorResponse
  16. // @Failure 500 {object} dto.ErrorResponse
  17. // @Summary Delete place
  18. // @Tags Places
  19. // @security APIKey
  20. // @Accept json
  21. // @Produce json
  22. func DeletePlaceHandler(
  23. tm TransactionManager,
  24. placeRepository PlaceRepository,
  25. thingRepository ThingRepository,
  26. placeImageRepository PlaceImageRepository,
  27. thingImageRepository ThingImageRepository,
  28. placeThingRepository PlaceThingRepository,
  29. thingTagRepository ThingTagRepository,
  30. thingNotificationRepository ThingNotificationRepository,
  31. fileRepository FileRepository,
  32. ) fiber.Handler {
  33. return func(fctx *fiber.Ctx) error {
  34. ctx := fctx.Context()
  35. id, err := request.ConvertToUint64(fctx, "placeId")
  36. if err != nil {
  37. logger.Info(ctx, err.Error())
  38. return fiber.NewError(fiber.StatusBadRequest, err.Error())
  39. }
  40. _, err = placeRepository.Get(ctx, id)
  41. if err != nil {
  42. if errors.Is(err, sql.ErrNoRows) {
  43. logger.Info(ctx, err.Error())
  44. return fiber.NewError(fiber.StatusBadRequest, "")
  45. }
  46. logger.Error(ctx, err.Error())
  47. return fiber.NewError(fiber.StatusInternalServerError, err.Error())
  48. }
  49. nestedRes, err := placeRepository.GetNestedPlaces(ctx, id)
  50. if err != nil {
  51. logger.Error(ctx, err.Error())
  52. return fiber.NewError(fiber.StatusInternalServerError, err.Error())
  53. }
  54. if len(nestedRes) > 0 {
  55. return fiber.NewError(fiber.StatusBadRequest, "")
  56. }
  57. err = tm.ReadCommitted(ctx, func(ctx context.Context) error {
  58. placeImages, txErr := placeImageRepository.GetByPlaceID(ctx, id)
  59. if txErr != nil {
  60. return txErr
  61. }
  62. things, txErr := thingRepository.GetByPlaceID(ctx, id)
  63. if txErr != nil {
  64. return txErr
  65. }
  66. var thingImages []models.Image
  67. thingIDs := make([]uint64, 0, len(things))
  68. for _, thing := range things {
  69. thingIDs = append(thingIDs, thing.ID)
  70. thingImagesRes, thingImagesErr := thingImageRepository.GetByThingID(ctx, thing.ID)
  71. if thingImagesErr != nil {
  72. return thingImagesErr
  73. }
  74. thingImages = append(thingImages, thingImagesRes...)
  75. }
  76. placeImageURLs := make([]string, 0, len(placeImages))
  77. for i := range placeImages {
  78. placeImageURLs = append(placeImageURLs, placeImages[i].Image)
  79. if txErr = placeImageRepository.Delete(ctx, placeImages[i].ID); txErr != nil {
  80. return txErr
  81. }
  82. }
  83. for i := range thingImages {
  84. if txErr = thingImageRepository.Delete(ctx, thingImages[i].ID); txErr != nil {
  85. return txErr
  86. }
  87. }
  88. for _, thingID := range thingIDs {
  89. if txErr = placeThingRepository.DeleteThing(ctx, thingID); txErr != nil {
  90. return txErr
  91. }
  92. if txErr = thingTagRepository.DeleteByThingID(ctx, thingID); txErr != nil {
  93. return txErr
  94. }
  95. if txErr = thingNotificationRepository.Delete(ctx, thingID); txErr != nil {
  96. return txErr
  97. }
  98. if txErr = thingRepository.Delete(ctx, thingID); txErr != nil {
  99. return txErr
  100. }
  101. }
  102. if txErr = placeRepository.Delete(ctx, id); txErr != nil {
  103. return txErr
  104. }
  105. if len(placeImageURLs) > 0 {
  106. for i := range placeImageURLs {
  107. if txErr = fileRepository.Delete(placeImageURLs[i]); txErr != nil {
  108. return txErr
  109. }
  110. }
  111. }
  112. for i := range thingImages {
  113. if txErr = fileRepository.Delete(thingImages[i].Image); txErr != nil {
  114. return txErr
  115. }
  116. }
  117. return nil
  118. })
  119. if err != nil {
  120. logger.Error(ctx, err.Error())
  121. return fiber.NewError(fiber.StatusInternalServerError, err.Error())
  122. }
  123. return fctx.JSON(factory.CreateEmptyResponse())
  124. }
  125. }