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  }