Documentation ¶
Overview ¶
Example (OrderCacheItems) ¶
items := map[string]fileCacheItem{ "one": { localPath: "path/one.bin", fileSize: 10 * 1024 * 1024, timestampUnixSec: 1234567891, }, "three": { localPath: "path/three.bin", fileSize: 30 * 1024 * 1024, timestampUnixSec: 1234567893, }, "two": { localPath: "path/two.bin", fileSize: 20 * 1024 * 1024, timestampUnixSec: 1234567892, }, "four": { localPath: "path/four.bin", fileSize: 40 * 1024 * 1024, timestampUnixSec: 1234567894, }, } byAge, totalSize := orderCacheItems(items) fmt.Printf("Total size: %v\n", totalSize) for _, i := range byAge { fmt.Printf("path: %v, ts: %v, size: %v\n", i.localPath, i.timestampUnixSec, i.fileSize) }
Output: Total size: 104857600 path: path/four.bin, ts: 1234567894, size: 41943040 path: path/three.bin, ts: 1234567893, size: 31457280 path: path/two.bin, ts: 1234567892, size: 20971520 path: path/one.bin, ts: 1234567891, size: 10485760
Example (UpdateScanImageDataTypes) ¶
package main import ( "context" "fmt" "github.com/pixlise/core/v4/api/dbCollections" "github.com/pixlise/core/v4/core/logger" "github.com/pixlise/core/v4/core/scan" "github.com/pixlise/core/v4/core/wstestlib" protos "github.com/pixlise/core/v4/generated-protos" "go.mongodb.org/mongo-driver/mongo/options" ) func main() { db := wstestlib.GetDB() ctx := context.TODO() // Prep data db.Collection(dbCollections.ScansName).Drop(ctx) db.Collection(dbCollections.ImagesName).Drop(ctx) l := &logger.StdOutLoggerForTest{} fmt.Printf("Non-existant: %v\n", UpdateScanImageDataTypes("non-existant", db, l)) // Add scan scanItem := &protos.ScanItem{ Id: "052822532", Title: "Beaujeu", Description: "", DataTypes: []*protos.ScanItem_ScanTypeCount{ { DataType: protos.ScanDataType_SD_XRF, Count: 234, }, }, Instrument: 1, InstrumentConfig: "PIXL", TimestampUnixSec: 1707463677, Meta: map[string]string{ "Site": "", "RTT": "052822532", "SCLK": "679215716", "Sol": "0138", "DriveId": "1812", "TargetId": "?", "Target": "", "SiteId": "5", }, ContentCounts: map[string]int32{ "MaxSpectra": 2, "PseudoIntensities": 225, "NormalSpectra": 450, "DwellSpectra": 0, "BulkSpectra": 2, }, } scanInsert, err := db.Collection(dbCollections.ScansName).InsertOne(ctx, scanItem, options.InsertOne()) fmt.Printf("Scan insert err: %v, scanInsert: %+v\n", err, scanInsert) fmt.Printf("Zero values: %v\n", UpdateScanImageDataTypes(scanItem.Id, db, l)) scanRead, err := scan.ReadScanItem(scanItem.Id, db) fmt.Printf("SavedScanCounts: %v Err: %v\n", scanTypeToString(scanRead.DataTypes), err) // Insert image img := &protos.ScanImage{ ImagePath: "052822532/PCW_0138_0679216324_000RCM_N00518120528225320077075J03.png", Source: 1, Width: 752, Height: 580, FileSize: 230396, Purpose: protos.ScanImagePurpose_SIP_VIEWING, AssociatedScanIds: []string{"052822532"}, OriginScanId: "052822532", } imgInsert, err := db.Collection(dbCollections.ImagesName).InsertOne(ctx, img, options.InsertOne()) fmt.Printf("Image insert err: %v, imgInsert: %+v\n", err, imgInsert) fmt.Printf("One image: %v\n", UpdateScanImageDataTypes(scanItem.Id, db, l)) scanRead, err = scan.ReadScanItem(scanItem.Id, db) fmt.Printf("SavedScanCounts: %v Err: %v\n", scanTypeToString(scanRead.DataTypes), err) // Insert RGBU images rgbu := &protos.ScanImage{ ImagePath: "052822532/PCCR0138_0679289188_000VIS_N005000005282253200770LUD01.tif", Source: 2, Width: 752, Height: 580, FileSize: 18173394, Purpose: protos.ScanImagePurpose_SIP_MULTICHANNEL, AssociatedScanIds: []string{"052822532"}, OriginScanId: "052822532", } rgbuInsert, err := db.Collection(dbCollections.ImagesName).InsertOne(ctx, rgbu, options.InsertOne()) fmt.Printf("RGBU Image insert err: %v, rgbuInsert: %+v\n", err, rgbuInsert) fmt.Printf("Two image: %v\n", UpdateScanImageDataTypes(scanItem.Id, db, l)) scanRead, err = scan.ReadScanItem(scanItem.Id, db) fmt.Printf("SavedScanCounts: %v Err: %v\n", scanTypeToString(scanRead.DataTypes), err) } func scanTypeToString(dt []*protos.ScanItem_ScanTypeCount) string { result := "" for _, i := range dt { result += fmt.Sprintf(" %v %v=%v", result, i.DataType, i.Count) } return result }
Output: Non-existant: mongo: no documents in result Scan insert err: <nil>, scanInsert: &{InsertedID:052822532} Zero values: <nil> SavedScanCounts: SD_XRF=234 Err: <nil> Image insert err: <nil>, imgInsert: &{InsertedID:052822532/PCW_0138_0679216324_000RCM_N00518120528225320077075J03.png} One image: <nil> SavedScanCounts: SD_XRF=234 SD_XRF=234 SD_IMAGE=1 Err: <nil> RGBU Image insert err: <nil>, rgbuInsert: &{InsertedID:052822532/PCCR0138_0679289188_000VIS_N005000005282253200770LUD01.tif} Two image: <nil> SavedScanCounts: SD_XRF=234 SD_XRF=234 SD_IMAGE=1 SD_XRF=234 SD_XRF=234 SD_IMAGE=1 SD_RGBU=1 Err: <nil>
Index ¶
- Constants
- Variables
- func CheckConnectToken(token string, svcs *services.APIServices) (jwtparser.JWTUserInfo, error)
- func CheckFieldLength[T any](field []T, fieldName string, minLength int, maxLength int) error
- func CheckObjectAccess(requireEdit bool, objectId string, objectType protos.ObjectType, ...) (*protos.OwnershipItem, error)
- func CheckObjectAccessForUser(requireEdit bool, objectId string, objectType protos.ObjectType, userId string, ...) (*protos.OwnershipItem, error)
- func CheckStringField(field *string, fieldName string, minLength int, maxLength int) error
- func ClearCacheForScanId(scanId string, ts timestamper.ITimeStamper, l logger.ILogger)
- func ClearLocalMongoArchive() error
- func CreateConnectToken(svcs *services.APIServices, user jwtparser.JWTUserInfo) string
- func DeleteUserObject[T any](objectId string, objectType protos.ObjectType, collectionName string, ...) (*T, error)
- func DownloadArchive(svcs *services.APIServices) (string, error)
- func FetchOwnershipSummary(ownership *protos.OwnershipItem, sessionUser SessionUser, db *mongo.Database, ...) *protos.OwnershipSummary
- func FindUserIdsFor(objectId string, mongoDB *mongo.Database) ([]string, error)
- func GenerateIJs(imageName string, scanId string, instrument protos.ScanInstrument, ...) (*protos.ImageLocations, error)
- func GetCachedUserGroupMembership(userId string) ([]string, bool)
- func GetCachedUserGroupViewership(userId string) ([]string, bool)
- func GetDBUser(userId string, db *mongo.Database) (*protos.UserDBItem, error)
- func GetUserIdsForGroup(groupIds []string, mongoDB *mongo.Database) ([]string, error)
- func GetUserObjectById[T any](forEditing bool, objectId string, objectType protos.ObjectType, ...) (*T, *protos.OwnershipItem, error)
- func HasPermission(userPermissions map[string]bool, toCheck protos.Permission) bool
- func IsValidConnectToken(token string) bool
- func ListAccessibleIDs(requireEdit bool, objectType protos.ObjectType, svcs *services.APIServices, ...) (map[string]*protos.OwnershipItem, error)
- func ListGroupAccessibleIDs(requireEdit bool, objectType protos.ObjectType, groupID string, ...) (map[string]*protos.OwnershipItem, error)
- func MakeFilter(searchParams *protos.SearchParams, requireEdit bool, ...) (bson.M, map[string]*protos.OwnershipItem, error)
- func MakeFullOwnerSummary(ownership *protos.OwnershipItem, sessionUser SessionUser, db *mongo.Database, ...) *protos.OwnershipSummary
- func MakeMongoDumpInstance(mongoDetails mongoDBConnection.MongoConnectionDetails, logger logger.ILogger, ...) (*mongodump.MongoDump, error)
- func MakeMongoRestoreInstance(mongoDetails mongoDBConnection.MongoConnectionDetails, logger logger.ILogger, ...) (*mongorestore.MongoRestore, error)
- func MakeOwnerForWrite(objectId string, objectType protos.ObjectType, creatorUserId string, ...) *protos.OwnershipItem
- func MakeOwnerSummary(ownership *protos.OwnershipItem, sessionUser SessionUser, db *mongo.Database, ...) *protos.OwnershipSummary
- func NotifyUserInfoChange(userId string)
- func ReadDatasetFile(scanId string, svcs *services.APIServices) (*protos.Experiment, error)
- func ReadDiffractionFile(scanId string, svcs *services.APIServices) (*protos.Diffraction, error)
- func ReadQuantificationFile(quantId string, quantPath string, svcs *services.APIServices) (*protos.Quantification, error)
- func ResetLocalMongoBackupDir() error
- func RestoreImages(svcs *services.APIServices) error
- func RestoreQuants(svcs *services.APIServices) error
- func RestoreScans(svcs *services.APIServices) error
- func SendForSession(s *melody.Session, wsmsg *protos.WSMessage)
- func SyncImages(svcs *services.APIServices) error
- func SyncQuants(svcs *services.APIServices) error
- func SyncScans(svcs *services.APIServices) error
- func UpdateScanImageDataTypes(scanId string, db *mongo.Database, logger logger.ILogger) error
- func UploadArchive(svcs *services.APIServices) error
- type ConnectToken
- type HandlerContext
- type LogWriter
- type SessionUser
- type UserImpersonationItem
Examples ¶
Constants ¶
const Auth0UserIdFieldMaxLength = 32
const DescriptionFieldMaxLength = 1024 * 5
const IdFieldMaxLength = 32
const SourceCodeMaxLength = 1024 * 1024 * 5 // Trying to be very generous here, but maybe this is not enough?
const TagListMaxLength = 100
Variables ¶
var MaxFileCacheAgeSec = int64(60 * 5)
var MaxFileCacheSizeBytes = uint64(200 * 1024 * 1024)
Functions ¶
func CheckConnectToken ¶ added in v4.32.3
func CheckConnectToken(token string, svcs *services.APIServices) (jwtparser.JWTUserInfo, error)
func CheckFieldLength ¶
func CheckObjectAccess ¶
func CheckObjectAccess(requireEdit bool, objectId string, objectType protos.ObjectType, hctx HandlerContext) (*protos.OwnershipItem, error)
Checks object access - if requireEdit is true, it checks for edit access otherwise just checks for view access. Returns an error if it failed to determine or if access is not granted, returns error formed with MakeUnauthorisedError
func CheckStringField ¶
func ClearCacheForScanId ¶ added in v4.20.6
func ClearCacheForScanId(scanId string, ts timestamper.ITimeStamper, l logger.ILogger)
func ClearLocalMongoArchive ¶ added in v4.32.3
func ClearLocalMongoArchive() error
func CreateConnectToken ¶ added in v4.32.3
func CreateConnectToken(svcs *services.APIServices, user jwtparser.JWTUserInfo) string
func DeleteUserObject ¶
func DeleteUserObject[T any](objectId string, objectType protos.ObjectType, collectionName string, hctx HandlerContext) (*T, error)
func DownloadArchive ¶ added in v4.32.3
func DownloadArchive(svcs *services.APIServices) (string, error)
func FetchOwnershipSummary ¶ added in v4.3.12
func FetchOwnershipSummary(ownership *protos.OwnershipItem, sessionUser SessionUser, db *mongo.Database, ts timestamper.ITimeStamper, fullDetails bool) *protos.OwnershipSummary
func FindUserIdsFor ¶
func GenerateIJs ¶ added in v4.24.3
func GenerateIJs(imageName string, scanId string, instrument protos.ScanInstrument, svcs *services.APIServices) (*protos.ImageLocations, error)
func GetCachedUserGroupViewership ¶ added in v4.8.1
func GetUserIdsForGroup ¶
func GetUserObjectById ¶
func GetUserObjectById[T any](forEditing bool, objectId string, objectType protos.ObjectType, collectionName string, hctx HandlerContext) (*T, *protos.OwnershipItem, error)
func HasPermission ¶
func HasPermission(userPermissions map[string]bool, toCheck protos.Permission) bool
func IsValidConnectToken ¶ added in v4.32.4
func ListAccessibleIDs ¶
func ListAccessibleIDs(requireEdit bool, objectType protos.ObjectType, svcs *services.APIServices, requestorSession SessionUser) (map[string]*protos.OwnershipItem, error)
Gets all object IDs which the user has access to - if requireEdit is true, it checks for edit access otherwise just checks for view access Returns a map of object id->creator user id
func ListGroupAccessibleIDs ¶
func ListGroupAccessibleIDs(requireEdit bool, objectType protos.ObjectType, groupID string, mongoDB *mongo.Database) (map[string]*protos.OwnershipItem, error)
func MakeFilter ¶
func MakeFilter( searchParams *protos.SearchParams, requireEdit bool, objectType protos.ObjectType, hctx HandlerContext) (bson.M, map[string]*protos.OwnershipItem, error)
func MakeFullOwnerSummary ¶ added in v4.3.12
func MakeFullOwnerSummary(ownership *protos.OwnershipItem, sessionUser SessionUser, db *mongo.Database, ts timestamper.ITimeStamper) *protos.OwnershipSummary
func MakeMongoDumpInstance ¶ added in v4.32.3
func MakeMongoDumpInstance(mongoDetails mongoDBConnection.MongoConnectionDetails, logger logger.ILogger, dbName string) (*mongodump.MongoDump, error)
func MakeMongoRestoreInstance ¶ added in v4.32.3
func MakeMongoRestoreInstance(mongoDetails mongoDBConnection.MongoConnectionDetails, logger logger.ILogger, restoreToDBName string, restoreFromDBName string) (*mongorestore.MongoRestore, error)
func MakeOwnerForWrite ¶
func MakeOwnerForWrite(objectId string, objectType protos.ObjectType, creatorUserId string, createTimeUnixSec int64) *protos.OwnershipItem
func MakeOwnerSummary ¶
func MakeOwnerSummary(ownership *protos.OwnershipItem, sessionUser SessionUser, db *mongo.Database, ts timestamper.ITimeStamper) *protos.OwnershipSummary
func NotifyUserInfoChange ¶
func NotifyUserInfoChange(userId string)
func ReadDatasetFile ¶
func ReadDatasetFile(scanId string, svcs *services.APIServices) (*protos.Experiment, error)
func ReadDiffractionFile ¶
func ReadDiffractionFile(scanId string, svcs *services.APIServices) (*protos.Diffraction, error)
func ReadQuantificationFile ¶
func ReadQuantificationFile(quantId string, quantPath string, svcs *services.APIServices) (*protos.Quantification, error)
func ResetLocalMongoBackupDir ¶ added in v4.32.3
func ResetLocalMongoBackupDir() error
func RestoreImages ¶ added in v4.32.3
func RestoreImages(svcs *services.APIServices) error
func RestoreQuants ¶ added in v4.32.3
func RestoreQuants(svcs *services.APIServices) error
func RestoreScans ¶ added in v4.32.3
func RestoreScans(svcs *services.APIServices) error
func SyncImages ¶ added in v4.32.3
func SyncImages(svcs *services.APIServices) error
func SyncQuants ¶ added in v4.32.3
func SyncQuants(svcs *services.APIServices) error
func SyncScans ¶ added in v4.32.3
func SyncScans(svcs *services.APIServices) error
func UpdateScanImageDataTypes ¶ added in v4.20.1
func UploadArchive ¶ added in v4.32.3
func UploadArchive(svcs *services.APIServices) error
Types ¶
type ConnectToken ¶ added in v4.32.3
type ConnectToken struct { Id string `bson:"_id"` ExpiryUnixSec int64 User jwtparser.JWTUserInfo Permissions []string }
type HandlerContext ¶
type HandlerContext struct { Session *melody.Session SessUser SessionUser Melody *melody.Melody Svcs *services.APIServices }
type LogWriter ¶ added in v4.33.5
type LogWriter struct {
// contains filtered or unexported fields
}
type SessionUser ¶
type SessionUser struct { SessionId string User *protos.UserInfo Permissions map[string]bool MemberOfGroupIds []string ViewerOfGroupIds []string NotificationSubscribed bool }
func CreateDBUser ¶
func CreateDBUser(sessionId string, jwtUser jwtparser.JWTUserInfo, db *mongo.Database, defaultGroupIdToJoin string, log logger.ILogger) (*SessionUser, error)
If we have a successful login and the user is not in our DB, we write a default record for them, so if they change their details we have a spot to save it already NOTE: This is (at time of writing) the only way to add a user to the DB
func GetSessionUser ¶
func GetSessionUser(s *melody.Session) (SessionUser, error)
func MakeSessionUser ¶
func MakeSessionUser(sessionId string, userId string, permissions map[string]bool, db *mongo.Database) (*SessionUser, error)
JWT user has the user ID and permissions that we get from Auth0. The rest is handled within PIXLISE, so lets read our DB to see if this user exists and get their user name, email, icon, etc