rhythia-api 215.0.0 → 217.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/api/deleteBeatmapPage.ts +26 -19
- package/api/executeAdminOperation.ts +113 -77
- package/api/getBeatmapComments.ts +32 -18
- package/api/getBeatmapPage.ts +67 -44
- package/api/getBeatmapPageById.ts +63 -40
- package/api/getBeatmaps.ts +3 -0
- package/api/getOnlinePlayers.ts +78 -0
- package/api/getUserScores.ts +59 -30
- package/api/postBeatmapComment.ts +23 -19
- package/api/submitScore.ts +47 -17
- package/api/updateBeatmapPage.ts +12 -10
- package/index.ts +41 -18
- package/package.json +4 -2
- package/types/database.ts +149 -88
- package/utils/cache.ts +60 -0
package/types/database.ts
CHANGED
|
@@ -252,6 +252,21 @@ export type Database = {
|
|
|
252
252
|
}
|
|
253
253
|
Relationships: []
|
|
254
254
|
}
|
|
255
|
+
cache: {
|
|
256
|
+
Row: {
|
|
257
|
+
key: string
|
|
258
|
+
value: Json
|
|
259
|
+
}
|
|
260
|
+
Insert: {
|
|
261
|
+
key: string
|
|
262
|
+
value: Json
|
|
263
|
+
}
|
|
264
|
+
Update: {
|
|
265
|
+
key?: string
|
|
266
|
+
value?: Json
|
|
267
|
+
}
|
|
268
|
+
Relationships: []
|
|
269
|
+
}
|
|
255
270
|
chartedValues: {
|
|
256
271
|
Row: {
|
|
257
272
|
created_at: string
|
|
@@ -628,46 +643,34 @@ export type Database = {
|
|
|
628
643
|
[_ in never]: never
|
|
629
644
|
}
|
|
630
645
|
Functions: {
|
|
631
|
-
admin_delete_user: {
|
|
632
|
-
|
|
633
|
-
Returns: boolean
|
|
634
|
-
}
|
|
635
|
-
admin_exclude_user: {
|
|
636
|
-
Args: { user_id: number }
|
|
637
|
-
Returns: boolean
|
|
638
|
-
}
|
|
646
|
+
admin_delete_user: { Args: { user_id: number }; Returns: boolean }
|
|
647
|
+
admin_exclude_user: { Args: { user_id: number }; Returns: boolean }
|
|
639
648
|
admin_invalidate_ranked_scores: {
|
|
640
649
|
Args: { user_id: number }
|
|
641
650
|
Returns: number
|
|
642
651
|
}
|
|
643
|
-
admin_log_action:
|
|
644
|
-
|
|
645
|
-
|
|
652
|
+
admin_log_action:
|
|
653
|
+
| {
|
|
654
|
+
Args: {
|
|
646
655
|
action_type: string
|
|
647
656
|
admin_id: number
|
|
648
657
|
details?: Json
|
|
649
658
|
target_id: number
|
|
650
659
|
}
|
|
651
|
-
|
|
660
|
+
Returns: undefined
|
|
661
|
+
}
|
|
662
|
+
| {
|
|
663
|
+
Args: {
|
|
652
664
|
action_type: string
|
|
653
665
|
admin_id: number
|
|
654
666
|
details?: Json
|
|
655
667
|
target_id: string
|
|
656
668
|
}
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
admin_profanity_clear: {
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
}
|
|
663
|
-
admin_remove_all_scores: {
|
|
664
|
-
Args: { user_id: number }
|
|
665
|
-
Returns: number
|
|
666
|
-
}
|
|
667
|
-
admin_restrict_user: {
|
|
668
|
-
Args: { user_id: number }
|
|
669
|
-
Returns: boolean
|
|
670
|
-
}
|
|
669
|
+
Returns: undefined
|
|
670
|
+
}
|
|
671
|
+
admin_profanity_clear: { Args: { user_id: number }; Returns: boolean }
|
|
672
|
+
admin_remove_all_scores: { Args: { user_id: number }; Returns: number }
|
|
673
|
+
admin_restrict_user: { Args: { user_id: number }; Returns: boolean }
|
|
671
674
|
admin_search_users: {
|
|
672
675
|
Args: { search_text: string }
|
|
673
676
|
Returns: {
|
|
@@ -694,15 +697,15 @@ export type Database = {
|
|
|
694
697
|
verificationDeadline: number
|
|
695
698
|
verified: boolean | null
|
|
696
699
|
}[]
|
|
700
|
+
SetofOptions: {
|
|
701
|
+
from: "*"
|
|
702
|
+
to: "profiles"
|
|
703
|
+
isOneToOne: false
|
|
704
|
+
isSetofReturn: true
|
|
705
|
+
}
|
|
697
706
|
}
|
|
698
|
-
admin_silence_user: {
|
|
699
|
-
|
|
700
|
-
Returns: boolean
|
|
701
|
-
}
|
|
702
|
-
admin_unban_user: {
|
|
703
|
-
Args: { user_id: number }
|
|
704
|
-
Returns: boolean
|
|
705
|
-
}
|
|
707
|
+
admin_silence_user: { Args: { user_id: number }; Returns: boolean }
|
|
708
|
+
admin_unban_user: { Args: { user_id: number }; Returns: boolean }
|
|
706
709
|
get_badge_leaderboard: {
|
|
707
710
|
Args: { p_limit?: number }
|
|
708
711
|
Returns: {
|
|
@@ -755,44 +758,75 @@ export type Database = {
|
|
|
755
758
|
total_pages: number
|
|
756
759
|
}[]
|
|
757
760
|
}
|
|
758
|
-
get_collections_v2:
|
|
759
|
-
|
|
760
|
-
|
|
761
|
+
get_collections_v2:
|
|
762
|
+
| {
|
|
763
|
+
Args: { items_per_page?: number; page_number?: number }
|
|
764
|
+
Returns: {
|
|
765
|
+
beatmap_count: number
|
|
766
|
+
created_at: string
|
|
767
|
+
description: string
|
|
768
|
+
id: number
|
|
769
|
+
owner: number
|
|
770
|
+
owner_avatar_url: string
|
|
771
|
+
owner_username: string
|
|
772
|
+
star1: number
|
|
773
|
+
star10: number
|
|
774
|
+
star11: number
|
|
775
|
+
star12: number
|
|
776
|
+
star13: number
|
|
777
|
+
star14: number
|
|
778
|
+
star15: number
|
|
779
|
+
star16: number
|
|
780
|
+
star17: number
|
|
781
|
+
star18: number
|
|
782
|
+
star2: number
|
|
783
|
+
star3: number
|
|
784
|
+
star4: number
|
|
785
|
+
star5: number
|
|
786
|
+
star6: number
|
|
787
|
+
star7: number
|
|
788
|
+
star8: number
|
|
789
|
+
star9: number
|
|
790
|
+
title: string
|
|
791
|
+
total_pages: number
|
|
792
|
+
}[]
|
|
793
|
+
}
|
|
794
|
+
| {
|
|
795
|
+
Args: {
|
|
761
796
|
items_per_page?: number
|
|
762
797
|
owner_filter?: number
|
|
763
798
|
page_number?: number
|
|
764
799
|
}
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
|
|
772
|
-
|
|
773
|
-
|
|
774
|
-
|
|
775
|
-
|
|
776
|
-
|
|
777
|
-
|
|
778
|
-
|
|
779
|
-
|
|
780
|
-
|
|
781
|
-
|
|
782
|
-
|
|
783
|
-
|
|
784
|
-
|
|
785
|
-
|
|
786
|
-
|
|
787
|
-
|
|
788
|
-
|
|
789
|
-
|
|
790
|
-
|
|
791
|
-
|
|
792
|
-
|
|
793
|
-
|
|
794
|
-
|
|
795
|
-
}
|
|
800
|
+
Returns: {
|
|
801
|
+
beatmap_count: number
|
|
802
|
+
created_at: string
|
|
803
|
+
description: string
|
|
804
|
+
id: number
|
|
805
|
+
owner: number
|
|
806
|
+
owner_avatar_url: string
|
|
807
|
+
owner_username: string
|
|
808
|
+
star1: number
|
|
809
|
+
star10: number
|
|
810
|
+
star11: number
|
|
811
|
+
star12: number
|
|
812
|
+
star13: number
|
|
813
|
+
star14: number
|
|
814
|
+
star15: number
|
|
815
|
+
star16: number
|
|
816
|
+
star17: number
|
|
817
|
+
star18: number
|
|
818
|
+
star2: number
|
|
819
|
+
star3: number
|
|
820
|
+
star4: number
|
|
821
|
+
star5: number
|
|
822
|
+
star6: number
|
|
823
|
+
star7: number
|
|
824
|
+
star8: number
|
|
825
|
+
star9: number
|
|
826
|
+
title: string
|
|
827
|
+
total_pages: number
|
|
828
|
+
}[]
|
|
829
|
+
}
|
|
796
830
|
get_collections_v3: {
|
|
797
831
|
Args: {
|
|
798
832
|
items_per_page?: number
|
|
@@ -910,33 +944,60 @@ export type Database = {
|
|
|
910
944
|
Args: { score_limit?: number; user_id: number }
|
|
911
945
|
Returns: Json
|
|
912
946
|
}
|
|
913
|
-
get_user_by_email: {
|
|
914
|
-
|
|
947
|
+
get_user_by_email: { Args: { email_address: string }; Returns: Json }
|
|
948
|
+
get_user_reigning_scores:
|
|
949
|
+
| {
|
|
950
|
+
Args: { page_size: number; userid: number }
|
|
951
|
+
Returns: {
|
|
952
|
+
awarded_sp: number
|
|
953
|
+
beatmaphash: string
|
|
954
|
+
beatmaptitle: string
|
|
955
|
+
created_at: string
|
|
956
|
+
difficulty: number
|
|
957
|
+
id: number
|
|
958
|
+
misses: number
|
|
959
|
+
mods: Json
|
|
960
|
+
notes: number
|
|
961
|
+
passed: boolean
|
|
962
|
+
replayhwid: string
|
|
963
|
+
songid: string
|
|
964
|
+
speed: number
|
|
965
|
+
spin: boolean
|
|
966
|
+
}[]
|
|
967
|
+
}
|
|
968
|
+
| {
|
|
969
|
+
Args: { userid: number }
|
|
970
|
+
Returns: {
|
|
971
|
+
awarded_sp: number
|
|
972
|
+
beatmaphash: string
|
|
973
|
+
created_at: string
|
|
974
|
+
id: number
|
|
975
|
+
misses: number
|
|
976
|
+
mods: Json
|
|
977
|
+
passed: boolean
|
|
978
|
+
replayhwid: string
|
|
979
|
+
songid: string
|
|
980
|
+
speed: number
|
|
981
|
+
spin: boolean
|
|
982
|
+
}[]
|
|
983
|
+
}
|
|
984
|
+
get_user_scores_lastday: {
|
|
985
|
+
Args: { limit_param: number; userid: number }
|
|
915
986
|
Returns: Json
|
|
916
987
|
}
|
|
917
|
-
|
|
918
|
-
Args: {
|
|
919
|
-
Returns:
|
|
920
|
-
awarded_sp: number
|
|
921
|
-
beatmaphash: string
|
|
922
|
-
beatmaptitle: string
|
|
923
|
-
created_at: string
|
|
924
|
-
difficulty: number
|
|
925
|
-
id: number
|
|
926
|
-
misses: number
|
|
927
|
-
mods: Json
|
|
928
|
-
notes: number
|
|
929
|
-
passed: boolean
|
|
930
|
-
replayhwid: string
|
|
931
|
-
songid: string
|
|
932
|
-
speed: number
|
|
933
|
-
spin: boolean
|
|
934
|
-
}[]
|
|
988
|
+
get_user_scores_payload: {
|
|
989
|
+
Args: { limit_param: number; userid: number }
|
|
990
|
+
Returns: Json
|
|
935
991
|
}
|
|
992
|
+
get_user_scores_reign: { Args: { userid: number }; Returns: Json }
|
|
936
993
|
get_user_scores_summary: {
|
|
937
994
|
Args: { limit_param?: number; userid: number }
|
|
938
995
|
Returns: Json
|
|
939
996
|
}
|
|
997
|
+
get_user_scores_top_and_stats: {
|
|
998
|
+
Args: { limit_param: number; userid: number }
|
|
999
|
+
Returns: Json
|
|
1000
|
+
}
|
|
940
1001
|
grant_special_badges: {
|
|
941
1002
|
Args: {
|
|
942
1003
|
p_beatmap_id: number
|
package/utils/cache.ts
ADDED
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { supabase } from "./supabase";
|
|
2
|
+
|
|
3
|
+
const CACHE_TABLE = "cache";
|
|
4
|
+
|
|
5
|
+
type CacheKey = string | number;
|
|
6
|
+
|
|
7
|
+
const normalizeKey = (key: CacheKey) => String(key);
|
|
8
|
+
|
|
9
|
+
export async function getCacheValue<T = unknown>(
|
|
10
|
+
key: CacheKey
|
|
11
|
+
): Promise<T | null> {
|
|
12
|
+
const { data, error } = await supabase
|
|
13
|
+
.from(CACHE_TABLE)
|
|
14
|
+
.select("value")
|
|
15
|
+
.eq("key", normalizeKey(key))
|
|
16
|
+
.maybeSingle();
|
|
17
|
+
|
|
18
|
+
if (error) {
|
|
19
|
+
console.error("getCacheValue error", error);
|
|
20
|
+
return null;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
return (data?.value as T) ?? null;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export async function setCacheValue<T = unknown>(
|
|
27
|
+
key: CacheKey,
|
|
28
|
+
value: T
|
|
29
|
+
): Promise<void> {
|
|
30
|
+
const { error } = await supabase
|
|
31
|
+
.from(CACHE_TABLE)
|
|
32
|
+
.upsert({ key: normalizeKey(key), value } as any);
|
|
33
|
+
|
|
34
|
+
if (error) {
|
|
35
|
+
console.error("setCacheValue error", error);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export async function invalidateCache(key: CacheKey): Promise<void> {
|
|
40
|
+
const { error } = await supabase
|
|
41
|
+
.from(CACHE_TABLE)
|
|
42
|
+
.delete()
|
|
43
|
+
.eq("key", normalizeKey(key));
|
|
44
|
+
|
|
45
|
+
if (error) {
|
|
46
|
+
console.error("invalidateCache error", error);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
export async function invalidateCachePrefix(prefix: CacheKey): Promise<void> {
|
|
51
|
+
const normalizedPrefix = normalizeKey(prefix);
|
|
52
|
+
const { error } = await supabase
|
|
53
|
+
.from(CACHE_TABLE)
|
|
54
|
+
.delete()
|
|
55
|
+
.like("key", `${normalizedPrefix}%`);
|
|
56
|
+
|
|
57
|
+
if (error) {
|
|
58
|
+
console.error("invalidateCachePrefix error", error);
|
|
59
|
+
}
|
|
60
|
+
}
|