TypedRepository

TypedRepository should be the most used going forward and it should be able to cater to most repository needs. It is most encouraged to use this repository.

If developers feel there are anything missing or things that can be improved on (specially if you feel you still need to use any repo aside from TypedRepository) please reach out to the #go-msx team.

Insert

err = personsRepo.Insert(ctx, person1)

Upsert

err = personsRepo.Upsert(ctx, person1)

Update

err = personsRepo.Update(ctx, goqu.Ex(map[string]interface{}{"id": person1.Id}), person1)

CountAll

err = personsRepo.CountAll(ctx, &count, nil)

FindOne

err = personsRepo.FindOne(ctx, &destPerson, sqldb.And(map[string]interface{}{"id": person1.Id}).Expression())

FindAll

pagingResponse, err := personsRepo.FindAll(ctx, &destPersons,
	sqldb.Where(goqu.Ex(map[string]interface{}{"name": person1.Name})),
	sqldb.Keys(goqu.Ex(map[string]interface{}{"id": person1.Id})),
	sqldb.Distinct("name"),
	sqldb.Sort([]paging.SortOrder{paging.SortOrder{Property: "name", Direction: "ASC"}}),
	sqldb.Paging(paging.Request{Size: 10, Page: 0}),
)

DeleteOne

err = personsRepo.DeleteOne(ctx, goqu.Ex(map[string]interface{}{"id": person1.Id}))

DeleteAll

err = personsRepo.DeleteAll(ctx, goqu.Ex(map[string]interface{}{"name": person1.Name}))

Truncate

err = personsRepo.Truncate(ctx)

Complete Code Examples

First create the persons table in order for the sample codes below to work.

CREATE TABLE persons ( id UUID PRIMARY KEY, name STRING );

type Person struct {
    Id uuid.UUID `db:"id"`
    Name string `db:"name"`
}

personsRepo, err := sqldb.NewTypedRepository[Person](ctx, "persons")
if err != nil {
	logger.WithContext(ctx).Error(err)
}

person1 := Person{Id: uuid.MustParse("437f96b0-6722-11ed-9022-0242ac120009"), Name: "Jonee"}
err = personsRepo.Insert(ctx, person1)
if err != nil {
	logger.WithContext(ctx).Error(err)
}

person1.Name = "Jonee6"
err = personsRepo.Upsert(ctx, person1)
if err != nil {
	logger.WithContext(ctx).Error(err)
}

person1.Name = "Jonee7"
err = personsRepo.Update(ctx, goqu.Ex(map[string]interface{}{"id": person1.Id}), person1)
if err != nil {
	logger.WithContext(ctx).Error(err)
}

count := int64(0)
err = personsRepo.CountAll(ctx, &count, nil)
if err != nil {
	logger.WithContext(ctx).Error(err)
}
logger.WithContext(ctx).Info(count)

var destPerson Person
err = personsRepo.FindOne(ctx, &destPerson, sqldb.And(map[string]interface{}{"id": person1.Id}).Expression())
if err != nil {
	logger.WithContext(ctx).Error(err)
}
logger.WithContext(ctx).Info(destPerson)

var destPersons []Person
pagingResponse, err := personsRepo.FindAll(ctx, &destPersons,
	sqldb.Where(goqu.Ex(map[string]interface{}{"name": person1.Name})),
	sqldb.Keys(goqu.Ex(map[string]interface{}{"id": person1.Id})),
	sqldb.Distinct("name"),
	sqldb.Sort([]paging.SortOrder{paging.SortOrder{Property: "name", Direction: "ASC"}}),
	sqldb.Paging(paging.Request{Size: 10, Page: 0}),
)
if err != nil {
	logger.WithContext(ctx).Error(err)
}
logger.WithContext(ctx).Info(pagingResponse)
logger.WithContext(ctx).Info(destPersons)

err = personsRepo.DeleteOne(ctx, goqu.Ex(map[string]interface{}{"id": person1.Id}))
if err != nil {
	logger.WithContext(ctx).Error(err)
}

err = personsRepo.DeleteAll(ctx, goqu.Ex(map[string]interface{}{"name": person1.Name}))
if err != nil {
	logger.WithContext(ctx).Error(err)
}

err = personsRepo.Truncate(ctx)
if err != nil {
	logger.WithContext(ctx).Error(err)
}