B: implement audit trail saving

This commit is contained in:
Preston Baxter 2023-11-16 19:43:34 -06:00
parent 1ecc00a86e
commit f703f2d1ab
3 changed files with 68 additions and 14 deletions

View File

@ -12,18 +12,18 @@ import (
"git.preston-baxter.com/Preston_PLB/capstone/webhook-service/vendors/pco" "git.preston-baxter.com/Preston_PLB/capstone/webhook-service/vendors/pco"
"git.preston-baxter.com/Preston_PLB/capstone/webhook-service/vendors/pco/services" "git.preston-baxter.com/Preston_PLB/capstone/webhook-service/vendors/pco/services"
"git.preston-baxter.com/Preston_PLB/capstone/webhook-service/vendors/pco/webhooks" "git.preston-baxter.com/Preston_PLB/capstone/webhook-service/vendors/pco/webhooks"
yt_helpers "git.preston-baxter.com/Preston_PLB/capstone/webhook-service/vendors/youtube"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
"github.com/google/jsonapi" "github.com/google/jsonapi"
"go.mongodb.org/mongo-driver/bson/primitive" "go.mongodb.org/mongo-driver/bson/primitive"
"golang.org/x/oauth2" "golang.org/x/oauth2"
"google.golang.org/api/option" "google.golang.org/api/option"
"google.golang.org/api/youtube/v3" "google.golang.org/api/youtube/v3"
yt_helpers "git.preston-baxter.com/Preston_PLB/capstone/webhook-service/vendors/youtube"
) )
var ( var (
eventRegexKeys = map[string]string{"plan": `^services\.v2\.events\.plan\..*`} eventRegexKeys = map[string]string{"plan": `^services\.v2\.events\.plan\..*`}
actionFuncMap = map[string]actionFunc{"youtube.livestream": ScheduleLiveStreamFromWebhook} actionFuncMap = map[string]actionFunc{"youtube.livestream": ScheduleBroadcastFromWebhook}
) )
type actionFunc func(*gin.Context, *webhooks.EventDelivery) error type actionFunc func(*gin.Context, *webhooks.EventDelivery) error
@ -72,7 +72,6 @@ func ConsumePcoWebhook(c *gin.Context) {
return return
} }
//perform actions //perform actions
//loop through all actions a user has //loop through all actions a user has
for _, mapping := range actionMappings { for _, mapping := range actionMappings {
@ -186,29 +185,55 @@ func ScheduleBroadcastFromWebhook(c *gin.Context, body *webhooks.EventDelivery)
return err return err
} }
//Save audit point
eventRecievedAudit := &models.EventRecieved{
UserId: uid,
VendorName: models.PCO_VENDOR_NAME,
Type: body.Name,
}
if err := mongo.SaveModel(eventRecievedAudit); err != nil {
log.WithError(err).WithField("EventRecieved", eventRecievedAudit).Error("Failed to save audit event. Logging here and resuming")
}
//create the broadcast //create the broadcast
//TODO: handle update //TODO: handle update
//TODO: handle delete //TODO: handle delete
var broadcast *youtube.LiveBroadcast
switch body.Name { switch body.Name {
case "services.v2.events.plan.created": case "services.v2.events.plan.created":
return scheduleNewBroadcastFromWebhook(c, payload, ytClient, pcoClient) broadcast, err = scheduleNewBroadcastFromWebhook(c, payload, ytClient, pcoClient)
default: default:
return fmt.Errorf("Unkown event error: %s", body.Name) return fmt.Errorf("Unkown event error: %s", body.Name)
} }
}
func scheduleNewBroadcastFromWebhook(c *gin.Context, plan *services.Plan, ytClient *youtube.Service, pcoClient *pco.PcoApiClient) error { //build audit trail after action was taken
times, err := pcoClient.GetPlanTimes(plan.ServiceType.Id, plan.Id) broadcastModel := &models.YoutubeBroadcast{
if err != nil { UserId: uid,
log.WithError(err).Error("Failed to get plan times") Details: broadcast,
return err
} }
broadcast, err := yt_helpers.InsertBroadcast(ytClient, plan.Title, times.StartsAt, yt_helpers.STATUS_PRIVATE) actionTaken := &models.ActionTaken{
UserId: uid,
TriggeringEvent: eventRecievedAudit.MongoId(),
Result: []primitive.ObjectID{broadcastModel.MongoId()},
VendorName: models.YOUTUBE_VENDOR_NAME,
}
//save audit trail
err = mongo.SaveModels(broadcastModel, actionTaken)
if err != nil { if err != nil {
log.WithError(err).Error("Failed to schedule broadcast") log.WithError(err).Error("Failed to unmarshall body")
return err return err
} }
return nil return nil
} }
func scheduleNewBroadcastFromWebhook(c *gin.Context, plan *services.Plan, ytClient *youtube.Service, pcoClient *pco.PcoApiClient) (*youtube.LiveBroadcast, error) {
times, err := pcoClient.GetPlanTimes(plan.ServiceType.Id, plan.Id)
if err != nil {
return nil, err
}
return yt_helpers.InsertBroadcast(ytClient, plan.Title, times.StartsAt, yt_helpers.STATUS_PRIVATE)
}

View File

@ -47,7 +47,35 @@ func (db *DB) SaveModel(m Model) error {
} }
if res.MatchedCount == 0 && res.ModifiedCount == 0 && res.UpsertedCount == 0 { if res.MatchedCount == 0 && res.ModifiedCount == 0 && res.UpsertedCount == 0 {
return errors.New("Failed to update vendor account properly") return errors.New("Failed to save model properly")
}
return nil
}
func (db *DB) SaveModels(m ...Model) error {
conf := config.Config()
writeEntry := make([]mongo.WriteModel, len(m))
for index, model := range m {
entry := mongo.NewUpdateOneModel()
entry.SetFilter(bson.M{"_id": model.MongoId})
entry.SetUpsert(true)
entry.SetUpdate(bson.M{"$set": model})
model.UpdateObjectInfo()
writeEntry[index] = entry
}
opts := options.BulkWrite()
res, err := db.client.Database(conf.Mongo.EntDb).Collection(conf.Mongo.EntCol).BulkWrite(context.Background(), writeEntry, opts)
if err != nil {
return err
}
if res.MatchedCount == 0 && res.ModifiedCount == 0 && res.UpsertedCount == 0 {
return errors.New("Failed to save models properly")
} }
return nil return nil

View File

@ -15,8 +15,9 @@ const (
type EventRecieved struct { type EventRecieved struct {
*CommonFields `bson:"obj_info"` *CommonFields `bson:"obj_info"`
Id primitive.ObjectID `bson:"_id,omitempty"` Id primitive.ObjectID `bson:"_id,omitempty"`
UserId primitive.ObjectID `bson:"user_id,omitempty"` //what user is this associated too UserId primitive.ObjectID `bson:"user_id,omitempty"` //what user is this associated too
VendorName string `bson:"vendor_name,omitempty"` //Vendor name of who sent us the event VendorName string `bson:"vendor_name,omitempty"` //Vendor name of who sent us the event
Type string `bson:"type,omitempty"` //type of event
} }
func (obj *EventRecieved) MongoId() primitive.ObjectID { func (obj *EventRecieved) MongoId() primitive.ObjectID {