Skip to content

Commit

Permalink
refactor: use api to store last accessed for user
Browse files Browse the repository at this point in the history
  • Loading branch information
shreddedbacon committed Dec 13, 2024
1 parent fcc30b3 commit ed13dde
Show file tree
Hide file tree
Showing 4 changed files with 66 additions and 14 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
/**
* @param { import("knex").Knex } knex
* @returns { Promise<void> }
*/
exports.up = async function(knex) {
organizations = await knex.schema.hasTable('user');
if (!organizations) {
return knex.schema
.createTable('user', function (table) {
table.specificType('usid', 'CHAR(36)');
table.datetime('last_accessed');
table.primary(['usid']);
})
}
else {
return knex.schema
}
};

/**
* @param { import("knex").Knex } knex
* @returns { Promise<void> }
*/
exports.down = async function(knex) {
return knex.schema
};
31 changes: 20 additions & 11 deletions services/api/src/models/user.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import { Group, GroupType, KeycloakLagoonGroup } from './group';
import { Sql } from '../resources/user/sql';
import { getConfigFromEnv } from '../util/config';
import { Helpers as groupHelpers } from '../resources/group/helpers';
import { logger } from '../loggers/logger';

interface IUserAttributes {
comment?: [string];
Expand Down Expand Up @@ -185,16 +186,13 @@ export const User = (clients: {
let usersWithGitlabIdFetch = [];

for (const user of users) {
// set the lastaccessed attribute
// @TODO: no op last accessed for the time being due to raciness
// @TODO: refactor later
/*
let date = null;
if (user['attributes'] && user['attributes']['last_accessed']) {
date = new Date(user['attributes']['last_accessed']*1000).toISOString()
user.lastAccessed = date
const userdate = await query(
sqlClientPool,
Sql.selectLastAccessed(user.id)
);
if (userdate.length) {
user.lastAccessed = userdate[0].lastAccessed
}
*/
usersWithGitlabIdFetch.push({
...user,
gitlabId: await fetchGitlabId(user)
Expand Down Expand Up @@ -648,8 +646,14 @@ export const User = (clients: {

const userLastAccessed = async (userInput: User): Promise<Boolean> => {
// set the last accessed as a unix timestamp on the user attributes
// @TODO: no op last accessed for the time being due to raciness
// @TODO: refactor later
try {
await query(
sqlClientPool,
Sql.updateLastAccessed(userInput.id)
);
} catch (err) {
logger.warn(`Error updating user: ${err.message}`);
}
return true
};

Expand Down Expand Up @@ -754,6 +758,11 @@ export const User = (clients: {
sqlClientPool,
Sql.deleteFromUserSshKeys(id)
);
// delete from the user table
await query(
sqlClientPool,
Sql.deleteFromUser(id)
);

await keycloakAdminClient.users.del({ id });
} catch (err) {
Expand Down
19 changes: 19 additions & 0 deletions services/api/src/resources/user/sql.ts
Original file line number Diff line number Diff line change
Expand Up @@ -38,4 +38,23 @@ export const Sql = {
.where('sk.key_fingerprint', keyFingerprint)
.select('user_ssh_key.usid')
.toString(),
updateLastAccessed: (id: string) =>
knex('user')
.insert({
usid: id,
lastAccessed: knex.fn.now(),
})
.onConflict('usid')
.merge()
.toString(),
selectLastAccessed: (id: string) =>
knex('user')
.select('last_accessed')
.where('usid','=',id)
.toString(),
deleteFromUser: (id: string) =>
knex('user')
.where('usid', id)
.delete()
.toString(),
};
4 changes: 1 addition & 3 deletions services/api/src/typeDefs.js
Original file line number Diff line number Diff line change
Expand Up @@ -459,9 +459,7 @@ const typeDefs = gql`
# This just returns the group name, id and the role the user has in that group.
# This is a neat way to visualize a users specific access without having to get all members of a group
groupRoles: [GroupRoleInterface]
# @TODO: no op last accessed for the time being due to raciness
# @TODO: refactor later
# lastAccessed: String
lastAccessed: String
platformRoles: [PlatformRole]
}
Expand Down

0 comments on commit ed13dde

Please sign in to comment.