@@ -678,40 +678,68 @@ export const team = pgTable(
678678 ] ,
679679) ;
680680
681+ export const apiKeyType = pgEnum ( "api_key_type" , [ "user" , "sdk" , "automation" ] ) ;
682+ export const apiScope = pgEnum ( "api_scope" , [
683+ "read:data" ,
684+ "write:data" ,
685+ "read:experiments" ,
686+ "track:events" ,
687+ "admin:apikeys" ,
688+ ] ) ;
689+
681690export const apikey = pgTable (
682691 "apikey" ,
683692 {
684693 id : text ( ) . primaryKey ( ) . notNull ( ) ,
685- name : text ( ) ,
686- start : text ( ) ,
687- prefix : text ( ) ,
694+ name : text ( ) . notNull ( ) ,
695+ prefix : text ( ) . notNull ( ) ,
696+ start : text ( ) . notNull ( ) ,
688697 key : text ( ) . notNull ( ) ,
689- userId : text ( "user_id" ) . notNull ( ) ,
698+ userId : text ( "user_id" ) ,
699+ organizationId : text ( "organization_id" ) ,
700+ type : apiKeyType ( "type" ) . notNull ( ) . default ( "user" ) ,
701+ scopes : apiScope ( "scopes" ) . array ( ) . notNull ( ) . default ( [ ] ) ,
702+ enabled : boolean ( "enabled" ) . notNull ( ) . default ( true ) ,
703+ rateLimitEnabled : boolean ( "rate_limit_enabled" ) . notNull ( ) . default ( true ) ,
704+ rateLimitTimeWindow : integer ( "rate_limit_time_window" ) ,
705+ rateLimitMax : integer ( "rate_limit_max" ) ,
706+ requestCount : integer ( "request_count" ) . notNull ( ) . default ( 0 ) ,
707+ remaining : integer ( "remaining" ) ,
708+ lastRequest : timestamp ( "last_request" , { mode : "string" } ) ,
709+ lastRefillAt : timestamp ( "last_refill_at" , { mode : "string" } ) ,
690710 refillInterval : integer ( "refill_interval" ) ,
691711 refillAmount : integer ( "refill_amount" ) ,
692- lastRefillAt : timestamp ( "last_refill_at" , { mode : "string" } ) ,
693- enabled : boolean ( ) . default ( true ) ,
694- rateLimitEnabled : boolean ( "rate_limit_enabled" ) . default ( true ) ,
695- rateLimitTimeWindow : integer ( "rate_limit_time_window" ) . default ( 86400000 ) ,
696- rateLimitMax : integer ( "rate_limit_max" ) . default ( 10 ) ,
697- requestCount : integer ( "request_count" ) ,
698- remaining : integer ( ) ,
699- lastRequest : timestamp ( "last_request" , { mode : "string" } ) ,
700712 expiresAt : timestamp ( "expires_at" , { mode : "string" } ) ,
701- createdAt : timestamp ( "created_at" , { mode : "string" } ) . notNull ( ) ,
702- updatedAt : timestamp ( "updated_at" , { mode : "string" } ) . notNull ( ) ,
703- permissions : text ( ) ,
704- metadata : text ( ) ,
713+ metadata : jsonb ( "metadata" ) . default ( { } ) ,
714+ createdAt : timestamp ( "created_at" , { mode : "string" } ) . notNull ( ) . default ( sql `CURRENT_TIMESTAMP` ) ,
715+ updatedAt : timestamp ( "updated_at" , { mode : "string" } ) . notNull ( ) . default ( sql `CURRENT_TIMESTAMP` ) ,
705716 } ,
706717 ( table ) => [
707718 foreignKey ( {
708719 columns : [ table . userId ] ,
709720 foreignColumns : [ user . id ] ,
710721 name : "apikey_user_id_user_id_fk" ,
711722 } ) . onDelete ( "cascade" ) ,
723+ foreignKey ( {
724+ columns : [ table . organizationId ] ,
725+ foreignColumns : [ organization . id ] ,
726+ name : "apikey_organization_id_organization_id_fk" ,
727+ } ) . onDelete ( "cascade" ) ,
728+ index ( "apikey_user_id_idx" ) . using (
729+ "btree" ,
730+ table . userId . asc ( ) . nullsLast ( ) . op ( "text_ops" ) ,
731+ ) ,
732+ index ( "apikey_organization_id_idx" ) . using (
733+ "btree" ,
734+ table . organizationId . asc ( ) . nullsLast ( ) . op ( "text_ops" ) ,
735+ ) ,
736+ index ( "apikey_prefix_idx" ) . using (
737+ "btree" ,
738+ table . prefix . asc ( ) . nullsLast ( ) . op ( "text_ops" ) ,
739+ ) ,
740+ index ( "apikey_enabled_idx" ) . using ( "btree" , table . enabled . asc ( ) . nullsLast ( ) . op ( "boolean_ops" ) ) ,
712741 ] ,
713742) ;
714-
715743export const organization = pgTable (
716744 "organization" ,
717745 {
@@ -724,3 +752,4 @@ export const organization = pgTable(
724752 } ,
725753 ( table ) => [ unique ( "organization_slug_unique" ) . on ( table . slug ) ] ,
726754) ;
755+
0 commit comments