2021-02-02 20:34:10 +00:00
|
|
|
package graph
|
|
|
|
|
|
|
|
// This file will be automatically regenerated based on the schema, any resolver implementations
|
|
|
|
// will be copied through when generating and any unknown code will be moved to the end.
|
|
|
|
|
|
|
|
import (
|
|
|
|
"context"
|
|
|
|
"fmt"
|
2021-02-04 10:16:13 +00:00
|
|
|
"net/http"
|
|
|
|
"strings"
|
2021-02-02 20:34:10 +00:00
|
|
|
|
2021-02-04 10:16:13 +00:00
|
|
|
"github.com/google/uuid"
|
2021-02-02 20:34:10 +00:00
|
|
|
"reichard.io/imagini/graph/generated"
|
|
|
|
"reichard.io/imagini/graph/model"
|
|
|
|
)
|
|
|
|
|
|
|
|
func (r *mutationResolver) CreateMediaItem(ctx context.Context, input model.NewMediaItem) (*model.MediaItem, error) {
|
|
|
|
panic(fmt.Errorf("not implemented"))
|
|
|
|
}
|
|
|
|
|
|
|
|
func (r *mutationResolver) CreateDevice(ctx context.Context, input model.NewDevice) (*model.Device, error) {
|
|
|
|
panic(fmt.Errorf("not implemented"))
|
|
|
|
}
|
|
|
|
|
|
|
|
func (r *mutationResolver) CreateAlbum(ctx context.Context, input model.NewAlbum) (*model.Album, error) {
|
|
|
|
panic(fmt.Errorf("not implemented"))
|
|
|
|
}
|
|
|
|
|
|
|
|
func (r *mutationResolver) CreateTag(ctx context.Context, input model.NewTag) (*model.Tag, error) {
|
|
|
|
panic(fmt.Errorf("not implemented"))
|
|
|
|
}
|
|
|
|
|
|
|
|
func (r *mutationResolver) CreateUser(ctx context.Context, input model.NewUser) (*model.User, error) {
|
2021-02-03 03:55:35 +00:00
|
|
|
user := &model.User{
|
|
|
|
Email: input.Email,
|
|
|
|
Username: input.Username,
|
|
|
|
FirstName: input.FirstName,
|
|
|
|
LastName: input.LastName,
|
|
|
|
Role: input.Role,
|
|
|
|
AuthType: input.AuthType,
|
|
|
|
Password: input.Password,
|
|
|
|
}
|
|
|
|
|
|
|
|
err := r.DB.CreateUser(user)
|
|
|
|
if err != nil {
|
2021-02-04 10:16:13 +00:00
|
|
|
return nil, err
|
2021-02-03 03:55:35 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return user, nil
|
|
|
|
}
|
|
|
|
|
2021-02-04 10:16:13 +00:00
|
|
|
func (r *queryResolver) Login(ctx context.Context, user string, password string, deviceID *string) (*model.AuthResponse, error) {
|
|
|
|
// Set Cookie From Context
|
2021-02-03 03:55:35 +00:00
|
|
|
authContext := ctx.Value("auth").(*model.AuthContext)
|
2021-02-04 10:16:13 +00:00
|
|
|
resp := authContext.AuthResponse
|
|
|
|
req := authContext.AuthRequest
|
|
|
|
|
|
|
|
// Do Login
|
|
|
|
foundUser, success := r.Auth.AuthenticateUser(user, password)
|
|
|
|
if !success {
|
|
|
|
return &model.AuthResponse{Result: model.AuthResultFailure}, nil
|
|
|
|
}
|
2021-02-03 03:55:35 +00:00
|
|
|
|
2021-02-04 10:16:13 +00:00
|
|
|
// Upsert Device
|
|
|
|
foundDevice := model.Device{}
|
|
|
|
if deviceID != nil {
|
|
|
|
parsedDeviceID, err := uuid.Parse(*deviceID)
|
|
|
|
if err != nil {
|
|
|
|
return &model.AuthResponse{Result: model.AuthResultFailure}, nil
|
|
|
|
}
|
|
|
|
foundDevice.ID = parsedDeviceID.String()
|
|
|
|
count, err := r.DB.Device(&foundDevice)
|
|
|
|
if count != 1 || err != nil {
|
|
|
|
return &model.AuthResponse{Result: model.AuthResultFailure}, nil
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
foundDevice.Type = deriveDeviceType(req)
|
2021-02-04 20:31:07 +00:00
|
|
|
foundDevice.UserID = foundUser.ID
|
|
|
|
// TODO: foundDevice.User = &foundUser
|
2021-02-04 10:16:13 +00:00
|
|
|
err := r.DB.CreateDevice(&foundDevice)
|
|
|
|
if err != nil {
|
|
|
|
return &model.AuthResponse{Result: model.AuthResultFailure}, nil
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Create Tokens
|
|
|
|
accessToken, err := r.Auth.CreateJWTAccessToken(foundUser, foundDevice)
|
|
|
|
if err != nil {
|
|
|
|
return &model.AuthResponse{Result: model.AuthResultFailure}, nil
|
|
|
|
}
|
|
|
|
refreshToken, err := r.Auth.CreateJWTRefreshToken(foundUser, foundDevice)
|
|
|
|
if err != nil {
|
|
|
|
return &model.AuthResponse{Result: model.AuthResultFailure}, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
// Set appropriate cookies
|
|
|
|
accessCookie := http.Cookie{Name: "AccessToken", Value: accessToken, Path: "/", HttpOnly: true}
|
|
|
|
refreshCookie := http.Cookie{Name: "RefreshToken", Value: refreshToken, Path: "/", HttpOnly: true}
|
|
|
|
http.SetCookie(*resp, &accessCookie)
|
|
|
|
http.SetCookie(*resp, &refreshCookie)
|
|
|
|
|
2021-02-04 20:31:07 +00:00
|
|
|
// TODO: Prob bandaid
|
|
|
|
foundDevice.User = &foundUser
|
2021-02-04 10:16:13 +00:00
|
|
|
return &model.AuthResponse{Result: model.AuthResultSuccess, Device: &foundDevice}, nil
|
2021-02-03 03:55:35 +00:00
|
|
|
}
|
|
|
|
|
2021-02-04 10:16:13 +00:00
|
|
|
func (r *queryResolver) Logout(ctx context.Context) (*model.AuthResponse, error) {
|
2021-02-03 03:55:35 +00:00
|
|
|
// panic(fmt.Errorf("not implemented"))
|
2021-02-04 10:16:13 +00:00
|
|
|
return &model.AuthResponse{Result: model.AuthResultSuccess}, nil
|
2021-02-02 20:34:10 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
func (r *queryResolver) MediaItem(ctx context.Context, id string) (*model.MediaItem, error) {
|
|
|
|
panic(fmt.Errorf("not implemented"))
|
|
|
|
}
|
|
|
|
|
|
|
|
func (r *queryResolver) Device(ctx context.Context, id string) (*model.Device, error) {
|
|
|
|
panic(fmt.Errorf("not implemented"))
|
|
|
|
}
|
|
|
|
|
|
|
|
func (r *queryResolver) Album(ctx context.Context, id string) (*model.Album, error) {
|
|
|
|
panic(fmt.Errorf("not implemented"))
|
|
|
|
}
|
|
|
|
|
2021-02-03 03:55:35 +00:00
|
|
|
func (r *queryResolver) User(ctx context.Context, id string) (*model.User, error) {
|
|
|
|
panic(fmt.Errorf("not implemented"))
|
|
|
|
}
|
|
|
|
|
2021-02-02 20:34:10 +00:00
|
|
|
func (r *queryResolver) Tag(ctx context.Context, id string) (*model.Tag, error) {
|
|
|
|
panic(fmt.Errorf("not implemented"))
|
|
|
|
}
|
|
|
|
|
2021-02-03 03:55:35 +00:00
|
|
|
func (r *queryResolver) Me(ctx context.Context) (*model.User, error) {
|
2021-02-02 20:34:10 +00:00
|
|
|
panic(fmt.Errorf("not implemented"))
|
|
|
|
}
|
|
|
|
|
|
|
|
func (r *queryResolver) MediaItems(ctx context.Context, filter *model.MediaItemFilter, count *int, page *int) (*model.MediaItemResponse, error) {
|
|
|
|
panic(fmt.Errorf("not implemented"))
|
|
|
|
}
|
|
|
|
|
|
|
|
func (r *queryResolver) Devices(ctx context.Context, filter *model.DeviceFilter, count *int, page *int) (*model.DeviceResponse, error) {
|
|
|
|
panic(fmt.Errorf("not implemented"))
|
|
|
|
}
|
|
|
|
|
|
|
|
func (r *queryResolver) Albums(ctx context.Context, filter *model.AlbumFilter, count *int, page *int) (*model.AlbumResponse, error) {
|
|
|
|
panic(fmt.Errorf("not implemented"))
|
|
|
|
}
|
|
|
|
|
|
|
|
func (r *queryResolver) Tags(ctx context.Context, filter *model.TagFilter, count *int, page *int) (*model.TagResponse, error) {
|
|
|
|
panic(fmt.Errorf("not implemented"))
|
|
|
|
}
|
|
|
|
|
|
|
|
func (r *queryResolver) Users(ctx context.Context, filter *model.UserFilter, count *int, page *int) (*model.UserResponse, error) {
|
2021-02-03 03:55:35 +00:00
|
|
|
resp, totalCount, err := r.DB.Users()
|
|
|
|
if err != nil {
|
|
|
|
panic(fmt.Errorf("DB Error"))
|
|
|
|
}
|
|
|
|
return &model.UserResponse{
|
|
|
|
Data: resp,
|
|
|
|
PageInfo: &model.PageInfo{
|
|
|
|
Count: int(totalCount),
|
|
|
|
Page: 0,
|
|
|
|
Total: int(totalCount),
|
|
|
|
},
|
|
|
|
}, nil
|
2021-02-02 20:34:10 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// Mutation returns generated.MutationResolver implementation.
|
|
|
|
func (r *Resolver) Mutation() generated.MutationResolver { return &mutationResolver{r} }
|
|
|
|
|
|
|
|
// Query returns generated.QueryResolver implementation.
|
|
|
|
func (r *Resolver) Query() generated.QueryResolver { return &queryResolver{r} }
|
|
|
|
|
|
|
|
type mutationResolver struct{ *Resolver }
|
|
|
|
type queryResolver struct{ *Resolver }
|
2021-02-04 10:16:13 +00:00
|
|
|
|
|
|
|
// !!! WARNING !!!
|
|
|
|
// The code below was going to be deleted when updating resolvers. It has been copied here so you have
|
|
|
|
// one last chance to move it out of harms way if you want. There are two reasons this happens:
|
|
|
|
// - When renaming or deleting a resolver the old code will be put in here. You can safely delete
|
|
|
|
// it when you're done.
|
|
|
|
// - You have helper methods in this file. Move them out to keep these resolver files clean.
|
|
|
|
func deriveDeviceType(r *http.Request) model.DeviceType {
|
|
|
|
userAgent := strings.ToLower(r.Header.Get("User-Agent"))
|
|
|
|
if strings.Contains(userAgent, "ios-imagini") {
|
|
|
|
return model.DeviceTypeIOs
|
|
|
|
} else if strings.Contains(userAgent, "android-imagini") {
|
|
|
|
return model.DeviceTypeAndroid
|
|
|
|
} else if strings.Contains(userAgent, "chrome") {
|
|
|
|
return model.DeviceTypeChrome
|
|
|
|
} else if strings.Contains(userAgent, "firefox") {
|
|
|
|
return model.DeviceTypeFirefox
|
|
|
|
} else if strings.Contains(userAgent, "msie") {
|
|
|
|
return model.DeviceTypeInternetExplorer
|
|
|
|
} else if strings.Contains(userAgent, "edge") {
|
|
|
|
return model.DeviceTypeEdge
|
|
|
|
} else if strings.Contains(userAgent, "safari") {
|
|
|
|
return model.DeviceTypeSafari
|
|
|
|
}
|
|
|
|
return model.DeviceTypeUnknown
|
|
|
|
}
|