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 Jul 3, 2024
1 parent 42967be commit a2eec19
Show file tree
Hide file tree
Showing 3 changed files with 60 additions and 21 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
};
36 changes: 15 additions & 21 deletions services/api/src/models/user.ts
Original file line number Diff line number Diff line change
Expand Up @@ -182,14 +182,15 @@ export const User = (clients: {
let usersWithGitlabIdFetch = [];

for (const user of users) {
// set the lastaccessed attribute
let date = null;
if (user['attributes'] && user['attributes']['last_accessed']) {
date = new Date(user['attributes']['last_accessed']*1000).toISOString()
const userdate = await query(
sqlClientPool,
Sql.selectLastAccessed(user.id)
);
if (userdate.length) {
user.lastAccessed = userdate[0].lastAccessed
}
usersWithGitlabIdFetch.push({
...user,
lastAccessed: date,
gitlabId: await fetchGitlabId(user)
});
}
Expand Down Expand Up @@ -545,24 +546,12 @@ export const User = (clients: {
const userLastAccessed = async (userInput: User): Promise<Boolean> => {
// set the last accessed as a unix timestamp on the user attributes
try {
const lastAccessed = {last_accessed: Math.floor(Date.now() / 1000)}
await keycloakAdminClient.users.update(
{
id: userInput.id
},
{
attributes: {
...userInput.attributes,
...lastAccessed
}
}
await query(
sqlClientPool,
Sql.updateLastAccessed(userInput.id)
);
} catch (err) {
if (err.response.status && err.response.status === 404) {
throw new UserNotFoundError(`User not found: ${userInput.id}`);
} else {
logger.warn(`Error updating Keycloak user: ${err.message}`);
}
logger.warn(`Error updating user: ${err.message}`);
}
return true
};
Expand Down Expand Up @@ -659,6 +648,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(),
};

0 comments on commit a2eec19

Please sign in to comment.