Skip to content

go-pg/urlstruct

Folders and files

NameName
Last commit message
Last commit date
Jul 15, 2020
Sep 24, 2019
Sep 30, 2019
Dec 10, 2020
Aug 26, 2020
Aug 14, 2020
Jan 6, 2021
Jan 6, 2021
Aug 14, 2020
Sep 9, 2020
Aug 26, 2020
Jul 23, 2020
Aug 12, 2020
Dec 10, 2020
Dec 10, 2020
Sep 25, 2019

Repository files navigation

urlstruct decodes url.Values into structs

Build Status GoDoc

Example

Following example decodes URL query ?page=2&limit=100&author_id=123 into a struct.

type Book struct {
	tableName struct{} `pg:"alias:b"`

	ID        int64
	AuthorID  int64
	CreatedAt time.Time
}

type BookFilter struct {
	tableName struct{} `urlstruct:"b"`

	urlstruct.Pager
	AuthorID int64
}

func ExampleUnmarshal_filter() {
	db := pg.Connect(&pg.Options{
		User:     "postgres",
		Password: "",
		Database: "postgres",
	})
	defer db.Close()

	values := url.Values{
		"author_id": {"123"},
		"page":      {"2"},
		"limit":     {"100"},
	}
	filter := new(BookFilter)
	err := urlstruct.Unmarshal(values, filter)
	if err != nil {
		panic(err)
	}

	filter.Pager.MaxLimit = 100     // default max limit is 1000
	filter.Pager.MaxOffset = 100000 // default max offset is 1000000

	// Following query generates:
	//
	// SELECT "b"."id", "b"."author_id", "b"."created_at"
	// FROM "books" AS "b"
	// WHERE "b".author_id = 123
	// LIMIT 100 OFFSET 100

	var books []*Book
	_ = db.Model(&books).
		WhereStruct(filter).
		Limit(filter.Pager.GetLimit()).
		Offset(filter.Pager.GetOffset()).
		Select()

	fmt.Println("author", filter.AuthorID)
	fmt.Println("limit", filter.GetLimit())
	fmt.Println("offset", filter.GetLimit())
	// Output: author 123
	// limit 100
	// offset 100
}