// EntryCreate creates a new entry with the current user as author func EntryCreate(ctx context.Context, w http.ResponseWriter, req *http.Request) error { var db = ctx.Value(DBKey).(*sql.DB) var user = ctx.Value(UserKey).(*dash.User) var payload entrySaveRequest json.NewDecoder(req.Body).Decode(&payload) var entry = dash.Entry{ ID: payload.EntryID, Title: payload.Title, Type: payload.Type, Body: payload.Body, Public: payload.Public, Identifier: payload.Identifier, Anchor: payload.Anchor, Teams: payload.Teams, } if entry.Title == "" { return ErrMissingTitle } if entry.Body == "" { return ErrMissingBody } if entry.Anchor == "" { return ErrMissingAnchor } if err := upsertIdentifier(db, &entry.Identifier); err != nil { return err } if entry.Public && entry.Identifier.BannedFromPublic { return ErrPublicAnnotationForbidden } entry.IdentifierID = entry.Identifier.ID entry.BodyRendered = string(bluemonday.UGCPolicy().SanitizeBytes(blackfriday.MarkdownCommon([]byte(entry.Body)))) var res, err = db.Exec(`INSERT INTO entries (title, body, body_rendered, type, identifier_id, anchor, public, removed_from_public, score, user_id, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, entry.Title, entry.Body, entry.BodyRendered, entry.Type, entry.IdentifierID, entry.Anchor, entry.Public, entry.RemovedFromPublic, entry.Score, user.ID, time.Now(), time.Now()) if err != nil { return err } var insertID int64 insertID, err = res.LastInsertId() if err != nil { return err } entry.ID = int(insertID) var vote = dash.Vote{ EntryID: entry.ID, UserID: user.ID, Type: dash.VoteUp, } if _, err := db.Exec(`INSERT INTO votes (type, entry_id, user_id, created_at, updated_at) VALUES (?, ?, ?, ?, ?)`, vote.Type, vote.EntryID, vote.UserID, time.Now(), time.Now()); err != nil { return err } for _, t := range entry.Teams { var teamID int64 db.QueryRow(`SELECT id FROM teams WHERE name = ? LIMIT 1`, t).Scan(&teamID) db.Exec(`INSERT INTO entry_team (entry_id, team_id) VALUES (?, ?)`, entry.ID, teamID) } updateEntryVoteScore(db, &entry) json.NewEncoder(w).Encode(entrySaveResponse{ Entry: entry, Status: "success", }) return nil }