|
|
-
- var nodes;
-
- var edges;
-
-
- var options = {
- nodes: {
- borderWidth:4,
- size:30,
- color: {
- border: '#222222',
- background: '#666666'
- },
- font:{color:'#eeeeee'}
- },
- edges: {
- color: 'lightgray'
- }
- };
-
-
- /**
- * Checks if a user is a node in the graph
- *
- * @param userID
- * @returns {boolean}
- */
- function alreadyInGraph(userID)
- {
- for(var i = 0; i < nodes.length; i++)
- {
- if(nodes[i].id === userID)
- {
- return true;
- }
- }
- return false;
- }
-
-
- /**
- * adds a person to the nodes list
- *
- * @param profileData
- */
- function addSelfAsOrg(orgData) {
- nodes.push( {
- id:orgData.id,
- name:orgData.login,
- image:orgData.avatar_url
- });
- }
-
- function addSelfAsRepo(repoData) {
- nodes.push( {
- id:repoData.id,
- name:repoData.name,
- image:repoData.avatar_url
- });
- console.log(repoData.name);
- }
-
-
- /**
- * Adds the followers/following of a person
- * to the graph
- *
- * @param username
- * @param apiPath
- * @returns {Promise<any>}
- */
- function addRepos(orgName, apiPath, page)
- {
- console.log(orgName + " page=" + page);
- updateProgress();
- return new Promise(function(resolve, reject) {
- queryAPIByOrg(apiPath + "?page=" + page, orgName, function(data) {
- console.log(data);
- console.log(data.length);
- var prom = [];
- for(var i = 0; i < data.length; i++) {
- if(!alreadyInGraph(data[i].id)) {
- prom.push(addRepoToGraph(data[i]));
- }
- }
- Promise.all(prom).then( () => {
- if(data.length === 30) {
- addRepos(orgName, apiPath, page+ 1).then(function() {
- resolve();
- })
- }
- else {
- resolve();
- }
- })
- },
- function(error) {
- reject(error);
- })
- });
- }
-
-
- /**
- * Greedy function which checks to see if a edge is in the graphs
- *
- * @param id1
- * @param id2
- * @returns {boolean}
- */
- function edgeInGraph(id1, id2)
- {
- console.log("edge check");
- for(var i = 0;i < edges.length; i++)
- {
- if(edges[i].from === id1 && edges[i].to === id2)
- {
- return true;
- }
- if(edges[i].to === id1 && edges[i].from === id2)
- {
- return true;
- }
- }
- return false;
- }
-
-
- /**
- * Adds a connection to the graph
- *
- * @param person1
- * @param person2
- */
- function addConnection(person1, person2)
- {
- if(person1.id !== person2.id)
- {
- if(alreadyInGraph(person2.id) && !edgeInGraph(person1.id, person2.id))
- {
- edges.push(
- {
- from: person1.id,
- to: person2.id
- });
- }
- }
- }
-
-
- function processConnections(user, apiPoint, page)
- {
- updateProgress();
- return new Promise(function(resolve, reject)
- {
- queryAPIByUser(apiPoint + "?page=" + page, user.name,
- function(data)
- {
- for(var i = 0; i < data.length; i++)
- {
- addConnection(user, data[i])
- }
- if(data.length === 30)
- {
- processConnections(user, apiPoint, page + 1).then(function()
- {
- resolve();
- });
- }
- else
- {
- resolve();
- }
- }, function(error)
- {
- console.log(error);
- resolve();
- })
- })
- }
-
-
- /**
- * Processes all the connections of a user and adds them to the graph
- *
- * @param user has .id and .name
- * @returns {Promise<any>}
- */
- function processUserConnections(user)
- {
- return new Promise(function(resolve, reject)
- {
-
- processConnections(user, API_FOLLOWING, 1).then(function()
- {
- processConnections(user, API_FOLLOWERS, 1).then(function()
- {
- resolve();
- })
- })
- });
- }
-
-
- /**
- * Creates connections between all the nodes in
- * the graph.
- *
- * @returns {Promise<any>}
- */
- function createConnections()
- {
- return new Promise(function(resolve, reject)
- {
- var prom = [];
- for(var i = 0; i < nodes.length; i++)
- {
- prom.push(processUserConnections(nodes[i]));
- }
-
- Promise.all(prom).then(function()
- {
- resolve();
- }).catch(function(error)
- {
- console.log(error);
- resolve();
- });
- });
- }
-
-
- var total = 1;
- var indexed = 0;
- var progressID;
-
-
- function updateProgress()
- {
- indexed++;
-
- var percent = parseInt((indexed/total)*100);
-
- $("#" + progressID).html("<div class=\"progress\">\n" +
- " <div class=\"progress-bar progress-bar-striped progress-bar-animated\" role=\"progressbar\" style=\"width: " + percent + "%\" aria-valuenow=\"" + percent + "\" aria-valuemin=\"0\" aria-valuemax=\"100\"></div>\n" +
- "</div>");
-
- console.log();
- }
-
- /**
- * Adds the base person to the graph.
- *
- * @param username
- * @returns {Promise<any>}
- */
- function addOrgToGraph(orgname) {
- return new Promise(function(resolve, reject) {
- queryAPIByOrg("", orgname, function(data) {
- total = (data.public_repos) * 2;
- addSelfAsOrg(data);
- resolve();
- },
- function(error) {
- reject(error);
- });
-
- });
- }
-
- function addRepoToGraph(repo) {
- return new Promise(function(resolve, reject) {
- console.log("in repo");
- console.log(repo);
- addSelfAsRepo(repo);
- resolve();
- /*
- queryAPIByRepo(repo.name, orgname, function(data) {
- //total = (data.followers + data.following) * 2;
- addSelfAsRepo(data);
- resolve();
- console.log("did it");
- },
- function(error) {
- reject(error);
- });*/
-
- });
- }
-
-
- function bringUpProfileView(id)
- {
- for(var i = 0; i < nodes.length; i++)
- {
- if(nodes[i].id === id) {
- profileGen(nodes[i].name, "profileGen");
- }
- }
- }
-
- /**
- * Creates a graph
- * @param username
- * @param containerName
- * @param graphsTitle
- */
- function createOrgRepoGraph(orgname, containerName, graphsTitle)
- {
- progressID = graphsTitle;
-
- nodes = [];
- edges = [];
- addOrgToGraph(orgname).then(function() {
- addRepos(orgname, API_REPOS,1).then(function() {
- $("#" + progressID).html("");
-
- var container = document.getElementById(containerName);
- var data = {
- nodes: nodes,
- edges: edges
- };
- var network = new vis.Network(container, data, options);
-
- network.on("click", function (params) {
- params.event = "[original event]";
- if(Number(this.getNodeAt(params.pointer.DOM)) !== NaN) {
- bringUpProfileView(Number(this.getNodeAt(params.pointer.DOM)));
- }
- });
- })
- }).catch(function(error) {
- alert("Invalid Organization");
- });
- }
|