Skip to content

Commit c7f6bea

Browse files
authored
added ability to get info from users table (#59)
1 parent b6ab327 commit c7f6bea

File tree

6 files changed

+100
-0
lines changed

6 files changed

+100
-0
lines changed

.github/workflows/py_analysis-coverage.yml

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,7 @@ jobs:
9191
--admin-user admin --admin-pass adminpassword
9292
sed -i -e 's/${{ env.NC_dbname }}/xyz/g' config/config.php
9393
php occ config:system:set debug --value=true --type=boolean
94+
OC_PASS=uSr1paSZsg php occ user:add --password-from-env --display-name="Test User" --group="users" user
9495
php -S localhost:8080 &
9596
9697
- uses: actions/checkout@v3
@@ -111,6 +112,7 @@ jobs:
111112
env:
112113
SERVER_ROOT: "../.."
113114
CPA_LOGLEVEL: debug
115+
USER_ID: admin
114116

115117
- name: HTML coverage to artifacts
116118
uses: actions/upload-artifact@v3
@@ -183,6 +185,7 @@ jobs:
183185
--database-host=127.0.0.1 --database-user=root --database-pass=rootpassword \
184186
--admin-user admin --admin-pass adminpassword
185187
php occ config:system:set debug --value=true --type=boolean
188+
OC_PASS=uSr1paSZsg php occ user:add --password-from-env --display-name="Test User" --group="users" user
186189
php -S localhost:8080 &
187190
188191
- uses: actions/checkout@v3
@@ -203,6 +206,7 @@ jobs:
203206
env:
204207
SERVER_ROOT: "../.."
205208
CPA_LOGLEVEL: debug
209+
USER_ID: admin
206210

207211
- name: HTML coverage to artifacts
208212
uses: actions/upload-artifact@v3
@@ -275,6 +279,7 @@ jobs:
275279
--database-host=127.0.0.1 --database-user=root --database-pass=rootpassword \
276280
--admin-user admin --admin-pass adminpassword
277281
php occ config:system:set debug --value=true --type=boolean
282+
OC_PASS=uSr1paSZsg php occ user:add --password-from-env --display-name="Test User" --group="users" user
278283
php -S localhost:8080 &
279284
280285
- uses: actions/checkout@v3
@@ -295,6 +300,7 @@ jobs:
295300
env:
296301
SERVER_ROOT: "../.."
297302
CPA_LOGLEVEL: debug
303+
USER_ID: admin
298304

299305
- name: HTML coverage to artifacts
300306
uses: actions/upload-artifact@v3
@@ -356,6 +362,7 @@ jobs:
356362
--database-user=root --database-pass=root \
357363
--admin-user admin --admin-pass adminpassword
358364
php occ config:system:set debug --value=true --type=boolean
365+
OC_PASS=uSr1paSZsg php occ user:add --password-from-env --display-name="Test User" --group="users" user
359366
php -S localhost:8080 &
360367
361368
- uses: actions/checkout@v3
@@ -376,6 +383,7 @@ jobs:
376383
env:
377384
SERVER_ROOT: "../.."
378385
CPA_LOGLEVEL: debug
386+
USER_ID: admin
379387

380388
- name: HTML coverage to artifacts
381389
uses: actions/upload-artifact@v3
@@ -441,6 +449,7 @@ jobs:
441449
--database-user=username --database-pass=userpass \
442450
--admin-user admin --admin-pass adminpassword --database-host="/var/run/postgresql"
443451
php occ config:system:set debug --value=true --type=boolean
452+
OC_PASS=uSr1paSZsg php occ user:add --password-from-env --display-name="Test User" --group="users" user
444453
php -S localhost:8080 &
445454
446455
- uses: actions/checkout@v3
@@ -461,6 +470,7 @@ jobs:
461470
env:
462471
SERVER_ROOT: "../.."
463472
CPA_LOGLEVEL: debug
473+
USER_ID: admin
464474

465475
- name: HTML coverage to artifacts
466476
uses: actions/upload-artifact@v3

nc_py_api/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,3 +17,4 @@
1717
)
1818
from .log import cpa_logger
1919
from .occ import get_cloud_app_config_value, occ_call, occ_call_decode
20+
from .users import current_user_info, user_info, users_info

nc_py_api/db_misc.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,10 @@ def file_cache(self) -> str:
2929
def mimetypes(self) -> str:
3030
return CONFIG["dbtprefix"] + "mimetypes"
3131

32+
@property
33+
def users(self) -> str:
34+
return CONFIG["dbtprefix"] + "users"
35+
3236
@property
3337
def settings(self) -> str:
3438
return CONFIG["dbtprefix"] + "cloud_py_api_settings"

nc_py_api/db_requests.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,3 +121,18 @@ def get_non_direct_access_filesize_limit() -> int:
121121
if not result:
122122
return 256 * 1024 * 1024
123123
return int(result[0]["value"])
124+
125+
126+
def get_users() -> list[dict]:
127+
"""Returns `users` table as a list of dictionaries."""
128+
129+
return execute_fetchall(f"SELECT * FROM {TABLES.users};")
130+
131+
132+
def get_user(uid_lower: str) -> dict:
133+
"""Returns `user` table record as a dictionary."""
134+
135+
result = execute_fetchall(f"SELECT * FROM {TABLES.users} WHERE uid_lower='{uid_lower}';")
136+
if result:
137+
return result[0]
138+
return {}

nc_py_api/users.py

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
"""
2+
Functions related to user management.
3+
"""
4+
from os import environ
5+
from typing import Optional, TypedDict
6+
7+
from .db_requests import get_user, get_users
8+
9+
10+
class UserInfo(TypedDict):
11+
uid: str
12+
display_name: Optional[str]
13+
password: str
14+
uid_lower: str
15+
16+
17+
USER_ID = environ.get("USER_ID", "")
18+
19+
20+
def current_user_info() -> Optional[UserInfo]:
21+
raw_result = get_user(USER_ID.lower())
22+
return db_record_to_user_info(raw_result) if raw_result else None
23+
24+
25+
def user_info(uid: str) -> Optional[UserInfo]:
26+
raw_result = get_user(uid.lower())
27+
if not raw_result:
28+
return None
29+
return db_record_to_user_info(raw_result)
30+
31+
32+
def users_info() -> list[UserInfo]:
33+
return [db_record_to_user_info(i) for i in get_users()]
34+
35+
36+
def db_record_to_user_info(user_record: dict) -> UserInfo:
37+
return {
38+
"uid": user_record["uid"],
39+
"display_name": user_record["displayname"],
40+
"password": user_record["password"],
41+
"uid_lower": user_record["uid_lower"],
42+
}

tests/nc_py_api/users_test.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
import pytest
2+
3+
from nc_py_api import current_user_info, user_info, users_info
4+
5+
6+
def test_user_info():
7+
info = current_user_info()
8+
assert info
9+
assert info["uid"]
10+
assert info["password"]
11+
assert info["uid_lower"]
12+
assert "display_name" in info.keys()
13+
assert info == user_info("admin")
14+
15+
16+
def test_users_info():
17+
info = users_info()
18+
assert len(info) == 2
19+
for i in info:
20+
assert i["uid"]
21+
assert i["password"]
22+
assert i["uid_lower"]
23+
assert "display_name" in i.keys()
24+
25+
26+
@pytest.mark.parametrize("uid", ["", "invalid user"])
27+
def test_invalid_user(uid):
28+
assert user_info(uid) is None

0 commit comments

Comments
 (0)