Advanced add/update
Advanced creating and updating items
In addition to standard OData add and update items operations REST provides such useful methods as AddValidateUsingPath and ValidateUpdateListItem. The first is only presented in modern SharePoint, it not only allows adding items right in a sub folder but also operate with form data payloads and control check in process. ValidateUpdateListItem is handy for operations requiring system-like-update logic via pure REST.
In Gosip, AddValidateUsingPath and ValidateUpdateListItem are represented with Items().AddValidate() and Item.UpdateValidate() methods correspondingly:

Add validate

1
list := sp.Web().GetList("Lists/MyList")
2
3
// Method options
4
options := &api.ValidateAddOptions{
5
NewDocumentUpdate: true,
6
CheckInComment: "test",
7
DecodedPath: "Lists/MyList/subfolder" // is optional
8
}
9
10
// Form data payload
11
data := map[string]string{
12
"Title": "New item",
13
}
14
15
if _, err := list.Items().AddValidate(data, options); err != nil {
16
log.Fatal(err)
17
}
Copied!
As DecodedPath option the relative path to folder can be provided. It's optional. The path should be relative to a web without trailing slash in the beginning. Gosip adds web relative URL automatically.
ValidateAddOptions are also optional, when no new document update or check-in comment or folder path are ever required, a nil value should be passed.
1
list := sp.Web().GetList("Lists/MyList")
2
3
// Form data payload
4
data := map[string]string{
5
"Title": "New item",
6
}
7
8
if _, err := list.Items().AddValidate(data, nil); err != nil {
9
log.Fatal(err)
10
}
Copied!

Update validate

Using update validate is almost the same:
1
options := &ValidateUpdateOptions{
2
NewDocumentUpdate: true,
3
CheckInComment: "test",
4
}
5
6
data := map[string]string{
7
"Title": "New item",
8
}
9
10
if _, err := list.Items().GetByID(3).UpdateValidate(data, options); err != nil {
11
log.Fatal(err)
12
}
Copied!

Form values fingerprints

Form values passed to the methods should stand for an array of { FieldName: "", FieldValue: "" } objects where field value is a string of specific format depending on field's data type.
Gosip simplifies this payload operating with map of strings. In payload, map key should stand for a valid FieldName, a value, obviously, is the one mapped to FieldValue.
The fingerprints for the data types are following:
Field data type
Value sample
Comment
Text (single line and note)
"text"
Number
"123"
as a string
Yes/No
"1"
"1" - Yes, "2" - No
Person or group, single and multiple
`[{ "Key": "LoginName", "IsResolved": true }]`
"LoginName" is a valid login name, including provider prefix
"IsResolved" is optional
Date time
"6/23/2018 10:15 PM"
for different web locales is different
Date only
"6/23/2018'
for different web locales is different
Choice (single)
"Choice 1"
Choice (multi)
"Choice 1;#Choice 2"
";#" separated list
Hyperlink or picture
"https://go.spflow.com, Gosip"
a description can go after URL and ", " delimiter
Lookup (single)
"2"
item ID as string
Lookup (multi)
"1;#;#2;#;#3;#"
";#" separated list, after each ID goes additional ";#"
Managed metadata (single)
"Department 2|220a3627-4cd3-453d-ac54-34e71483bb8a;"
Managed metadata (multi)
"Department 2|220a3627-4cd3-453d-ac54-34e71483bb8a;Department 3|700a1bc3-3ef6-41ba-8a10-d3054f58db4b;"