Skip to content

Commit

Permalink
Merge pull request #488 from photoview/feature-env-vars
Browse files Browse the repository at this point in the history
Add environment variables to disable optional features
  • Loading branch information
viktorstrate committed Aug 31, 2021
2 parents fca5a64 + 521b121 commit 4af3d11
Show file tree
Hide file tree
Showing 16 changed files with 235 additions and 51 deletions.
70 changes: 67 additions & 3 deletions api/graphql/generated.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

40 changes: 40 additions & 0 deletions api/graphql/resolvers/faces.go
Expand Up @@ -32,6 +32,10 @@ func (r imageFaceResolver) FaceGroup(ctx context.Context, obj *models.ImageFace)
return obj.FaceGroup, nil
}

if face_detection.GlobalFaceDetector == nil {
return nil, errors.New("face detector not initialized")
}

var faceGroup models.FaceGroup
if err := r.Database.Model(&obj).Association("FaceGroup").Find(&faceGroup); err != nil {
return nil, err
Expand All @@ -48,6 +52,10 @@ func (r faceGroupResolver) ImageFaces(ctx context.Context, obj *models.FaceGroup
return nil, errors.New("unauthorized")
}

if face_detection.GlobalFaceDetector == nil {
return nil, errors.New("face detector not initialized")
}

if err := user.FillAlbums(r.Database); err != nil {
return nil, err
}
Expand Down Expand Up @@ -78,6 +86,10 @@ func (r faceGroupResolver) ImageFaceCount(ctx context.Context, obj *models.FaceG
return -1, errors.New("unauthorized")
}

if face_detection.GlobalFaceDetector == nil {
return -1, errors.New("face detector not initialized")
}

if err := user.FillAlbums(r.Database); err != nil {
return -1, err
}
Expand Down Expand Up @@ -107,6 +119,10 @@ func (r *queryResolver) FaceGroup(ctx context.Context, id int) (*models.FaceGrou
return nil, errors.New("unauthorized")
}

if face_detection.GlobalFaceDetector == nil {
return nil, errors.New("face detector not initialized")
}

if err := user.FillAlbums(r.Database); err != nil {
return nil, err
}
Expand Down Expand Up @@ -135,6 +151,10 @@ func (r *queryResolver) MyFaceGroups(ctx context.Context, paginate *models.Pagin
return nil, errors.New("unauthorized")
}

if face_detection.GlobalFaceDetector == nil {
return nil, errors.New("face detector not initialized")
}

if err := user.FillAlbums(r.Database); err != nil {
return nil, err
}
Expand Down Expand Up @@ -168,6 +188,10 @@ func (r *mutationResolver) SetFaceGroupLabel(ctx context.Context, faceGroupID in
return nil, errors.New("unauthorized")
}

if face_detection.GlobalFaceDetector == nil {
return nil, errors.New("face detector not initialized")
}

faceGroup, err := userOwnedFaceGroup(r.Database, user, faceGroupID)
if err != nil {
return nil, err
Expand All @@ -186,6 +210,10 @@ func (r *mutationResolver) CombineFaceGroups(ctx context.Context, destinationFac
return nil, errors.New("unauthorized")
}

if face_detection.GlobalFaceDetector == nil {
return nil, errors.New("face detector not initialized")
}

destinationFaceGroup, err := userOwnedFaceGroup(r.Database, user, destinationFaceGroupID)
if err != nil {
return nil, err
Expand Down Expand Up @@ -223,6 +251,10 @@ func (r *mutationResolver) MoveImageFaces(ctx context.Context, imageFaceIDs []in
return nil, errors.New("unauthorized")
}

if face_detection.GlobalFaceDetector == nil {
return nil, errors.New("face detector not initialized")
}

userOwnedImageFaceIDs := make([]int, 0)
var destFaceGroup *models.FaceGroup

Expand Down Expand Up @@ -290,6 +322,10 @@ func (r *mutationResolver) RecognizeUnlabeledFaces(ctx context.Context) ([]*mode
return nil, errors.New("unauthorized")
}

if face_detection.GlobalFaceDetector == nil {
return nil, errors.New("face detector not initialized")
}

var updatedImageFaces []*models.ImageFace

transactionError := r.Database.Transaction(func(tx *gorm.DB) error {
Expand All @@ -312,6 +348,10 @@ func (r *mutationResolver) DetachImageFaces(ctx context.Context, imageFaceIDs []
return nil, errors.New("unauthorized")
}

if face_detection.GlobalFaceDetector == nil {
return nil, errors.New("face detector not initialized")
}

userOwnedImageFaceIDs := make([]int, 0)
newFaceGroup := models.FaceGroup{}

Expand Down
5 changes: 5 additions & 0 deletions api/graphql/resolvers/media.go
Expand Up @@ -8,6 +8,7 @@ import (
api "github.com/photoview/photoview/api/graphql"
"github.com/photoview/photoview/api/graphql/auth"
"github.com/photoview/photoview/api/graphql/models"
"github.com/photoview/photoview/api/scanner/face_detection"
"github.com/pkg/errors"
"gorm.io/gorm/clause"
)
Expand Down Expand Up @@ -228,6 +229,10 @@ func (r *mutationResolver) FavoriteMedia(ctx context.Context, mediaID int, favor
}

func (r *mediaResolver) Faces(ctx context.Context, media *models.Media) ([]*models.ImageFace, error) {
if face_detection.GlobalFaceDetector == nil {
return []*models.ImageFace{}, nil
}

if media.Faces != nil {
return media.Faces, nil
}
Expand Down
7 changes: 0 additions & 7 deletions api/graphql/resolvers/root.go
@@ -1,10 +1,7 @@
package resolvers

import (
"context"

api "github.com/photoview/photoview/api/graphql"
"github.com/photoview/photoview/api/graphql/models"
"gorm.io/gorm"
)

Expand Down Expand Up @@ -35,7 +32,3 @@ type queryResolver struct{ *Resolver }
type subscriptionResolver struct {
Resolver *Resolver
}

func (r *queryResolver) SiteInfo(ctx context.Context) (*models.SiteInfo, error) {
return models.GetSiteInfo(r.Database)
}
25 changes: 25 additions & 0 deletions api/graphql/resolvers/site_info.go
@@ -0,0 +1,25 @@
package resolvers

import (
"context"

api "github.com/photoview/photoview/api/graphql"
"github.com/photoview/photoview/api/graphql/models"
"github.com/photoview/photoview/api/scanner/face_detection"
)

func (r *queryResolver) SiteInfo(ctx context.Context) (*models.SiteInfo, error) {
return models.GetSiteInfo(r.Database)
}

type SiteInfoResolver struct {
*Resolver
}

func (r *Resolver) SiteInfo() api.SiteInfoResolver {
return &SiteInfoResolver{r}
}

func (SiteInfoResolver) FaceDetectionEnabled(ctx context.Context, obj *models.SiteInfo) (bool, error) {
return face_detection.GlobalFaceDetector != nil, nil
}
6 changes: 4 additions & 2 deletions api/graphql/resolvers/user.go
Expand Up @@ -343,8 +343,10 @@ func (r *mutationResolver) UserRemoveRootAlbum(ctx context.Context, userID int,
}

// Reload faces as media might have been deleted
if err := face_detection.GlobalFaceDetector.ReloadFacesFromDatabase(r.Database); err != nil {
return nil, err
if face_detection.GlobalFaceDetector == nil {
if err := face_detection.GlobalFaceDetector.ReloadFacesFromDatabase(r.Database); err != nil {
return nil, err
}
}
}

Expand Down
5 changes: 4 additions & 1 deletion api/graphql/schema.graphql
Expand Up @@ -68,7 +68,7 @@ type Query {
"Get media owned by the logged in user, returned in GeoJson format"
myMediaGeoJson: Any! @isAuthorized
"Get the mapbox api token, returns null if mapbox is not enabled"
mapboxToken: String
mapboxToken: String @isAuthorized

shareToken(credentials: ShareTokenCredentials!): ShareToken!
shareTokenValidatePassword(credentials: ShareTokenCredentials!): Boolean!
Expand Down Expand Up @@ -201,7 +201,10 @@ type ShareToken {

"General information about the site"
type SiteInfo {
"Whether or not the initial setup wizard should be shown"
initialSetup: Boolean!
"Whether or not face detection is enabled and working"
faceDetectionEnabled: Boolean!
"How often automatic scans should be initiated in seconds"
periodicScanInterval: Int! @isAdmin
"How many max concurrent scanner jobs that should run at once"
Expand Down
12 changes: 8 additions & 4 deletions api/scanner/cleanup_media.go
Expand Up @@ -53,8 +53,10 @@ func CleanupMedia(db *gorm.DB, albumId int, albumMedia []*models.Media) []error
}

// Reload faces after deleting media
if err := face_detection.GlobalFaceDetector.ReloadFacesFromDatabase(db); err != nil {
deleteErrors = append(deleteErrors, errors.Wrap(err, "reload faces from database"))
if face_detection.GlobalFaceDetector != nil {
if err := face_detection.GlobalFaceDetector.ReloadFacesFromDatabase(db); err != nil {
deleteErrors = append(deleteErrors, errors.Wrap(err, "reload faces from database"))
}
}
}

Expand Down Expand Up @@ -124,8 +126,10 @@ func deleteOldUserAlbums(db *gorm.DB, scannedAlbums []*models.Album, user *model
}

// Reload faces after deleting albums
if err := face_detection.GlobalFaceDetector.ReloadFacesFromDatabase(db); err != nil {
deleteErrors = append(deleteErrors, err)
if face_detection.GlobalFaceDetector == nil {
if err := face_detection.GlobalFaceDetector.ReloadFacesFromDatabase(db); err != nil {
deleteErrors = append(deleteErrors, err)
}
}

return deleteErrors
Expand Down
8 changes: 6 additions & 2 deletions api/scanner/face_detection/face_detector.go
Expand Up @@ -19,9 +19,13 @@ type FaceDetector struct {
imageFaceIDs []int
}

var GlobalFaceDetector FaceDetector
var GlobalFaceDetector *FaceDetector = nil

func InitializeFaceDetector(db *gorm.DB) error {
if utils.EnvDisableFaceRecognition.GetBool() {
log.Printf("Face detection disabled (%s=1)\n", utils.EnvDisableFaceRecognition.GetName())
return nil
}

log.Println("Initializing face detector")

Expand All @@ -35,7 +39,7 @@ func InitializeFaceDetector(db *gorm.DB) error {
return errors.Wrap(err, "get face detection samples from database")
}

GlobalFaceDetector = FaceDetector{
GlobalFaceDetector = &FaceDetector{
rec: rec,
faceDescriptors: faceDescriptors,
faceGroupIDs: faceGroupIDs,
Expand Down

0 comments on commit 4af3d11

Please sign in to comment.