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/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
- Args: { user_id: number }
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
- Args:
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
- Returns: undefined
658
- }
659
- admin_profanity_clear: {
660
- Args: { user_id: number }
661
- Returns: boolean
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
- Args: { user_id: number }
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
- Args:
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
- | { items_per_page?: number; page_number?: number }
766
- Returns: {
767
- beatmap_count: number
768
- created_at: string
769
- description: string
770
- id: number
771
- owner: number
772
- owner_avatar_url: string
773
- owner_username: string
774
- star1: number
775
- star10: number
776
- star11: number
777
- star12: number
778
- star13: number
779
- star14: number
780
- star15: number
781
- star16: number
782
- star17: number
783
- star18: number
784
- star2: number
785
- star3: number
786
- star4: number
787
- star5: number
788
- star6: number
789
- star7: number
790
- star8: number
791
- star9: number
792
- title: string
793
- total_pages: number
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
- Args: { email_address: string }
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
- get_user_reigning_scores: {
918
- Args: { page_size: number; userid: number } | { userid: number }
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
+ }