# Pin API ## Local Pinning All commands under `ipfs pin local` ### `add <ipfs-path> [--name=<name>] [--meta=<json>] [--type={recursive, direct}]` - Name is restricted to UTF-8 and <= 255 characters - multiple pins can have the same name - Meta field can be implemented later - ~~Should error if name is set in meta~~ - Defaults to recursive pin - Returns ``` type PinOutput struct { ID string Name string Cid string Type string Meta string -- future iteration } ``` - Should we make `add` non-blocking by default and return some Status in all PinOutput objects? - Status could be an integer for Progress as in the current `ipfs pin add` or could have more fields eg. `{Status : {queued | pinning | pinned | failed}, BlocksDownloaded : int}` ### `ls [--id=<pinid>] [--name=<name> --name-match=<match-type>] [--cid=<ipfs-path>] [--status=<status>] [--meta=<json match expr>] [--type={recursive | direct | recursive, direct}]` - Returns `PinOutput` for each pin listed - Must match all criteria - --name-match="contains" (i.e. case-insensitive, partial or full match) by default, other options for now are "exact" - should exact also be case insensitive and do we need to add another option if so - Initial reaction -- case insensitive all the way to minimize surprises with remote API - Meta field can be implemented later - need some syntax for the JSON matching -- open to recommendations - Type option - Default to recursive, direct ### `rm [--id=<pinid>] [--name=<name> --name-match=<match-type>] [--cid=<ipfs-path>] [--meta=<json match expr>]` - Returns `PinOutput` for each pin removed - Must match all criteria - Meta field can be implemented later - May delete multiple pins at once - Any need for --multiple (or --force) to allow deleting multiple pins at once? - Yes, require `--force` to delete more than one pin - Failure to pass this would result in an error like "tried to delete 33 pins, to delete them all repeat the command with --multiple", or actually listing all the pins to be deleted - Any need to specify at least one criteria? - Yes, but it can be overriden with `--force` - ~~If no to the above then are we ok with `ipfs pin local rm` deleting all pins? Seems like an easy mistake for a user to make.~~ - Should we allow `--type={recursive, direct}` here to allow removing all recursive or direct pins? - ~~Note: there is no way to unpin CID `X` as well as all CIDs decended from `X`.~~ - ~~Is this really something people want? Seems pretty niche and counter to what we're trying to get people to do with pins.~~ ### Bonus `ipfs add` - Add `--pin-name` which errors if `--pin=false` - Modify `AddEvent` to have an extra field `PinID string` ## Remote Pinning ### `add <ipfs-path> [--name=<name>] [--meta=<json>] --service=<service>` - Name is restricted to UTF-8 and <= 255 characters - multiple pins can have the same name - Meta field can be implemented later - Should error if name is set in meta - Returns ``` type RemotePinOutput struct { ID string Name string Cid string Status string Meta string -- future iteration Delegates []string } ``` - Add non-blocking by default - Should we add a flag to make it block until it's done or failed? - Should delegates actually be returned to the user? - If so should they be a separate field or just part of the Meta? ### `ls [--id=<pinid>] [--name=<name> --name-match=<match-type>] [--cid=<ipfs-path>] [--meta=<json match expr>] [--status=<status>] --service=<service>` - Returns `RemotePinOutput` for each pin listed - Must match all criteria - Meta field can be implemented later ### `rm [--id=<pinid>] [--name=<name> --name-match=<match-type>] [--cid=<ipfs-path>] [--meta=<json match expr>] [--status=<status>] --service=<service>` - Returns `RemotePinOutput` for each pin removed - Must match all criteria - Meta field can be implemented later - May delete multiple pins at once - Any need for --multiple (or --force) to allow deleting multiple pins at once? - Failure to pass this would result in an error like "tried to delete 33 pins, to delete them all repeat the command with --multiple", or actually listing all the pins to be deleted - Any need to specify at least one criteria? - If no to the above then are we ok with `ipfs pin local rm` deleting all pins? Seems like an easy mistake for a user to make. ## --format All of the above commands could also take a flag `--format=<format>` so that only selective parts of the PinOutput are returned (e.g. only the name or only the CID). This doesn't seem required for the first iteration. ## Differences The differences between local + remote in the two proposed APIs is: - remote always has `--service` - if unifying APIs could reserve `--service=local` for local - remote only has recursive pins - if unifying APIs could error when type is unsupported - remote only has name matching type "contains" (is also case-insensitive) - we may want to select local behavior to plan towards unification (e.g. no case-sensitive matching) - remote returns delegates - not sure if it should - even so could potentially be unified under Meta.Delegates - Maybe we should update the pinning service API spec to forbid names like Name or Delegates as keys in Meta? - remote only matches meta exactly - Question: in the Pinning Service API example does querying for meta={"app_id":"99986338-1113-4706-8302-4420da6158aa"} work when meta has multiple fields? i.e. is the query syntax here to do an exact match on set fields?