go.mercari.io/datastore@v1.8.2/testsuite/realworld/tbf/circle_model.go (about) 1 package tbf 2 3 import ( 4 "context" 5 "errors" 6 "fmt" 7 "time" 8 9 "go.mercari.io/datastore" 10 ) 11 12 var _ datastore.PropertyTranslator = CircleID(0) 13 var _ datastore.KeyLoader = &Circle{} 14 15 const kindCircle = "Circle" 16 17 // CircleID means ID of Circle kind. 18 type CircleID int64 19 20 // Circle represents information on participating organizations. 21 type Circle struct { 22 ID CircleID `json:"id" datastore:"-"` 23 Name string `json:"name"` 24 ImageIDs []imageID `json:"-"` 25 Images []*Image `json:"images" datastore:"-"` 26 CreatedAt unixTime `json:"createdAt"` 27 UpdatedAt unixTime `json:"updatedAt"` 28 } 29 30 func keyToCircleID(key datastore.Key) (CircleID, error) { 31 if key.Kind() != kindCircle { 32 return 0, fmt.Errorf("unexpected kind: %s", key.Kind()) 33 } 34 35 return CircleID(key.ID()), nil 36 } 37 38 // ToPropertyValue convert the value to the valid value as the property of datastore. 39 func (id CircleID) ToPropertyValue(ctx context.Context) (interface{}, error) { 40 client := ctx.Value(contextClient{}).(datastore.Client) 41 key := client.IDKey(kindCircle, int64(id), nil) 42 return key, nil 43 } 44 45 // FromPropertyValue convert property value to the valid value as the application. 46 func (id CircleID) FromPropertyValue(ctx context.Context, p datastore.Property) (dst interface{}, err error) { 47 key, ok := p.Value.(datastore.Key) 48 if !ok { 49 return nil, datastore.ErrInvalidEntityType 50 } 51 return keyToCircleID(key) 52 } 53 54 // ToKey convert the value to datastore.Key. 55 func (id CircleID) ToKey(client datastore.Client) datastore.Key { 56 return client.IDKey(kindCircle, int64(id), nil) 57 } 58 59 // Load loads all of the provided properties into struct. 60 func (circle *Circle) Load(ctx context.Context, ps []datastore.Property) error { 61 err := datastore.LoadStruct(ctx, circle, ps) 62 if err != nil { 63 return err 64 } 65 66 // 子画像をBatchGetしていく 67 68 batch, ok := ctx.Value(contextBatch{}).(*datastore.Batch) 69 if !ok || batch == nil { 70 return errors.New("can't pickup batch client") 71 } 72 73 client := ctx.Value(contextClient{}).(datastore.Client) 74 75 circle.Images = make([]*Image, len(circle.ImageIDs)) 76 for idx, imageID := range circle.ImageIDs { 77 imageKey := imageID.ToKey(client) 78 79 image := &Image{} 80 circle.Images[idx] = image 81 batch.Get(imageKey, image, nil) 82 } 83 84 return nil 85 } 86 87 // Save saves all of struct fields to properties. 88 func (circle *Circle) Save(ctx context.Context) ([]datastore.Property, error) { 89 if time.Time(circle.CreatedAt).IsZero() { 90 circle.CreatedAt = unixTime(timeNow()) 91 } 92 circle.UpdatedAt = unixTime(timeNow()) 93 94 return datastore.SaveStruct(ctx, circle) 95 } 96 97 // LoadKey loads key data into struct. 98 func (circle *Circle) LoadKey(ctx context.Context, k datastore.Key) error { 99 circle.ID = CircleID(k.ID()) 100 return nil 101 }