Add impersonation route
This commit is contained in:
parent
7540190794
commit
95692db8bd
1
api.go
1
api.go
@ -47,6 +47,7 @@ func declareAPIRoutes(router *gin.Engine) {
|
|||||||
_questions_cache_mutex.Unlock()
|
_questions_cache_mutex.Unlock()
|
||||||
})
|
})
|
||||||
|
|
||||||
|
declareAPIAdminAuthRoutes(apiAdminRoutes)
|
||||||
declareAPIAdminAsksRoutes(apiAdminRoutes)
|
declareAPIAdminAsksRoutes(apiAdminRoutes)
|
||||||
declareAPIAuthGradesRoutes(apiAdminRoutes)
|
declareAPIAuthGradesRoutes(apiAdminRoutes)
|
||||||
declareAPIAdminHelpRoutes(apiAdminRoutes)
|
declareAPIAdminHelpRoutes(apiAdminRoutes)
|
||||||
|
26
auth.go
26
auth.go
@ -27,6 +27,32 @@ func declareAPIAuthRoutes(router *gin.RouterGroup) {
|
|||||||
router.POST("/auth/logout", logout)
|
router.POST("/auth/logout", logout)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func declareAPIAdminAuthRoutes(router *gin.RouterGroup) {
|
||||||
|
router.POST("/auth/impersonate", func(c *gin.Context) {
|
||||||
|
session := c.MustGet("Session").(*Session)
|
||||||
|
|
||||||
|
var u *User
|
||||||
|
if err := c.ShouldBindJSON(&u); err != nil {
|
||||||
|
c.AbortWithStatusJSON(http.StatusBadRequest, gin.H{"errmsg": err.Error()})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
newuser, err := getUser(int(u.Id))
|
||||||
|
if err != nil {
|
||||||
|
c.AbortWithStatusJSON(http.StatusBadRequest, gin.H{"errmsg": err.Error()})
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
session.IdUser = &newuser.Id
|
||||||
|
session.Update()
|
||||||
|
|
||||||
|
c.JSON(http.StatusOK, authToken{
|
||||||
|
User: newuser,
|
||||||
|
CurrentPromo: currentPromo,
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
type authToken struct {
|
type authToken struct {
|
||||||
*User
|
*User
|
||||||
CurrentPromo uint `json:"current_promo"`
|
CurrentPromo uint `json:"current_promo"`
|
||||||
|
@ -18,9 +18,25 @@
|
|||||||
export let uid;
|
export let uid;
|
||||||
|
|
||||||
let allPromos = false;
|
let allPromos = false;
|
||||||
|
|
||||||
|
let myuser = null;
|
||||||
|
let userP = null;
|
||||||
|
$: userP = getUser(uid).then((u) => myuser = u)
|
||||||
|
|
||||||
|
function impersonate() {
|
||||||
|
fetch('api/auth/impersonate', {
|
||||||
|
method: 'POST',
|
||||||
|
headers: {'Accept': 'application/json'},
|
||||||
|
body: JSON.stringify({"id": myuser.id}),
|
||||||
|
}).then(() => {
|
||||||
|
if (res.status == 200) {
|
||||||
|
user.update(res);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
{#await getUser(uid)}
|
{#await userP}
|
||||||
<h2>
|
<h2>
|
||||||
Étudiant
|
Étudiant
|
||||||
</h2>
|
</h2>
|
||||||
@ -42,13 +58,22 @@
|
|||||||
</h2>
|
</h2>
|
||||||
{#if student.promo}
|
{#if student.promo}
|
||||||
<span class="badge bg-success ms-1">{student.promo}</span>
|
<span class="badge bg-success ms-1">{student.promo}</span>
|
||||||
{#if $user && $user.is_admin && $user.current_promo && student.promo != $user.current_promo}
|
{#if $user && $user.is_admin}
|
||||||
|
{#if $user.current_promo && student.promo != $user.current_promo}
|
||||||
|
<button
|
||||||
|
class="btn btn-sm btn-warning mx-1"
|
||||||
|
title="Passer sur la promo en cours"
|
||||||
|
on:click={() => { student.promo = $user.current_promo; student.save(); }}
|
||||||
|
>
|
||||||
|
<i class="bi bi-arrow-up"></i>
|
||||||
|
</button>
|
||||||
|
{/if}
|
||||||
<button
|
<button
|
||||||
class="btn btn-sm btn-warning mx-1"
|
class="btn btn-sm btn-primary mx-1"
|
||||||
title="Passer sur la promo en cours"
|
title="Impersonate"
|
||||||
on:click={() => { student.promo = $user.current_promo; student.save(); }}
|
on:click={impersonate}
|
||||||
>
|
>
|
||||||
<i class="bi bi-arrow-up"></i>
|
<i class="bi bi-person-bounding-box"></i>
|
||||||
</button>
|
</button>
|
||||||
{/if}
|
{/if}
|
||||||
{/if}
|
{/if}
|
||||||
|
Reference in New Issue
Block a user