mirror of
				https://gitlab.ub.uni-bielefeld.de/sfb1288inf/nopaque.git
				synced 2025-11-04 12:22:47 +00:00 
			
		
		
		
	Implement corpora endpoint/socket.io namespace
This commit is contained in:
		@@ -3,6 +3,7 @@ nopaque.App = class App {
 | 
			
		||||
    this.socket = io({transports: ['websocket'], upgrade: false});
 | 
			
		||||
 | 
			
		||||
    // Endpoints
 | 
			
		||||
    this.corpora = new nopaque.app.endpoints.Corpora(this);
 | 
			
		||||
    this.jobs = new nopaque.app.endpoints.Jobs(this);
 | 
			
		||||
    this.users = new nopaque.app.endpoints.Users(this);
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										57
									
								
								app/static/js/app/endpoints/corpora.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										57
									
								
								app/static/js/app/endpoints/corpora.js
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,57 @@
 | 
			
		||||
nopaque.app.endpoints.Corpora = class Corpora {
 | 
			
		||||
  constructor(app) {
 | 
			
		||||
    this.app = app;
 | 
			
		||||
 | 
			
		||||
    this.socket = io('/corpora', {transports: ['websocket'], upgrade: false});
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  async delete(id) {
 | 
			
		||||
    const response = await this.socket.emitWithAck('delete', id);
 | 
			
		||||
 | 
			
		||||
    if (response.status != 202) {
 | 
			
		||||
      throw new Error(`[${response.status}] ${response.statusText}`);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return response.body;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  async build(id) {
 | 
			
		||||
    const response = await this.socket.emitWithAck('build', id);
 | 
			
		||||
 | 
			
		||||
    if (response.status != 202) {
 | 
			
		||||
      throw new Error(`[${response.status}] ${response.statusText}`);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return response.body;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  async getStopwords() {
 | 
			
		||||
    const response = await this.socket.emitWithAck('get_stopwords');
 | 
			
		||||
 | 
			
		||||
    if (response.status != 200) {
 | 
			
		||||
      throw new Error(`[${response.status}] ${response.statusText}`);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return response.body;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  async createShareLink(id, expirationDate, roleName) {
 | 
			
		||||
    const response = await this.socket.emitWithAck('create_share_link', id, expirationDate, roleName);
 | 
			
		||||
 | 
			
		||||
    if (response.status != 200) {
 | 
			
		||||
      throw new Error(`[${response.status}] ${response.statusText}`);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return response.body;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  async setIsPublic(id, newValue) {
 | 
			
		||||
    const response = await this.socket.emitWithAck('set_is_public', id, newValue);
 | 
			
		||||
 | 
			
		||||
    if (response.status != 200) {
 | 
			
		||||
      throw new Error(`[${response.status}] ${response.statusText}`);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return response.body;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
@@ -7,7 +7,6 @@ nopaque.corpus_analysis.StaticVisualizationExtension = class StaticVisualization
 | 
			
		||||
      stopwords: undefined,
 | 
			
		||||
      originalStopwords: {},
 | 
			
		||||
      stopwordCache: {},
 | 
			
		||||
      promises: {getStopwords: undefined},
 | 
			
		||||
      tokenSet: new Set()
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
@@ -73,22 +72,11 @@ nopaque.corpus_analysis.StaticVisualizationExtension = class StaticVisualization
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  getStopwords() {
 | 
			
		||||
    this.data.promises.getStopwords = new Promise((resolve, reject) => {
 | 
			
		||||
      nopaque.requests.corpora.entity.getStopwords()
 | 
			
		||||
        .then((response) => {
 | 
			
		||||
          response.json()
 | 
			
		||||
            .then((json) => {
 | 
			
		||||
              this.data.originalStopwords = structuredClone(json);
 | 
			
		||||
              this.data.stopwords = structuredClone(json);
 | 
			
		||||
              resolve(this.data.stopwords);
 | 
			
		||||
            })
 | 
			
		||||
            .catch((error) => {
 | 
			
		||||
              reject(error);
 | 
			
		||||
            });
 | 
			
		||||
        });
 | 
			
		||||
    });
 | 
			
		||||
    return this.data.promises.getStopwords;
 | 
			
		||||
  async getStopwords() {
 | 
			
		||||
    const stopwords = await app.corpora.getStopwords();
 | 
			
		||||
    this.data.originalStopwords = structuredClone(stopwords);
 | 
			
		||||
    this.data.stopwords = structuredClone(stopwords);
 | 
			
		||||
    return stopwords;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  renderGeneralCorpusInfo() {
 | 
			
		||||
@@ -121,7 +109,7 @@ nopaque.corpus_analysis.StaticVisualizationExtension = class StaticVisualization
 | 
			
		||||
        num_unique_pos: Object.entries(corpusData.s_attrs.text.lexicon[i].freqs.pos).length,
 | 
			
		||||
        num_unique_simple_pos: Object.entries(corpusData.s_attrs.text.lexicon[i].freqs.simple_pos).length
 | 
			
		||||
      };
 | 
			
		||||
  
 | 
			
		||||
 | 
			
		||||
      textData.push(resource);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -262,7 +250,7 @@ nopaque.corpus_analysis.StaticVisualizationExtension = class StaticVisualization
 | 
			
		||||
    }
 | 
			
		||||
    return filteredData;
 | 
			
		||||
  }
 | 
			
		||||
  
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  renderFrequenciesGraphic(tokenSet) {
 | 
			
		||||
    this.data.tokenSet = tokenSet;
 | 
			
		||||
@@ -272,7 +260,7 @@ nopaque.corpus_analysis.StaticVisualizationExtension = class StaticVisualization
 | 
			
		||||
    let texts = Object.entries(corpusData.s_attrs.text.lexicon);
 | 
			
		||||
    let graphtype = document.querySelector('.frequencies-graph-mode-button.disabled').dataset.graphType;
 | 
			
		||||
    let tokenCategory = frequenciesTokenCategoryDropdownElement.firstChild.textContent.toLowerCase();
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    let graphData = this.createFrequenciesGraphData(tokenCategory, texts, graphtype, tokenSet);
 | 
			
		||||
    let graphLayout = {
 | 
			
		||||
      barmode: graphtype === 'bar' ? 'stack' : '',
 | 
			
		||||
@@ -328,7 +316,7 @@ nopaque.corpus_analysis.StaticVisualizationExtension = class StaticVisualization
 | 
			
		||||
            for (let i = 0; i < texts.length; i++) {
 | 
			
		||||
              tokenCountPerText[i] = (tokenCountPerText[i] || 0) + (texts[i][1].freqs[tokenCategory][originalId] || 0);
 | 
			
		||||
            }
 | 
			
		||||
          } 
 | 
			
		||||
          }
 | 
			
		||||
          let data = {
 | 
			
		||||
            x: textTitles,
 | 
			
		||||
            y: tokenCountPerText,
 | 
			
		||||
@@ -353,7 +341,7 @@ nopaque.corpus_analysis.StaticVisualizationExtension = class StaticVisualization
 | 
			
		||||
    stopwordLanguageChipList.innerHTML = '';
 | 
			
		||||
    userStopwordListContainer.innerHTML = '';
 | 
			
		||||
    stopwordInputField.value = '';
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    // Render stopword language selection. Set english as default language. Filter out user_stopwords.
 | 
			
		||||
    if (stopwordLanguageSelection.children.length === 0) {
 | 
			
		||||
      Object.keys(stopwords).forEach(language => {
 | 
			
		||||
@@ -379,7 +367,7 @@ nopaque.corpus_analysis.StaticVisualizationExtension = class StaticVisualization
 | 
			
		||||
    // Render english stopwords as default ...
 | 
			
		||||
    let selectedLanguage = document.querySelector('#stopword-language-selection').value;
 | 
			
		||||
    this.renderStopwordLanguageChipList(selectedLanguage, stopwords[selectedLanguage]);
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    // ... or render selected language stopwords.
 | 
			
		||||
    stopwordLanguageSelection.addEventListener('change', (event) => {
 | 
			
		||||
      this.renderStopwordLanguageChipList(event.target.value, stopwords[event.target.value]);
 | 
			
		||||
@@ -402,7 +390,7 @@ nopaque.corpus_analysis.StaticVisualizationExtension = class StaticVisualization
 | 
			
		||||
 | 
			
		||||
    // Initialize Materialize components.
 | 
			
		||||
    M.Chips.init(
 | 
			
		||||
        stopwordInputField, 
 | 
			
		||||
        stopwordInputField,
 | 
			
		||||
        {
 | 
			
		||||
          placeholder: 'Add stopwords',
 | 
			
		||||
          onChipAdd: (event) => {
 | 
			
		||||
@@ -428,7 +416,7 @@ nopaque.corpus_analysis.StaticVisualizationExtension = class StaticVisualization
 | 
			
		||||
    deleteLanguageStopwordListEntriesButton.classList.toggle('disabled', stopwordLength === 0);
 | 
			
		||||
    resetLanguageStopwordListEntriesButton.classList.toggle('disabled', stopwordLength === originalStopwordListLength);
 | 
			
		||||
  }
 | 
			
		||||
  
 | 
			
		||||
 | 
			
		||||
  renderStopwordLanguageChipList(language, stopwords) {
 | 
			
		||||
    let stopwordLanguageChipList = document.querySelector('#stopword-language-chip-list');
 | 
			
		||||
    stopwordLanguageChipList.innerHTML = '';
 | 
			
		||||
 
 | 
			
		||||
@@ -5,50 +5,6 @@ nopaque.requests.corpora = {};
 | 
			
		||||
 | 
			
		||||
nopaque.requests.corpora.entity = {};
 | 
			
		||||
 | 
			
		||||
nopaque.requests.corpora.entity.delete = (corpusId) => {
 | 
			
		||||
  let input = `/corpora/${corpusId}`;
 | 
			
		||||
  let init = {
 | 
			
		||||
    method: 'DELETE'
 | 
			
		||||
  };
 | 
			
		||||
  return nopaque.requests.JSONfetch(input, init);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
nopaque.requests.corpora.entity.build = (corpusId) => {
 | 
			
		||||
  let input = `/corpora/${corpusId}/build`;
 | 
			
		||||
  let init = {
 | 
			
		||||
    method: 'POST',
 | 
			
		||||
  };
 | 
			
		||||
  return nopaque.requests.JSONfetch(input, init);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
nopaque.requests.corpora.entity.generateShareLink = (corpusId, role, expiration) => {
 | 
			
		||||
  let input = `/corpora/${corpusId}/generate-share-link`;
 | 
			
		||||
  let init = {
 | 
			
		||||
    method: 'POST',
 | 
			
		||||
    body: JSON.stringify({role: role, expiration: expiration})
 | 
			
		||||
  };
 | 
			
		||||
  return nopaque.requests.JSONfetch(input, init);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
nopaque.requests.corpora.entity.getStopwords = () => {
 | 
			
		||||
  let input = `/corpora/stopwords`;
 | 
			
		||||
  let init = {
 | 
			
		||||
    method: 'GET'
 | 
			
		||||
  };
 | 
			
		||||
  return nopaque.requests.JSONfetch(input, init);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
nopaque.requests.corpora.entity.isPublic = {};
 | 
			
		||||
 | 
			
		||||
nopaque.requests.corpora.entity.isPublic.update = (corpusId, isPublic) => {
 | 
			
		||||
  let input = `/corpora/${corpusId}/is_public`;
 | 
			
		||||
  let init = {
 | 
			
		||||
    method: 'PUT',
 | 
			
		||||
    body: JSON.stringify(isPublic)
 | 
			
		||||
  };
 | 
			
		||||
  return nopaque.requests.JSONfetch(input, init);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/*****************************************************************************
 | 
			
		||||
* Requests for /corpora/<entity>/files routes                                *
 | 
			
		||||
 
 | 
			
		||||
@@ -1,30 +0,0 @@
 | 
			
		||||
/*****************************************************************************
 | 
			
		||||
* Requests for /jobs routes                                                  *
 | 
			
		||||
*****************************************************************************/
 | 
			
		||||
nopaque.requests.jobs = {};
 | 
			
		||||
 | 
			
		||||
nopaque.requests.jobs.entity = {};
 | 
			
		||||
 | 
			
		||||
nopaque.requests.jobs.entity.delete = (jobId) => {
 | 
			
		||||
  let input = `/jobs/${jobId}`;
 | 
			
		||||
  let init = {
 | 
			
		||||
    method: 'DELETE'
 | 
			
		||||
  };
 | 
			
		||||
  return nopaque.requests.JSONfetch(input, init);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
nopaque.requests.jobs.entity.log = (jobId) => {
 | 
			
		||||
  let input = `/jobs/${jobId}/log`;
 | 
			
		||||
  let init = {
 | 
			
		||||
    method: 'GET'
 | 
			
		||||
  };
 | 
			
		||||
  return nopaque.requests.JSONfetch(input, init);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
nopaque.requests.jobs.entity.restart = (jobId) => {
 | 
			
		||||
  let input = `/jobs/${jobId}/restart`;
 | 
			
		||||
  let init = {
 | 
			
		||||
    method: 'POST'
 | 
			
		||||
  };
 | 
			
		||||
  return nopaque.requests.JSONfetch(input, init);
 | 
			
		||||
};
 | 
			
		||||
@@ -7,7 +7,7 @@ nopaque.resource_displays.CorpusDisplay = class CorpusDisplay extends nopaque.re
 | 
			
		||||
    this.displayElement
 | 
			
		||||
      .querySelector('.action-button[data-action="build-request"]')
 | 
			
		||||
      .addEventListener('click', (event) => {
 | 
			
		||||
        nopaque.requests.corpora.entity.build(this.corpusId);
 | 
			
		||||
        app.corpora.build(this.corpusId);
 | 
			
		||||
      });
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -180,7 +180,7 @@ nopaque.resource_lists.CorpusList = class CorpusList extends nopaque.resource_li
 | 
			
		||||
                window.location.reload();
 | 
			
		||||
              });
 | 
			
		||||
          } else {
 | 
			
		||||
            nopaque.requests.corpora.entity.delete(itemId);
 | 
			
		||||
            app.corpora.delete(itemId);
 | 
			
		||||
          }
 | 
			
		||||
        });
 | 
			
		||||
        modal.open();
 | 
			
		||||
@@ -276,7 +276,7 @@ nopaque.resource_lists.CorpusList = class CorpusList extends nopaque.resource_li
 | 
			
		||||
            let listItem = this.listjs.get('id', selectedItemId)[0].elm;
 | 
			
		||||
            let values = this.listjs.get('id', listItem.dataset.id)[0].values();
 | 
			
		||||
            if (values['is-owner']) {
 | 
			
		||||
              nopaque.requests.corpora.entity.delete(selectedItemId);
 | 
			
		||||
              app.corpora.delete(selectedItemId);
 | 
			
		||||
            } else {
 | 
			
		||||
              nopaque.requests.corpora.entity.followers.entity.delete(selectedItemId, currentUserId);
 | 
			
		||||
              setTimeout(() => {
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user