37
 Followers
182
 Likes

Allow redefining entity built-in actions

Backend
On our radar

There are plenty of scenarios in which the base built-in actions are not enough. For example, if creation of a specific entity record demands that other entity records be also created, or if certain restrictions apply that cannot be modeled with static "default values". Or simply because you want to audit operations over sensitive entities.


Currently the way to do this with the Agile Platform is clumsy: isolate entities in their own eSpace, make them available read-only, and create sets of actions to do the required tasks. This works, but:

  • It is ugly - when actually using those actions, you will not see them associated with entities; you need to remember that they need to be imported, look for them under "referenced actions", remember from which eSpace they come from - or go look in the entity list;
  • It can lead to errors - if a new developer in a project using the pattern, for some reason, is not properly informed, he might simply go into the eSpace and switch the read-only property off, anticipating that it being that way was an error.
Created on 22 Jan 2011
Comments (70)
Merged this idea with 'Automatically generate CRUD server actions for entities' (created on 2017-07-20 05:50:15 by José Gomes)

One pattern that is usually followed is that for every entity, we expose them as public but read only. For that entities, we create our own CRUD actions to give us more control on database manipulation. 

My suggestion is that we can have some scaffolding actions that automatically create that server actions to be called from external modules, for example, right click on the entity -> generate CRUD actions.




Merged from 'Automatically generate CRUD server actions for entities' (idea created on 2017-07-20 05:50:15 by José Gomes), on 2017-07-21 07:53:33 by Gonçalo Borrêga

I would prefer to customize the existing entity actions.

Much like the OnBeforeRequest/OnAfterResponse methods of REST services are able to change the request/response, we could have a way of customizing the logic for persisting and retrieving the entity from the database.



Merged from 'Automatically generate CRUD server actions for entities' (idea created on 2017-07-20 05:50:15 by José Gomes), on 2017-07-21 07:53:33 by Gonçalo Borrêga

I also prefer customizing the existing entity actions the REST services alike. This leaves scaffolding intact and ensures that the added logic is always executed. 

We also create our own public crud server actions. Within the entity's espace one still can use the entity actions, to prevent this we must check the usage during code reviews.



Merged from 'Automatically generate CRUD server actions for entities' (idea created on 2017-07-20 05:50:15 by José Gomes), on 2017-07-21 07:53:33 by Gonçalo Borrêga

similar to https://www.outsystems.com/ideas/624/allow-redefining-entity-built-in-actions ?




Merged from 'Automatically generate CRUD server actions for entities' (idea created on 2017-07-20 05:50:15 by José Gomes), on 2017-07-21 07:53:33 by Gonçalo Borrêga
Merged this idea with 'Add scaffolding working CRUD wrappers' (created on 07 Aug 2018 06:19:40 by Eduardo Jauch)

Would be nice to be able to automatically add CRUD wrappers to entities, used by scaffolding operations.

This way, we would be able to set the Public/Read only properties correctly from the start, without having to set in a way to allow scaffolding just to have to create the wrappers and refactor everything later.



This comment was:
- originally posted on idea 'Add scaffolding working CRUD wrappers' (created on 07 Aug 2018 by Eduardo Jauch)
- merged to idea 'Allow redefining entity built-in actions' on 08 Aug 2018 03:36:42 by Justin James
Merged this idea with 'Business Level CRUD' (created on 05 Jul 2018 13:00:19 by Bob Matthyssens)

When a new entity is created a few elementary actions are created.

It's a good habit to use these actions in a set of business level actions and avoid using these elementary actions directly.

I think it would be nice to create these business actions automatically and provide them with calls of their elementary level actions.  At this time it's possible to disallow the usage of the elementary actions on another level than the business layer.  People cannot skip the business layer.



This comment was:
- originally posted on idea 'Business Level CRUD' (created on 05 Jul 2018 by Bob Matthyssens)
- merged to idea 'Allow redefining entity built-in actions' on 08 Aug 2018 03:37:29 by Justin James

Hi,


Great idea, but I think there are similar ideas already floating about...




This comment was:
- originally posted on idea 'Business Level CRUD' (created on 05 Jul 2018 by Bob Matthyssens)
- merged to idea 'Allow redefining entity built-in actions' on 08 Aug 2018 03:37:29 by Justin James

Yes, there are a number of existing ideas around this.

J.Ja



This comment was:
- originally posted on idea 'Business Level CRUD' (created on 05 Jul 2018 by Bob Matthyssens)
- merged to idea 'Allow redefining entity built-in actions' on 08 Aug 2018 03:37:29 by Justin James

Changed the category to Backend




This comment was:
- originally posted on idea 'Business Level CRUD' (created on 05 Jul 2018 by Bob Matthyssens)
- merged to idea 'Allow redefining entity built-in actions' on 08 Aug 2018 03:37:29 by Justin James
Merged this idea with 'Custom actions associated with entities' (created on 07 Sep 2015 10:14:43 by Kilian Hekhuis)
As a best practice, we typically have an eSpace that contains the entities for a given application, expose them read-only for use in queries, and have specific actions to save and delete records (which typically involve data validations and set some flag indicating deletion respectively). These actions naturally live on the Action tab in Service Studio. It would be nice to be able to associate them with the entities they pertain to, so that referencing the entities would automatically reference these actions (similar to the platform default Get, Update etc. entity actions are). Note that this is not the same as this idea (which is also great), as that's about automatic triggers.

This comment was:
- originally posted on idea 'Custom actions associated with entities' (created on 07 Sep 2015 by Kilian Hekhuis)
- merged to idea 'Allow redefining entity built-in actions' on 08 Aug 2018 03:38:16 by Justin James
So this should be a override of the existing platform Get / Update / Delete Entity actions?

This comment was:
- originally posted on idea 'Custom actions associated with entities' (created on 07 Sep 2015 by Kilian Hekhuis)
- merged to idea 'Allow redefining entity built-in actions' on 08 Aug 2018 03:38:16 by Justin James
after rereading I finally understand what you mean, I think....

you want to attach public actions to that entity (and my guess is, you want to hide the common actions of that same entity)
in old school programming, it's inheritance, encapsulating and controlling :)

so, I agree 100%.
It's in the line of having better control of what other modules are allowed to do, how to do it and what not to do!




This comment was:
- originally posted on idea 'Custom actions associated with entities' (created on 07 Sep 2015 by Kilian Hekhuis)
- merged to idea 'Allow redefining entity built-in actions' on 08 Aug 2018 03:38:16 by Justin James
@Matthias: more or less. If you expose an entity read-only, there are no Update/Delete actions, and we implement them ourselves typically.

@J.: Yes, that's what I mean.


This comment was:
- originally posted on idea 'Custom actions associated with entities' (created on 07 Sep 2015 by Kilian Hekhuis)
- merged to idea 'Allow redefining entity built-in actions' on 08 Aug 2018 03:38:16 by Justin James
Merged this idea with 'Ability to add new Entity Actions' (created on 15 Dec 2011 11:12:48 by Mário Araújo)
It would be interesting to be able to extend the existing entity actions with custom logic or to even add new actions under an entity


 .

This comment was:
- originally posted on idea 'Ability to add new Entity Actions' (created on 15 Dec 2011 by Mário Araújo)
- merged to idea 'Allow redefining entity built-in actions' on 08 Aug 2018 03:39:22 by Justin James
We have wrapped a lot of the entity actions and have to shove them in folders in the logic section. It would be visually cleaner and more convenient to put our wrapped actions here. 

This comment was:
- originally posted on idea 'Ability to add new Entity Actions' (created on 15 Dec 2011 by Mário Araújo)
- merged to idea 'Allow redefining entity built-in actions' on 08 Aug 2018 03:39:22 by Justin James
Frequently is necessary to create rules for getting, creating, updating or deleting records so it would be nice to simplify this process, i think that it could be achieved by right clicking in entity actions and selecting "Pre Processing" or "Post Processing" with actions attached to each option.

This comment was:
- originally posted on idea 'Ability to add new Entity Actions' (created on 15 Dec 2011 by Mário Araújo)
- merged to idea 'Allow redefining entity built-in actions' on 08 Aug 2018 03:39:22 by Justin James
Merged this idea with 'Automatic generation of fields and actions' (created on 04 Jun 2018 15:28:55 by Margarida Morais)

The fields CreatedBy, CreatedAt, UpdatedBy and UpdatedAt are often required. 

We spend a lot of time adding this fields and creating actions that encapsulate CRUD actions and fill these fields.

I propose a wizard that when creating an entity allows the user to:

  • select the automatic addition of the fields CreatedBy, CreatedAt, UpdatedBy and UpdatedAt
  • select the automatic generation of actions that encapsulate the CRUD actions and fill this fields.


This comment was:
- originally posted on idea 'Automatic generation of fields and actions' (created on 04 Jun 2018 by Margarida Morais)
- merged to idea 'Allow redefining entity built-in actions' on 08 Aug 2018 03:40:59 by Justin James
Merged this idea with 'Standard "Created/Changed On/By" attributes for entities' (created on 19 Dec 2014 14:04:15 by Erdal Yalcin)

This comment was:
- originally posted on idea 'Automatic generation of fields and actions' (created on 04 Jun 2018 by Margarida Morais)
- merged to idea 'Allow redefining entity built-in actions' on 08 Aug 2018 03:40:59 by Justin James
It would be nice to be able to check in the Entity's properties whether it should automatically record for each record entry in thetabase by who (user.Id) and when it was created or changed, so:
- CreatedBy
- ChangedBy
- CreatedOn
- ChangedOn

No we all seem to make these manually for those entities we like to record this for.


Merged from 'Standard "Created/Changed On/By" attributes for entities' (idea created on 19 Dec 2014 14:04:15 by Erdal Yalcin), on 06 Jun 2018 08:49:37 by J.

This comment was:
- originally posted on idea 'Automatic generation of fields and actions' (created on 04 Jun 2018 by Margarida Morais)
- merged to idea 'Allow redefining entity built-in actions' on 08 Aug 2018 03:40:59 by Justin James

blimey, it was on the radar, but the merge got it removed somehow :(




This comment was:
- originally posted on idea 'Automatic generation of fields and actions' (created on 04 Jun 2018 by Margarida Morais)
- merged to idea 'Allow redefining entity built-in actions' on 08 Aug 2018 03:40:59 by Justin James

I totally support this, it would be nice even if it was just to create the standard wrapper without any filling of fields, we waste too much time doing those wrappers (boring, repetitive work)



This comment was:
- originally posted on idea 'Automatic generation of fields and actions' (created on 04 Jun 2018 by Margarida Morais)
- merged to idea 'Allow redefining entity built-in actions' on 08 Aug 2018 03:40:59 by Justin James

Also nice if it could be a bit generic and you could define templates for fields/actions and then have those actions be created when you create an entity or by clicking on the entity and have an option like "Create Templates" 



This comment was:
- originally posted on idea 'Automatic generation of fields and actions' (created on 04 Jun 2018 by Margarida Morais)
- merged to idea 'Allow redefining entity built-in actions' on 08 Aug 2018 03:40:59 by Justin James

Changed the category to Backend




This comment was:
- originally posted on idea 'Automatic generation of fields and actions' (created on 04 Jun 2018 by Margarida Morais)
- merged to idea 'Allow redefining entity built-in actions' on 08 Aug 2018 03:40:59 by Justin James
Changed the status to
On our radar


Thank you so much for the suggestion, is something we have on the radar to be implemented, nevertheless is not yet settled when and how.

In order to have more insight can I ask your feeling on the following questions:

  • Instead of a wizard when creating the entity, would be Ok to be a property on the entity? 
  • How often this fields depend on business rules to be filled-in? Could they be filled-in automatically?

Thanks




This comment was:
- originally posted on idea 'Automatic generation of fields and actions' (created on 04 Jun 2018 by Margarida Morais)
- merged to idea 'Allow redefining entity built-in actions' on 08 Aug 2018 03:40:59 by Justin James

my 2 cents on the subject.

It is a bit strange that outsystems suggest a certain architecture where you also need to have entities to public=yes, but read-only. This forces us to create almost the boring wrappers around the crud-actions.

If this could be implemented when swapping the public=yes to aks a dialog "create wrappers? or something like that and it will be smart enough to see if there are createdBy, updateBy etc.. it should be rather easy to create the wrappers as we like to see?




This comment was:
- originally posted on idea 'Automatic generation of fields and actions' (created on 04 Jun 2018 by Margarida Morais)
- merged to idea 'Allow redefining entity built-in actions' on 08 Aug 2018 03:40:59 by Justin James

99% of the time it's "if id = null then set created on and created by to now and current user, and always set updated by for the same"


What you mean a property of the entity? How would it create actions based on a property?



This comment was:
- originally posted on idea 'Automatic generation of fields and actions' (created on 04 Jun 2018 by Margarida Morais)
- merged to idea 'Allow redefining entity built-in actions' on 08 Aug 2018 03:40:59 by Justin James

I *think* it would be something in the advanced properties like "identifier", plural etc...




This comment was:
- originally posted on idea 'Automatic generation of fields and actions' (created on 04 Jun 2018 by Margarida Morais)
- merged to idea 'Allow redefining entity built-in actions' on 08 Aug 2018 03:40:59 by Justin James

Yes. IMHO, these 4 fields should be like checkboxes / options in the advanced properties. And when checked, would be created automatically in the entity. 2 possible scenario's:

  1. Fields are not changeable by any logic. If user wants that, he could still manually create additional attributes instead of these. So here, fields are filled in automatically (and always!) without the need for setting them in logic
  2. Have them be changeable by logic (and even initial setting manually? Although then there would be little benefit of automation of repetitive work)


This comment was:
- originally posted on idea 'Automatic generation of fields and actions' (created on 04 Jun 2018 by Margarida Morais)
- merged to idea 'Allow redefining entity built-in actions' on 08 Aug 2018 03:40:59 by Justin James

Actually what i was suggesting were two things:

  • be able to automatically generate the fields. 
  • something like what we have on eclipse to automatically create methods. 

It would be very helpful if the fields were filled automatically. However, if Outsystems could automatically create generic actions, we would be able to add/change the code for particular situations.



This comment was:
- originally posted on idea 'Automatic generation of fields and actions' (created on 04 Jun 2018 by Margarida Morais)
- merged to idea 'Allow redefining entity built-in actions' on 08 Aug 2018 03:40:59 by Justin James

Yesterday i had to create wrappers for 45 entities by hand (had to refactor something), anything that helps in this  would be great :P

My 45 entities are local and dont have createdby/on and updatedby/on fields, it was literally doing an "automated" chore by hand.



This comment was:
- originally posted on idea 'Automatic generation of fields and actions' (created on 04 Jun 2018 by Margarida Morais)
- merged to idea 'Allow redefining entity built-in actions' on 08 Aug 2018 03:40:59 by Justin James

I think of those two points the second one is especially useful, the fields you can simply Copy/Paste, the actions take alot more time to replicate.



This comment was:
- originally posted on idea 'Automatic generation of fields and actions' (created on 04 Jun 2018 by Margarida Morais)
- merged to idea 'Allow redefining entity built-in actions' on 08 Aug 2018 03:40:59 by Justin James

Thanks for the great feedback we will take it into consideration.


There are a couple of scenarios like Timers and BPT that the user is not logged in, therefore CreatedBy or UpdatedBy either are empty or depend on business rules.


Regarding creating the wrappers is also one thing that is on our radar and is already mentioned on following idea.



This comment was:
- originally posted on idea 'Automatic generation of fields and actions' (created on 04 Jun 2018 by Margarida Morais)
- merged to idea 'Allow redefining entity built-in actions' on 08 Aug 2018 03:40:59 by Justin James

Dont forget the Delete actions :P

and for mobile, create all and delete all eheh

Good to know that they will be done eventually, keep up the good work.



This comment was:
- originally posted on idea 'Automatic generation of fields and actions' (created on 04 Jun 2018 by Margarida Morais)
- merged to idea 'Allow redefining entity built-in actions' on 08 Aug 2018 03:40:59 by Justin James

Action wrappers for Entities would be awesome, Validation of these actions should also be included based on entity constraints



This comment was:
- originally posted on idea 'Automatic generation of fields and actions' (created on 04 Jun 2018 by Margarida Morais)
- merged to idea 'Allow redefining entity built-in actions' on 08 Aug 2018 03:40:59 by Justin James

It would be nice to be able to flag a table as "Audit" in advanced properties, and then have OutSystems automatically capture data and time and userid in an OutSystems table specifically for this purpose maybe through a trigger/stored procedure. Couple it with an Audit component for access. The we could simply just check the box for tables we needed an Audit Trail for and not have all these additional attributes on each table.



This comment was:
- originally posted on idea 'Automatic generation of fields and actions' (created on 04 Jun 2018 by Margarida Morais)
- merged to idea 'Allow redefining entity built-in actions' on 08 Aug 2018 03:40:59 by Justin James

In my option, the entity could have:

And, if I pick "Yes", the fields will be created.





This comment was:
- originally posted on idea 'Automatic generation of fields and actions' (created on 04 Jun 2018 by Margarida Morais)
- merged to idea 'Allow redefining entity built-in actions' on 08 Aug 2018 03:40:59 by Justin James

It's even better to specify exact attributes here because names could be different



This comment was:
- originally posted on idea 'Automatic generation of fields and actions' (created on 04 Jun 2018 by Margarida Morais)
- merged to idea 'Allow redefining entity built-in actions' on 08 Aug 2018 03:40:59 by Justin James

If you have these four attributes on a table 

1. It does not give you a history of change, only who last changed the entity record.

2. It increases the size of each table where its not necessary

3. It does not handle (as someone said) the "Delete" case.

If you have a simple audit component you can track all of the things you want to track, or not




This comment was:
- originally posted on idea 'Automatic generation of fields and actions' (created on 04 Jun 2018 by Margarida Morais)
- merged to idea 'Allow redefining entity built-in actions' on 08 Aug 2018 03:40:59 by Justin James
Merged this idea with 'Entity - Generated "Create Or Update" Entity Actions' (created on 15 Nov 2017 17:12:25 by Miguel Sousa)

An Entity should have an option to automaticly generate a Entity_CreateOrUpdate action with server side validations, taking into account the properties of the attributes in the Entity (E.g. mandatory fields). In this way, we would have basic validation per entity in the Core Service modules and not only in the End User Modules. 



This comment was:
- originally posted on idea 'Entity - Generated "Create Or Update" Entity Actions' (created on 15 Nov 2017 by Miguel Sousa)
- merged to idea 'Allow redefining entity built-in actions' on 08 Aug 2018 03:41:30 by Justin James

I agree this can be helpfull, but I think everybody models this kind of functionality in a different way. So it should be configure (folder, name of the created action, which validations) else you'll end up with adjusting a lot.



This comment was:
- originally posted on idea 'Entity - Generated "Create Or Update" Entity Actions' (created on 15 Nov 2017 by Miguel Sousa)
- merged to idea 'Allow redefining entity built-in actions' on 08 Aug 2018 03:41:30 by Justin James

Well, I disagree with Evert. imho, those wrappers should be structured like already created actions:


<entityname>

-createorupdate

-create

-..


and tbh, i don't care on this low level naming ;)






This comment was:
- originally posted on idea 'Entity - Generated "Create Or Update" Entity Actions' (created on 15 Nov 2017 by Miguel Sousa)
- merged to idea 'Allow redefining entity built-in actions' on 08 Aug 2018 03:41:30 by Justin James
Merged this idea with 'Would the use of validation server actions be an option?' (created on 20 Jun 2018 12:17:50 by René Cornet)

This comment was:
- originally posted on idea 'Entity - Generated "Create Or Update" Entity Actions' (created on 15 Nov 2017 by Miguel Sousa)
- merged to idea 'Allow redefining entity built-in actions' on 08 Aug 2018 03:41:30 by Justin James

Instead of validating alterations (add, modify and delete) on tables at several places in parts of modules that approach these tables, it might be better, in my opinion, to perform these validations in special server actions. Maybe it is even better to create a special module for it that is stacked on the ‘Core’ module. Validations, for a specific alteration on a certain table, are always performed the same way in that case, no matter where the server action is initiated (screen, process …).


Having these special server actions, it is also easy to perform inter table validations. The deletion of a record of table A might result into an update of table B. If the update of the B-record is not allowed due to its validations, the deletion of the A-record may not take place either. This implies that the server action ‘ValidationCreateOrUpdateTableB’ is started within ‘ValidationDeleteTableA’. To instruct the caller, an output parameter should return the result of the validation. So, the outcome might be a description about the validation error or just empty if okay.


Introducing the validation server actions will imply that the database actions ‘CreateOrUpdateTable’, ‘CreateTable’, UpdateTable’ and ‘DeleteTable’ should not be used anywhere outside their validation server actions anymore.


The ‘ValidationCreateOrUpdateTable’ server action should check whether the input Id prameters is empty or not. If empty (nullIdentifier), the ‘ValidateCreateTable’ action should be started. When this action returns an empty value (a correct validation and an insertion), a new Id is returned as well. However, when the action returns an error description, the complete action should be cancelled. If the insertion is correct, but the following update is not correct, an abort transaction should be performed to undo the insertion in that case.


Would the use of validation server actions be an option?



Merged from 'Would the use of validation server actions be an option?' (idea created on 20 Jun 2018 12:17:50 by René Cornet), on 02 Jul 2018 09:57:06 by Fernando Moitinho

This comment was:
- originally posted on idea 'Entity - Generated "Create Or Update" Entity Actions' (created on 15 Nov 2017 by Miguel Sousa)
- merged to idea 'Allow redefining entity built-in actions' on 08 Aug 2018 03:41:30 by Justin James

Hello René,

First, what is your Idea behind this?

Second, that's what you should do based on your use cases and business logic that your application requires. 

They depend very much on the business logic that you need to implement and aren't equal to everyone. 


The Server actions you talk should be in same module where you have the Entities and only those server actions should be public and your entities should be public and Read-Only.


Abílio Matos



Merged from 'Would the use of validation server actions be an option?' (idea created on 20 Jun 2018 12:17:50 by René Cornet), on 02 Jul 2018 09:57:06 by Fernando Moitinho

This comment was:
- originally posted on idea 'Entity - Generated "Create Or Update" Entity Actions' (created on 15 Nov 2017 by Miguel Sousa)
- merged to idea 'Allow redefining entity built-in actions' on 08 Aug 2018 03:41:30 by Justin James

Hello Abilio,

The idea behind it is to have a single point of validation per table access type (create, update, delete).

I was creating an application in which records could be altered on the screen and records could be altered via JSON Restful webservices. For both entry points I was coding validations. So, i decided to call a server action for each validation.

I agree it is even better to store the validation table access actions in the database layer itself. Do you know if there is any documentation (course) about this topic?


René Cornet  



Merged from 'Would the use of validation server actions be an option?' (idea created on 20 Jun 2018 12:17:50 by René Cornet), on 02 Jul 2018 09:57:06 by Fernando Moitinho

This comment was:
- originally posted on idea 'Entity - Generated "Create Or Update" Entity Actions' (created on 15 Nov 2017 by Miguel Sousa)
- merged to idea 'Allow redefining entity built-in actions' on 08 Aug 2018 03:41:30 by Justin James

René,

This topic is also approached in 4 Layer Canvas architecture and in several courses, some more encapsulated than others, like the ones from Becoming a Web Developer guided path.


Abílio Matos



Merged from 'Would the use of validation server actions be an option?' (idea created on 20 Jun 2018 12:17:50 by René Cornet), on 02 Jul 2018 09:57:06 by Fernando Moitinho

This comment was:
- originally posted on idea 'Entity - Generated "Create Or Update" Entity Actions' (created on 15 Nov 2017 by Miguel Sousa)
- merged to idea 'Allow redefining entity built-in actions' on 08 Aug 2018 03:41:30 by Justin James

This is standard architectural practice.

THAT SAID...

The system does not support it well. For example, the drag/drop stuff more or less breaks down once you start using four layer canvas.

There are a number of related, but not identical ideas (nothing close enough for me to merge these) out there already.

J.Ja



Merged from 'Would the use of validation server actions be an option?' (idea created on 20 Jun 2018 12:17:50 by René Cornet), on 02 Jul 2018 09:57:06 by Fernando Moitinho

This comment was:
- originally posted on idea 'Entity - Generated "Create Or Update" Entity Actions' (created on 15 Nov 2017 by Miguel Sousa)
- merged to idea 'Allow redefining entity built-in actions' on 08 Aug 2018 03:41:30 by Justin James

Hi Fernando, 

What I actually intended to say is more about functional validations. Technical validations are performed very well by the current statements for adding, updating and deleting records, but is it also functionally allowed to delete a record,  do I need to update another table when I create a record, ... ? These functional validations should be performed, in my opinion, at one point per table and per table access type. The technical validations are performed during the actual table action.

René



This comment was:
- originally posted on idea 'Entity - Generated "Create Or Update" Entity Actions' (created on 15 Nov 2017 by Miguel Sousa)
- merged to idea 'Allow redefining entity built-in actions' on 08 Aug 2018 03:41:30 by Justin James