go.mercari.io/datastore@v1.8.2/testsuite/realworld/tbf/image_model.go (about) 1 package tbf 2 3 import ( 4 "context" 5 "fmt" 6 "time" 7 8 "go.mercari.io/datastore" 9 ) 10 11 var _ datastore.PropertyTranslator = imageID(0) 12 var _ datastore.KeyLoader = &Image{} 13 14 const kindImage = "Image" 15 16 type imageID int64 17 18 // Image provides information about circle image on GCS. 19 type Image struct { 20 ID imageID `json:"id" datastore:"-"` 21 OwnerCircleID CircleID `json:"ownerCircleID"` 22 GCSPath string `json:"gcsPath"` 23 CreatedAt unixTime `json:"createdAt"` 24 UpdatedAt unixTime `json:"updatedAt"` 25 } 26 27 func keyToImageID(key datastore.Key) (imageID, error) { 28 if key.Kind() != kindImage { 29 return 0, fmt.Errorf("unexpected kind: %s", key.Kind()) 30 } 31 32 return imageID(key.ID()), nil 33 } 34 35 // ToPropertyValue convert the value to the valid value as the property of datastore. 36 func (id imageID) ToPropertyValue(ctx context.Context) (interface{}, error) { 37 client := ctx.Value(contextClient{}).(datastore.Client) 38 key := client.IDKey(kindImage, int64(id), nil) 39 return key, nil 40 } 41 42 // FromPropertyValue convert property value to the valid value as the application. 43 func (id imageID) FromPropertyValue(ctx context.Context, p datastore.Property) (dst interface{}, err error) { 44 key, ok := p.Value.(datastore.Key) 45 if !ok { 46 return nil, datastore.ErrInvalidEntityType 47 } 48 return keyToImageID(key) 49 } 50 51 // ToKey convert the value to datastore.Key. 52 func (id imageID) ToKey(client datastore.Client) datastore.Key { 53 return client.IDKey(kindImage, int64(id), nil) 54 } 55 56 // Load loads all of the provided properties into struct. 57 func (image *Image) Load(ctx context.Context, ps []datastore.Property) error { 58 return datastore.LoadStruct(ctx, image, ps) 59 } 60 61 // Save saves all of struct fields to properties. 62 func (image *Image) Save(ctx context.Context) ([]datastore.Property, error) { 63 if time.Time(image.CreatedAt).IsZero() { 64 image.CreatedAt = unixTime(timeNow()) 65 } 66 image.UpdatedAt = unixTime(timeNow()) 67 68 return datastore.SaveStruct(ctx, image) 69 } 70 71 // LoadKey loads key data into struct. 72 func (image *Image) LoadKey(ctx context.Context, k datastore.Key) error { 73 image.ID = imageID(k.ID()) 74 return nil 75 }