delete_place.go 3.9 KB

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