All files / views/webviews/sparql-connections-list sparql-connections-list-controller.ts

0% Statements 0/40
0% Branches 0/12
0% Functions 0/5
0% Lines 0/40

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130                                                                                                                                                                                                                                                                   
import * as vscode from 'vscode';
import { container } from 'tsyringe';
import { ServiceToken } from '@src/services/tokens';
import { ISparqlConnectionService } from '@src/languages/sparql/services';
import { WebviewController } from '../webview-controller';
import { SparqlConnectionsListMessages } from './sparql-connections-list-messages';
import { SparqlConnectionController } from '../sparql-connection/sparql-connection-controller';
 
export class SparqlConnectionsListController extends WebviewController<SparqlConnectionsListMessages> {
    constructor() {
        super({
            componentPath: 'sparql-connections-list-view.js',
            panelId: 'sparqlConnectionsListPanel',
            panelTitle: 'Manage Connections',
            panelIcon: 'database-connection'
        });
 
        const connectionService = container.resolve<ISparqlConnectionService>(ServiceToken.SparqlConnectionService);
 
        // Listen for connection changes and update the webview
        this.subscribe(
            connectionService.onDidChangeConnections(() => {
                this.sendConnectionsUpdate();
            })
        );
    }
 
    /**
     * Opens the connections list in the editor area.
     */
    async open() {
        await super.show(vscode.ViewColumn.Active);
        this.sendConnectionsUpdate();
    }
 
    /**
     * Sends the current connections list to the webview.
     */
    private sendConnectionsUpdate() {
        const connectionService = container.resolve<ISparqlConnectionService>(ServiceToken.SparqlConnectionService);
        const connections = connectionService.getConnections();
        
        this.postMessage({
            id: 'ConnectionsChanged',
            connections: connections
        });
    }
 
    protected async onDidReceiveMessage(message: SparqlConnectionsListMessages): Promise<boolean> {
        const connectionService = container.resolve<ISparqlConnectionService>(ServiceToken.SparqlConnectionService);
 
        switch (message.id) {
            case 'GetConnections': {
                const connections = connectionService.getConnections();
                this.postMessage({
                    id: 'GetConnectionsResult',
                    connections: connections
                });
                return true;
            }
            case 'CreateConnection': {
                const connection = await connectionService.createConnection();
                const connectionController = container.resolve<SparqlConnectionController>(ServiceToken.SparqlConnectionController);
                connectionController.edit(connection);
                return true;
            }
            case 'EditConnection': {
                const connectionController = container.resolve<SparqlConnectionController>(ServiceToken.SparqlConnectionController);
                connectionController.edit(message.connection);
                return true;
            }
            case 'DeleteConnection': {
                const displayName = message.connection.endpointUrl;
                const answer = await vscode.window.showWarningMessage(
                    `Are you sure you want to delete the connection "${displayName}"?`,
                    { modal: true },
                    'Delete'
                );
                
                if (answer === 'Delete') {
                    await connectionService.deleteConnection(message.connection.id);
                    await connectionService.saveConfiguration();
                }
                return true;
            }
            case 'ListGraphs': {
                // First test the connection
                const testResult = await connectionService.testConnection(message.connection);
                
                if (testResult !== null) {
                    // Connection failed - send error result
                    this.postMessage({
                        id: 'TestConnectionResult',
                        connectionId: message.connection.id,
                        success: false,
                        error: testResult.message
                    });
                    return true;
                }
                
                // Connection succeeded - update state and execute query
                this.postMessage({
                    id: 'TestConnectionResult',
                    connectionId: message.connection.id,
                    success: true
                });
                
                await vscode.commands.executeCommand('mentor.command.listGraphs', message.connection);
                return true;
            }
            case 'TestConnection': {
                const result = await connectionService.testConnection(message.connection);
                this.postMessage({
                    id: 'TestConnectionResult',
                    connectionId: message.connection.id,
                    success: result === null,
                    error: result?.message
                });
                return true;
            }
            case 'OpenInBrowser': {
                await vscode.env.openExternal(vscode.Uri.parse(message.url));
                return true;
            }
            default:
                return super.onDidReceiveMessage(message);
        }
    }
}