Skip to main content
Glama
builtins.rs4.15 kB
use axum::{ Json, extract::{ Host, OriginalUri, Path, }, }; use dal::{ ChangeSetId, WorkspacePk, module::ModuleId, }; use module_index_client::ModuleIndexClient; use serde::{ Deserialize, Serialize, }; use si_db::{ HistoryActor, User, }; use super::{ ModuleAPIResult, ModulesAPIError, }; use crate::{ extract::{ HandlerContext, PosthogClient, request::RawAccessToken, }, service::v2::AccessBuilder, track, }; #[derive(Deserialize, Serialize, Debug)] #[serde(rename_all = "camelCase")] pub struct PromoteToBuiltinModuleResponse { pub success: bool, } pub async fn promote( HandlerContext(builder): HandlerContext, AccessBuilder(request_ctx): AccessBuilder, RawAccessToken(raw_access_token): RawAccessToken, PosthogClient(posthog_client): PosthogClient, OriginalUri(original_uri): OriginalUri, Host(host_name): Host, Path((_workspace_pk, change_set_id, module_id)): Path<(WorkspacePk, ChangeSetId, ModuleId)>, ) -> ModuleAPIResult<Json<PromoteToBuiltinModuleResponse>> { let ctx = builder .build(request_ctx.build(change_set_id.into())) .await?; let module_index_url = match ctx.module_index_url() { Some(url) => url, None => return Err(ModulesAPIError::ModuleIndexNotConfigured), }; let user = match ctx.history_actor() { HistoryActor::User(user_pk) => User::get_by_pk_opt(&ctx, *user_pk).await?, _ => None, }; let (_, created_by_email) = user .map(|user| (user.name().to_owned(), user.email().to_owned())) .unwrap_or(( "unauthenticated user name".into(), "unauthenticated user email".into(), )); let module_index_client = ModuleIndexClient::new(module_index_url.try_into()?, &raw_access_token)?; module_index_client .promote_to_builtin(module_id.into(), created_by_email.clone()) .await?; track( &posthog_client, &ctx, &original_uri, &host_name, "promote_to_builtin", serde_json::json!({ "pkg_id": module_id, "pkg_promoted_to_builtin_by": created_by_email, }), ); ctx.commit().await?; Ok(Json(PromoteToBuiltinModuleResponse { success: true })) } #[derive(Deserialize, Serialize, Debug)] #[serde(rename_all = "camelCase")] pub struct RejectModuleResponse { pub success: bool, } pub async fn reject( HandlerContext(builder): HandlerContext, AccessBuilder(request_ctx): AccessBuilder, RawAccessToken(raw_access_token): RawAccessToken, PosthogClient(posthog_client): PosthogClient, OriginalUri(original_uri): OriginalUri, Host(host_name): Host, Path((_workspace_pk, change_set_id, module_id)): Path<(WorkspacePk, ChangeSetId, ModuleId)>, ) -> ModuleAPIResult<Json<RejectModuleResponse>> { let ctx = builder .build(request_ctx.build(change_set_id.into())) .await?; let module_index_url = match ctx.module_index_url() { Some(url) => url, None => return Err(ModulesAPIError::ModuleIndexNotConfigured), }; let user = match ctx.history_actor() { HistoryActor::User(user_pk) => User::get_by_pk_opt(&ctx, *user_pk).await?, _ => None, }; let (_, created_by_email) = user .map(|user| (user.name().to_owned(), user.email().to_owned())) .unwrap_or(( "unauthenticated user name".into(), "unauthenticated user email".into(), )); let module_index_client = ModuleIndexClient::new(module_index_url.try_into()?, &raw_access_token)?; module_index_client .reject_module(module_id.into(), created_by_email.clone()) .await?; track( &posthog_client, &ctx, &original_uri, &host_name, "reject_pkg", serde_json::json!({ "pkg_id": module_id, "pkg_rejected_by": created_by_email, }), ); ctx.commit().await?; Ok(Json(RejectModuleResponse { success: true })) }

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/systeminit/si'

If you have feedback or need assistance with the MCP directory API, please join our Discord server