diff --git a/backend/models/users.go b/backend/models/users.go index 51c9f3a..7d010fb 100644 --- a/backend/models/users.go +++ b/backend/models/users.go @@ -4,6 +4,7 @@ import ( "database/sql" "errors" "fmt" + "time" "github.com/jmoiron/sqlx" "github.com/jmoiron/sqlx/types" @@ -25,7 +26,16 @@ const ( RETURNING *;` deleteUserQuery = `DELETE FROM users WHERE id=:id;` - getAllUsersQuery = `SELECT * FROM users order by created_at;` + getAllUsersQuery = ` + SELECT u.*, tok.last_seen + FROM users u + LEFT OUTER JOIN ( + SELECT username, MAX(last_used) AS last_seen + FROM tokens GROUP BY username + ) AS tok + ON u.name = tok.username + ORDER by u.created_at; + ` getPolochonUsersQuery = `SELECT * FROM users WHERE polochon_id = $1;` ) @@ -51,6 +61,7 @@ type User struct { PolochonID sql.NullString `json:"polochon_id" db:"polochon_id"` PolochonActivated bool `json:"polochon_activated" db:"polochon_activated"` Polochon *Polochon `json:"polochon"` + LastSeen *time.Time `json:"last_seen" db:"last_seen"` } // NewPapiClient creates a new papi client for the given user diff --git a/frontend/js/components/admins/user.js b/frontend/js/components/admins/user.js index 461f504..6d47286 100644 --- a/frontend/js/components/admins/user.js +++ b/frontend/js/components/admins/user.js @@ -1,4 +1,5 @@ import React from "react"; +import moment from "moment"; import PropTypes from "prop-types"; import { useSelector } from "react-redux"; @@ -7,10 +8,10 @@ import { UserEdit } from "./userEdit"; export const User = ({ id }) => { const user = useSelector((state) => state.admin.users.get(id)); const polochon = user.polochon; + const lastSeen = moment(user.last_seen, "YYYY-MM-DDTHH:mm:ss.SZ"); return (
# | Name | Activated | Admin | Polochon URL | Polochon token | Polochon activated | +Last seen | Actions |
---|