/ api / v1 / feeds / create.go
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  }