2

In mongoose, there's the timestamp: true option to a schema, which auto-populates a createdAt and updatedAt for any model item added.

Is there something similar in Aqueduct?

If not, how do I manually do so?

I currently tried this, which is failing, as usual:

  @Operation.post()
  Future<Response> createICD(@Bind.body() ICD body) async {
    body.createdAt = DateTime.now();
    final query = Query<ICD>(context)..values = body;
    final insertICD = await query.insert();

    return Response.ok({'state': true, 'data': insertICD});
  }

Error from the above approach is:

Converting object to an encodable object failed: Instance of 'ICD'
KhoPhi
  • 9,660
  • 17
  • 77
  • 128

1 Answers1

2

It's failing when you send the response; you need to call asMap() on insertICD. The response body object you are providing is a standard Dart map - it doesn't have any special encoding behavior, so it doesn't know how to encode a complex type like ManagedObject. Invoke asMap() on the managed object to convert it to a standard Dart map:

@Operation.post()
Future<Response> createICD(@Bind.body() ICD body) async {
  body.createdAt = DateTime.now();
  final query = Query<ICD>(context)..values = body;
  final insertICD = await query.insert();

  return Response.ok({'state': true, 'data': insertICD.asMap()});
}

Also, see http://aqueduct.io/docs/db/validations/#update-and-insert-callbacks for setting timestamps at create/update events.

Joe Conway
  • 1,566
  • 9
  • 8