generationtux/brizo

View on GitHub
auth/user.go

Summary

Maintainability
A
0 mins
Test Coverage
package auth

import (
    "time"

    "github.com/dgrijalva/jwt-go"
    "github.com/generationtux/brizo/database"
    "github.com/jinzhu/gorm"
)

// User represents a Brizo user
type User struct {
    database.Model
    Username       string `gorm:"not null;unique_index" json:"username"`
    Name           string `json:"name"`
    Email          string `json:"email"`
    GithubUsername string `json:"github_username"`
    GithubToken    string `json:"github_token"`
}

// CreateUser creates a Brizo specific user without forcing any validation on
// the input
func CreateUser(db *gorm.DB, user *User) (bool, error) {
    result := db.Create(&user)

    return result.RowsAffected == 1, result.Error
}

// UpdateUser updates an existing Brizo user based on his/her username
func UpdateUser(db *gorm.DB, user *User) (bool, error) {
    result := db.Model(user).Where("username = ?", user.Username).UpdateColumns(user)

    return result.RowsAffected == 1, result.Error
}

// CreateJWTToken creates a JWT token for the provided user
func CreateJWTToken(user User) (string, error) {
    claims := jwt.MapClaims{
        "exp":      time.Now().Add(time.Hour * 24).UTC().Unix(),
        "iat":      time.Now().UTC().Unix(),
        "iss":      "brizo",
        "sub":      user.Username,
        "name":     user.Name,
        "email":    user.Email,
        "username": user.Username,
    }

    token := jwt.NewWithClaims(jwt.SigningMethodHS512, claims)
    secret := []byte(jwtSecret())
    tokenString, err := token.SignedString(secret)

    return tokenString, err
}

// GetInvitedUsers will provide a slice of all of the Users who have been
// invited to Brizo, but have yet to authenticate with Github.
func GetInvitedUsers(db *gorm.DB) ([]User, error) {
    var invitees []User
    result := db.Where("username is not null").Where("github_token = \"\"").Find(&invitees)

    return invitees, result.Error
}

// DeleteInvitedUser will delete an existing invitee based on his/her github
// username
func DeleteInvitedUser(db *gorm.DB, id string) (bool, error) {
    var user User
    result := db.Model(user).Where("id = ?", id).Where("github_token = \"\"").First(&user)

    if result.RowsAffected == 1 {
        result = db.Delete(&user)
    }

    return result.RowsAffected == 1, result.Error
}