Search code examples
dartaqueduct

createdAt updatedAt aqueduct


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'

Solution

  • 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.