This commit is contained in:
Tomas Dvorak
2026-01-26 08:13:18 +01:00
parent aa036b6550
commit dfc079288f
505 changed files with 95755 additions and 5712 deletions
@@ -231,6 +231,80 @@ func (cc *ContactController) GetNewsletterSubscribers(c *gin.Context) {
c.JSON(http.StatusOK, subs)
}
// CreateNewsletterSubscriber creates a new newsletter subscriber (admin)
// @Summary Create newsletter subscriber
// @Description Creates a new newsletter subscriber with optional preferences (admin only)
// @Tags admin
// @Security Bearer
// @Accept json
// @Produce json
// @Param subscriber body object true "Subscriber data"
// @Success 201 {object} models.NewsletterSubscription
// @Failure 400 {object} map[string]string
// @Failure 403 {object} map[string]string
// @Failure 500 {object} map[string]string
// @Router /api/v1/admin/newsletter/subscribers [post]
func (cc *ContactController) CreateNewsletterSubscriber(c *gin.Context) {
if c.GetString("userRole") != "admin" {
c.JSON(http.StatusForbidden, gin.H{"error": "Access denied"})
return
}
var body struct {
Email string `json:"email" binding:"required,email"`
Preferences map[string]bool `json:"preferences"`
}
if err := c.ShouldBindJSON(&body); err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": "Invalid payload: " + err.Error()})
return
}
// Check if subscriber already exists
var existingSub models.NewsletterSubscription
if err := cc.DB.Where("email = ?", body.Email).First(&existingSub).Error; err == nil {
// Subscriber exists, update status to active and preferences
existingSub.IsActive = true
if body.Preferences != nil {
if body.Preferences != nil {
m := datatypes.JSONMap{}
for k, v := range body.Preferences {
m[k] = v
}
existingSub.Preferences = m
}
}
if err := cc.DB.Save(&existingSub).Error; err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to update existing subscriber"})
return
}
cc.recalcNewsletterAutomationEnabled()
c.JSON(http.StatusOK, existingSub)
return
}
// Create new subscriber
preferences := datatypes.JSONMap{}
if body.Preferences != nil {
for k, v := range body.Preferences {
preferences[k] = v
}
}
sub := models.NewsletterSubscription{
Email: body.Email,
IsActive: true,
Preferences: preferences,
}
if err := cc.DB.Create(&sub).Error; err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to create subscriber"})
return
}
// Recalculate automation flag after adding subscriber
cc.recalcNewsletterAutomationEnabled()
c.JSON(http.StatusCreated, sub)
}
// UpdateNewsletterSubscriberStatus toggles is_active for a subscriber (admin)
func (cc *ContactController) UpdateNewsletterSubscriberStatus(c *gin.Context) {
if c.GetString("userRole") != "admin" {