!7 concept AUser { S globalID = aLongGlobalID(); S userName, email, realName; S token; long lastSeen; } cmodule AssistantUsers > DynCRUD { // API S userIDForEmail(S email) { ret getString globalID(conceptWhereIC(AUser, +email)); } S userIDForName(S userName) { ret getString globalID(conceptWhereIC(AUser, +userName)); } void updateLastSeen(S userID) { cset(conceptWhere(AUser, globalID := userID), lastSeen := now()); } S registerUser(S email, S passwordHash) { if (userIDForEmail(email) != null) ret "User exists already"; if (!isValidEmailAddress(email)) ret "Not a valid e-mail address"; if (!isSHA256(passwordHash)) ret "Internal error"; AUser user = uniq_sync(AUser, +email); dm_call(dm_assistant_passwordsCRUD(), 'savePassword, user.globalID, passwordHash); ret "User registered!"; } }