internal/events/create.go

Summary

Maintainability
A
0 mins
Test Coverage
package events

import (
    "database/sql"
    "errors"
    "fmt"
    "github.com/julienschmidt/httprouter"
    "io"
    "mynsb-api/internal/db"
    "mynsb-api/internal/filesint"
    "mynsb-api/internal/quickerrors"
    "mynsb-api/internal/sessions"
    "mynsb-api/internal/util"
    "net/http"
)



// EVENT CREATION FUNCTIONS


// create takes an event and a database and inserts the event into the database
func (event Event) create(db *sql.DB) error {

    // Determine if the event exists in our DB or not
    numEvents, _ := util.NumResults(db, "SELECT * FROM events WHERE event_name = $1 AND event_organiser = $2", event.Name, event.Organiser)
    if numEvents != 0 {
        return errors.New("event already exists")
    }

    // create the image associated with the requested event
    eventPictureLoc := fmt.Sprintf("/events/%s/%s", event.Organiser, event.Name)
    file, err := filesint.CreateFile("assets", eventPictureLoc, event.PictureHeader.Filename)
    defer file.Close()
    if err != nil {
        return err
    }

    // Copy the picture into the file pointer
    io.Copy(file, event.Picture)
    event.PictureURL = fmt.Sprintf("%s/api/v1/assets%s", util.APIURL, eventPictureLoc)

    // Insert the event into the database
    db.Exec("INSERT INTO events(event_name, event_start, event_end, event_location, event_organiser, "+
        "event_short_desc, "+"event_long_desc, event_picture_url) "+
            "VALUES ($1, $2, $3, $4, $5 ,$6, $7, $8)", event.Name, event.Start, event.End, event.Location,
            event.Organiser, event.ShortDesc, event.LongDesc, event.PictureURL)

    return nil

}












// UTILITY FUNCTIONS

// parseIncomingEvent takes a http request and parses the incoming event that is being sent by the user
func parseIncomingEvent(r *http.Request, organiser string) (Event, error) {

    r.ParseMultipartForm(1000000)

    eventName := r.FormValue("Name")
    eventEndRAW := r.FormValue("End")
    eventStartRAW := r.FormValue("Start")
    eventLocation := r.FormValue("Location")
    eventOrganiser := organiser
    eventShortDesc := r.FormValue("Short_Desc")
    eventLongDesc := r.FormValue("Long_Desc")
    // Check that the variables are actually set
    if !(util.IsSet(eventName, eventEndRAW, eventLocation, eventOrganiser, eventLongDesc, eventStartRAW, eventShortDesc)) {
        return Event{}, errors.New("user is mising paramaters")
    }



    // Attain the attached image with the request
    f, h, err := r.FormFile("Caption_Image")
    if err != nil {
        return Event{}, err
    }


    // Parse the event datetimes
    eventStart, parseErrorOne := util.ParseDateTime(eventStartRAW)
    eventEnd, parseErrorTwo := util.ParseDateTime(eventEndRAW)
    if parseErrorTwo != nil || parseErrorOne != nil {
        return Event{}, errors.New("could not parse date")
    }


    return Event{
        Name:          eventName,
        Location:      eventLocation,
        Organiser:     eventOrganiser,
        ShortDesc:     eventShortDesc,
        LongDesc:      eventLongDesc,
        Picture:       f,
        PictureHeader: h,
        Start:           eventStart,
        End:           eventEnd,
    }, nil
}












// HTTP HANDLERS

// EventCreationHandler is a http handler that handles creation requests from users
func EventCreationHandler(w http.ResponseWriter, r *http.Request, _ httprouter.Params) {

    db.Conn("admin")
    defer db.DB.Close()

    // Check user privledges
    allowed, currUser := sessions.IsUserAllowed(r, w, "admin")
    if !allowed {
        quickerrors.NotEnoughPrivileges(w)
        return
    }


    event, err := parseIncomingEvent(r, currUser.Name)
    if err != nil {
        quickerrors.MalformedRequest(w, "Missing parameters, user was invalid or the dates you provided were invalid")
        return
    }

    err = event.create(db.DB)
    if err != nil {
        quickerrors.MalformedRequest(w, "Event already exists")
        return
    }

    quickerrors.OK(w)
}