@crazyrabbitltc/railway-mcp
Version:
Railway MCP Server - 146+ tools with 100% Railway API coverage, comprehensive MCP testing framework, and real infrastructure management through AI assistants. Enhanced version with enterprise features, based on original work by Jason Tan.
122 lines (121 loc) • 5.33 kB
JavaScript
import { BaseService } from '../services/base.service.js';
import { createSuccessResponse, createErrorResponse, formatError } from '../utils/responses.js';
export class VariableService extends BaseService {
constructor() {
super();
}
async listVariables(projectId, environmentId, serviceId) {
try {
const variables = await this.client.variables.getVariables(projectId, environmentId, serviceId);
if (Object.keys(variables).length === 0) {
return createSuccessResponse({
text: serviceId
? "No variables found for this service in this environment."
: "No shared variables found in this environment.",
data: {}
});
}
const context = serviceId ? "service variables" : "shared environment variables";
const formattedVars = Object.entries(variables)
.map(([key, value]) => `${key}=${value}`)
.join('\n');
return createSuccessResponse({
text: `Current ${context}:\n\n${formattedVars}`,
data: variables
});
}
catch (error) {
return createErrorResponse(`Error listing variables: ${formatError(error)}`);
}
}
async upsertVariable(projectId, environmentId, name, value, serviceId) {
try {
await this.client.variables.upsertVariable({
projectId,
environmentId,
name,
value,
serviceId
});
const variableType = serviceId ? "service variable" : "shared environment variable";
return createSuccessResponse({
text: `Successfully set ${variableType} "${name}"`
});
}
catch (error) {
return createErrorResponse(`Error setting variable: ${formatError(error)}`);
}
}
async deleteVariable(projectId, environmentId, name, serviceId) {
try {
await this.client.variables.deleteVariable({
projectId,
environmentId,
name,
serviceId
});
const variableType = serviceId ? "service variable" : "shared environment variable";
return createSuccessResponse({
text: `Successfully deleted ${variableType} "${name}"`
});
}
catch (error) {
return createErrorResponse(`Error deleting variable: ${formatError(error)}`);
}
}
async bulkUpsertVariables(projectId, environmentId, variables, serviceId) {
try {
const inputs = Object.entries(variables).map(([name, value]) => ({
projectId,
environmentId,
name,
value,
serviceId
}));
await this.client.variables.upsertVariables(inputs);
const variableType = serviceId ? "service variables" : "shared environment variables";
return createSuccessResponse({
text: `Successfully updated ${inputs.length} ${variableType}`
});
}
catch (error) {
return createErrorResponse(`Error updating variables: ${formatError(error)}`);
}
}
async copyVariables(projectId, sourceEnvironmentId, targetEnvironmentId, serviceId, overwrite = false) {
try {
// Get variables from source environment
const sourceVars = await this.client.variables.getVariables(projectId, sourceEnvironmentId, serviceId);
if (Object.keys(sourceVars).length === 0) {
return createSuccessResponse({
text: "No variables found in source environment to copy.",
data: { copied: 0 }
});
}
// Get variables from target environment
const targetVars = await this.client.variables.getVariables(projectId, targetEnvironmentId, serviceId);
// If not overwriting, filter out variables that already exist in target
const varsToSet = overwrite
? sourceVars
: Object.fromEntries(Object.entries(sourceVars).filter(([key]) => !(key in targetVars)));
if (Object.keys(varsToSet).length === 0) {
return createSuccessResponse({
text: "All variables already exist in target environment.",
data: { copied: 0 }
});
}
// Bulk update the variables
await this.bulkUpsertVariables(projectId, targetEnvironmentId, varsToSet, serviceId);
const variableType = serviceId ? "service variables" : "shared environment variables";
return createSuccessResponse({
text: `Successfully copied ${Object.keys(varsToSet).length} ${variableType} to target environment`,
data: { copied: Object.keys(varsToSet).length }
});
}
catch (error) {
return createErrorResponse(`Error copying variables: ${formatError(error)}`);
}
}
}
// Initialize and export the singleton instance
export const variableService = new VariableService();