1package rest_test
2
3import (
4	"bytes"
5	"fmt"
6	"net/http"
7	"net/http/httptest"
8	"sync/atomic"
9	"time"
10
11	"github.com/pascaldekloe/goe/rest"
12)
13
14func ExampleCRUDRepo_SetCreateFunc() {
15	type Data struct {
16		Version int64  `json:"version"`
17		Msg     string `json:"msg"`
18	}
19	var v atomic.Value
20	v.Store(&Data{})
21
22	repo := rest.NewCRUD("/", "/Version")
23	repo.SetCreateFunc(func(d *Data) (int64, error) {
24		d.Version = time.Now().UnixNano()
25		v.Store(d)
26		return 42, nil
27	})
28
29	server := httptest.NewServer(repo)
30	defer server.Close()
31
32	res, err := http.Post(server.URL, "application/json", bytes.NewBufferString(`{"msg": "Hello World!"}`))
33	if err != nil {
34		panic(err)
35	}
36	fmt.Printf("Got HTTP %s %s: %s\n", res.Status, res.Header.Get("Location"), v.Load().(*Data).Msg)
37
38	// Output: Got HTTP 201 Created /42: Hello World!
39}
40
41func ExampleCRUDRepo_SetReadFunc() {
42	type Data struct {
43		Version int64  `json:"version"`
44		Msg     string `json:"msg"`
45	}
46
47	repo := rest.NewCRUD("/", "/Version")
48	repo.SetReadFunc(func(id, version int64) (*Data, error) {
49		if id != 42 {
50			return nil, rest.ErrNotFound
51		}
52		return &Data{1456260879956532222, "Hello World!"}, nil
53	})
54
55	server := httptest.NewServer(repo)
56	defer server.Close()
57
58	req, err := http.NewRequest("GET", server.URL+"/42", nil)
59	if err != nil {
60		panic(err)
61	}
62	req.Header.Set("If-None-Match", `"1456260879956532222"`)
63
64	res, err := http.DefaultClient.Do(req)
65	if err != nil {
66		panic(err)
67	}
68	fmt.Printf("Got HTTP %s: %s\n", res.Status, res.Header.Get("Content-Location"))
69
70	// Output: Got HTTP 304 Not Modified: /42?v=1456260879956532222
71}
72