Skip to content
This repository was archived by the owner on Sep 4, 2025. It is now read-only.
This repository was archived by the owner on Sep 4, 2025. It is now read-only.

Support for pagination? #110

Open
Open

Description

@rtnpro

Issue

It is not understandable from the docs as to how to implement pagination using this library. Is the pagination feature missing from the library? If not, some example or documentation on this will be super useful.

Activity

  1. svperfecta commented on Aug 31, 2017

    @svperfecta

    We used to do this by manually calling MarshalOne and MarshaMany, getting back the data object, manually adding links meta, and then json encoding the resulting payload. Bit annoying, but it was the only way to do top level (non object specific) links and meta. The library changed quite a bit, so I'm not sure (yet) how we'll do it now.

  2. svperfecta commented on Aug 31, 2017

    @svperfecta

    I updated our original code today. Essentially we wrote a wrapper for this library with some helper functions. We implemented a MarshalMany function (which I can probably combine with our MarshalOne function, since the library handles slices vs ptrs internally now). Anyways, I think you want something like this:

    //MarshalMany marshals many item payloads
    func (p *Payload) MarshalMany(writer io.Writer) error {
    
    	i, err := convertToSliceInterface(&p.Data)
    	if err != nil {
    		return fmt.Errorf(" Internal Server Error")
    	}
    
    	payload, err := jsonapi.Marshal(i)
    	if err != nil {
    		return fmt.Errorf(" Internal Server Error")
    	}
    
    	payload.(*jsonapi.ManyPayload).Links = &p.Links.Links
    	payload.(*jsonapi.ManyPayload).Meta = &p.Meta.Meta
    
    	json.NewEncoder(writer).Encode(payload)
    	return nil
    }
    

    There's probably a nicer way to do this, but the problem is that you need a way to pass something more complex than a slice or a ptr to MarshalPayload. Ideally that itself could be an object, that looks a lot like the OnePayload object.

  3. gnewton commented on Feb 25, 2018

    @gnewton

    The information that is needed to do pagination (offset, limit) plus meta needs to be made available inside of the Linkable/Meta which means the implementer of LInkable/Meta needs to store it somewhere. For a Person struct it can be in internal fields that are not marshalled:

    
    type Person struct{
    	ID        int64  `jsonapi:"primary,taxon"`
    	Name      string `jsonapi:"attr,name,omitempty"`
    	metainfo  string 
    }
    

    But you cannot attach these kinds of fields to a []Person.

    I would prefer changing the APIs (!!!) to be:

    func MarshalPayload(w io.Writer, models interface{}, extras interface{}) error
    
    type Linkable interface {
        JSONAPILinks(extras interface{}) *Links
    }
    
    type Metable interface {
        JSONAPIMeta(extras interface{}) *Meta
    }
    
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions