create.go
1 package feeds 2 3 import ( 4 // "strings" 5 "context" 6 7 "github.com/go-playground/validator/v10" 8 "github.com/google/uuid" 9 10 "github.com/gofiber/fiber/v2" 11 // "github.com/mrusme/journalist/ent/user" 12 // "github.com/mrusme/journalist/ent" 13 14 "github.com/mrusme/journalist/crawler" 15 "github.com/mrusme/journalist/rss" 16 17 "go.uber.org/zap" 18 ) 19 20 type FeedCreateResponse struct { 21 Success bool `json:"success"` 22 Feed *FeedShowModel `json:"feed"` 23 Message string `json:"message"` 24 } 25 26 // Create godoc 27 // @Summary Create a feed 28 // @Description Add a new feed 29 // @Tags feeds 30 // @Accept json 31 // @Produce json 32 // @Param feed body FeedCreateModel true "Add feed" 33 // @Success 200 {object} FeedCreateResponse 34 // @Failure 400 {object} FeedCreateResponse 35 // @Failure 404 {object} FeedCreateResponse 36 // @Failure 500 {object} FeedCreateResponse 37 // @Router /feeds [post] 38 // @security BasicAuth 39 func (h *handler) Create(ctx *fiber.Ctx) error { 40 var err error 41 42 // sessionId := ctx.Locals("user_id").(string) 43 // sessionRole := ctx.Locals("role").(string) 44 45 createFeed := new(FeedCreateModel) 46 if err = ctx.BodyParser(createFeed); err != nil { 47 h.logger.Debug( 48 "Body parsing failed", 49 zap.Error(err), 50 ) 51 return ctx. 52 Status(fiber.StatusInternalServerError). 53 JSON(FeedCreateResponse{ 54 Success: false, 55 Feed: nil, 56 Message: err.Error(), 57 }) 58 } 59 60 validate := validator.New() 61 if err = validate.Struct(*createFeed); err != nil { 62 h.logger.Debug( 63 "Validation failed", 64 zap.Error(err), 65 ) 66 return ctx. 67 Status(fiber.StatusBadRequest). 68 JSON(FeedCreateResponse{ 69 Success: false, 70 Feed: nil, 71 Message: err.Error(), 72 }) 73 } 74 75 crwlr := crawler.New(h.logger) 76 defer crwlr.Close() 77 78 crwlr.SetLocation(createFeed.URL) 79 80 if createFeed.Username != "" && createFeed.Password != "" { 81 crwlr.SetBasicAuth(createFeed.Username, createFeed.Password) 82 } 83 84 _, feedLink, err := crwlr.GetFeedLink() 85 if err != nil { 86 h.logger.Debug( 87 "Could not get feed link", 88 zap.Error(err), 89 ) 90 return ctx. 91 Status(fiber.StatusBadRequest). 92 JSON(FeedCreateResponse{ 93 Success: false, 94 Feed: nil, 95 Message: err.Error(), 96 }) 97 } 98 99 rc, errr := rss.NewClient( 100 feedLink, 101 createFeed.Username, 102 createFeed.Password, 103 false, 104 []string{}, 105 h.logger, 106 ) 107 if len(errr) > 0 { 108 h.logger.Debug( 109 "Could not fetch feed", 110 zap.Error(err), 111 ) 112 return ctx. 113 Status(fiber.StatusInternalServerError). 114 JSON(FeedCreateResponse{ 115 Success: false, 116 Feed: nil, 117 Message: err.Error(), 118 }) 119 } 120 121 dbFeedTmp := h.entClient.Feed. 122 Create() 123 124 dbFeedTmp = rc.SetFeed( 125 feedLink, 126 createFeed.Username, 127 createFeed.Password, 128 dbFeedTmp, 129 ) 130 feedId, err := dbFeedTmp. 131 OnConflictColumns("url", "username", "password"). 132 UpdateNewValues(). 133 ID(context.Background()) 134 if err != nil { 135 h.logger.Debug( 136 "Could not upsert feed", 137 zap.Error(err), 138 ) 139 return ctx. 140 Status(fiber.StatusInternalServerError). 141 JSON(FeedCreateResponse{ 142 Success: false, 143 Feed: nil, 144 Message: err.Error(), 145 }) 146 } 147 148 sessionUserId := ctx.Locals("user_id").(string) 149 myId, err := uuid.Parse(sessionUserId) 150 if err != nil { 151 h.logger.Debug( 152 "Could not parse user ID", 153 zap.Error(err), 154 ) 155 return ctx. 156 Status(fiber.StatusInternalServerError). 157 JSON(FeedCreateResponse{ 158 Success: false, 159 Feed: nil, 160 Message: err.Error(), 161 }) 162 } 163 164 dbSubscriptionTmp := h.entClient.Subscription. 165 Create(). 166 SetUserID(myId). 167 SetFeedID(feedId) 168 169 if createFeed.Name != "" { 170 dbSubscriptionTmp = dbSubscriptionTmp. 171 SetName(createFeed.Name) 172 } 173 174 if createFeed.Group != "" { 175 dbSubscriptionTmp = dbSubscriptionTmp. 176 SetGroup(createFeed.Group) 177 } 178 179 dbSubscription, err := dbSubscriptionTmp. 180 Save(context.Background()) 181 if err != nil { 182 h.logger.Debug( 183 "Could not add feed subscription", 184 zap.Error(err), 185 ) 186 return ctx. 187 Status(fiber.StatusInternalServerError). 188 JSON(FeedCreateResponse{ 189 Success: false, 190 Feed: nil, 191 Message: err.Error(), 192 }) 193 } 194 195 showFeed := FeedShowModel{ 196 ID: feedId.String(), 197 Name: dbSubscription.Name, 198 URL: createFeed.URL, 199 Group: dbSubscription.Group, 200 } 201 202 return ctx. 203 Status(fiber.StatusOK). 204 JSON(FeedCreateResponse{ 205 Success: true, 206 Feed: &showFeed, 207 Message: "", 208 }) 209 }