save method

Future<T> save(
  1. T model, {
  2. bool remote = true,
  3. Map<String, dynamic>? params,
  4. Map<String, String>? headers,
  5. OnSuccessOne<T>? onSuccess,
  6. OnErrorOne<T>? onError,
  7. DataRequestLabel? label,
})
inherited

Saves model of type T.

If remote is true, it will initiate an HTTP call.

Always persists to local storage.

Arguments params and headers will be merged with defaultParams and defaultHeaders, respectively.

See also: urlForSave, methodForSave.

Implementation

Future<T> save(
  T model, {
  bool remote = true,
  Map<String, dynamic>? params,
  Map<String, String>? headers,
  OnSuccessOne<T>? onSuccess,
  OnErrorOne<T>? onError,
  DataRequestLabel? label,
}) async {
  params = await defaultParams & params;
  headers = await defaultHeaders & headers;

  // ensure model is saved
  saveLocal(model);

  label = DataRequestLabel('save',
      type: internalType,
      id: model.id?.toString(),
      model: model,
      withParent: label);

  if (remote == false) {
    log(label, 'saved in local storage only');
    return model;
  }

  final serialized = await serialize(model);
  final body = json.encode(serialized);

  final uri = baseUrl.asUri / urlForSave(model.id, params) & params;
  final method = methodForSave(model.id, params);

  final result = await sendRequest<T>(
    uri,
    method: method,
    headers: headers,
    body: body,
    label: label,
    onSuccess: (data, label) {
      onSuccess ??= (data, label, _) => this.onSuccess<T>(data, label);
      return onSuccess!.call(data, label, this as Adapter<T>);
    },
    onError: (e, label) async {
      onError ??= (e, label, _) => this.onError<T>(e, label);
      return onError!.call(e, label, this as Adapter<T>);
    },
  );
  return result ?? model;
}