aboutsummaryrefslogtreecommitdiff
path: root/server/szurubooru/api/user_api.py
blob: 910f2a426e7033d0b098debe6ea55a4483c0aeea (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
from typing import Any, Dict
from szurubooru import model, search, rest
from szurubooru.func import auth, users, serialization, versions


_search_executor = search.Executor(search.configs.UserSearchConfig())


def _serialize(
        ctx: rest.Context, user: model.User, **kwargs: Any) -> rest.Response:
    return users.serialize_user(
        user,
        ctx.user,
        options=serialization.get_serialization_options(ctx),
        **kwargs)


@rest.routes.get('/users/?')
def get_users(ctx: rest.Context, _params: Dict[str, str]={}) -> rest.Response:
    auth.verify_privilege(ctx.user, 'users:list')
    return _search_executor.execute_and_serialize(
        ctx, lambda user: _serialize(ctx, user))


@rest.routes.post('/users/?')
def create_user(
        ctx: rest.Context, _params: Dict[str, str]={}) -> rest.Response:
    auth.verify_privilege(ctx.user, 'users:create')
    name = ctx.get_param_as_string('name')
    password = ctx.get_param_as_string('password')
    email = ctx.get_param_as_string('email', default='')
    user = users.create_user(name, password, email)
    if ctx.has_param('rank'):
        users.update_user_rank(user, ctx.get_param_as_string('rank'), ctx.user)
    if ctx.has_param('avatarStyle'):
        users.update_user_avatar(
            user,
            ctx.get_param_as_string('avatarStyle'),
            ctx.get_file('avatar', default=b''))
    ctx.session.add(user)
    ctx.session.commit()
    return _serialize(ctx, user, force_show_email=True)


@rest.routes.get('/user/(?P<user_name>[^/]+)/?')
def get_user(ctx: rest.Context, params: Dict[str, str]) -> rest.Response:
    user = users.get_user_by_name(params['user_name'])
    if ctx.user.user_id != user.user_id:
        auth.verify_privilege(ctx.user, 'users:view')
    return _serialize(ctx, user)


@rest.routes.put('/user/(?P<user_name>[^/]+)/?')
def update_user(ctx: rest.Context, params: Dict[str, str]) -> rest.Response:
    user = users.get_user_by_name(params['user_name'])
    versions.verify_version(user, ctx)
    versions.bump_version(user)
    infix = 'self' if ctx.user.user_id == user.user_id else 'any'
    if ctx.has_param('name'):
        auth.verify_privilege(ctx.user, 'users:edit:%s:name' % infix)
        users.update_user_name(user, ctx.get_param_as_string('name'))
    if ctx.has_param('password'):
        auth.verify_privilege(ctx.user, 'users:edit:%s:pass' % infix)
        users.update_user_password(
            user, ctx.get_param_as_string('password'))
    if ctx.has_param('email'):
        auth.verify_privilege(ctx.user, 'users:edit:%s:email' % infix)
        users.update_user_email(user, ctx.get_param_as_string('email'))
    if ctx.has_param('rank'):
        auth.verify_privilege(ctx.user, 'users:edit:%s:rank' % infix)
        users.update_user_rank(
            user, ctx.get_param_as_string('rank'), ctx.user)
    if ctx.has_param('avatarStyle'):
        auth.verify_privilege(ctx.user, 'users:edit:%s:avatar' % infix)
        users.update_user_avatar(
            user,
            ctx.get_param_as_string('avatarStyle'),
            ctx.get_file('avatar', default=b''))
    ctx.session.commit()
    return _serialize(ctx, user)


@rest.routes.delete('/user/(?P<user_name>[^/]+)/?')
def delete_user(ctx: rest.Context, params: Dict[str, str]) -> rest.Response:
    user = users.get_user_by_name(params['user_name'])
    versions.verify_version(user, ctx)
    infix = 'self' if ctx.user.user_id == user.user_id else 'any'
    auth.verify_privilege(ctx.user, 'users:delete:%s' % infix)
    ctx.session.delete(user)
    ctx.session.commit()
    return {}

© 2015 - 2026 Jakob L. Kreuze