Paths and queries

This commit is contained in:
Dan Vanderkam 2018-06-15 14:08:34 -04:00
parent 3066651251
commit f692f48baa
5 changed files with 323 additions and 129 deletions

File diff suppressed because one or more lines are too long

View File

@ -22,6 +22,10 @@ let routes = {
'/new/project': 'addProject', '/new/project': 'addProject',
'/:owner/:name': 'milestones', '/:owner/:name': 'milestones',
'/:owner/:name/:milestone': 'chart', '/:owner/:name/:milestone': 'chart',
'/:owner/:name/projects': 'githubProjects',
'/:owner/projects': 'orgProjects',
'/:owner/project/:project': 'orgProjectChart',
'/:owner/:name/project/:project': 'projectChart',
'/demo': 'demo' '/demo': 'demo'
}; };
@ -95,6 +99,13 @@ export default React.createClass({
return <MilestonesPage owner={owner} name={name} />; return <MilestonesPage owner={owner} name={name} />;
}, },
// Show projects (i.e. boards) for a repo.
projects(owner, name) {
document.title = `${owner}/${name} projects`;
process.nextTick(() => actions.emit('projects.load', { owner, name }));
return <GitHubProjectsPage owner={owner} name={name} />;
},
// Show a project milestone chart. // Show a project milestone chart.
chart(owner, name, milestone) { chart(owner, name, milestone) {
document.title = `${owner}/${name}/${milestone}`; document.title = `${owner}/${name}/${milestone}`;
@ -102,6 +113,13 @@ export default React.createClass({
return <ChartPage owner={owner} name={name} milestone={milestone} />; return <ChartPage owner={owner} name={name} milestone={milestone} />;
}, },
// Show a GitHub project (i.e. board) chart.
projectChart(owner, name, project) {
document.title = `${owner}/${name}/${project}`;
process.nextTick(() => actions.emit('projects.load', { owner, name, milestone }));
return <ProjectChartPage owner={owner} name={name} project={project} />;
},
// Add a project. // Add a project.
addProject() { addProject() {
document.title = 'Add a project'; document.title = 'Add a project';

View File

@ -0,0 +1,84 @@
// GitHub GraphQL API queries.
export default {
allProjectsForOrg: `
query($login: String!) {
organization(login: $login) {
projects(first: 100) {
nodes {
name
number
createdAt
}
}
}
}
`,
allProjectsForRepo: `
query($owner: String!, $name: String!) {
repository(owner: $owner, name: $name){
projects(first: 100, states: OPEN) {
nodes {
name
number
createdAt
}
}
}
}
`,
oneProject: `
query($owner: String!, $name: String!, $project_number: Int!) {
repository(owner: $owner, name: $name) {
project(number: $project_number) {
createdAt
closedAt
columns(first: 10) {
nodes {
name
cards(first: 100) {
nodes {
content {
... on Issue {
number
title
createdAt
state
}
}
}
}
}
}
}
}
}
`,
oneOrgProject: `
query($login: String!, $project_number: Int!) {
organization(login: $login) {
project(number: $project_number) {
createdAt
closedAt
columns(first: 10) {
nodes {
name
cards(first: 100) {
nodes {
content {
... on Issue {
number
title
createdAt
state
}
}
}
}
}
}
}
}
}
`
};

View File

@ -4,6 +4,7 @@ import superagent from 'superagent';
import actions from '../../actions/appActions.js'; import actions from '../../actions/appActions.js';
import config from '../../../config.js'; import config from '../../../config.js';
import graphqlQueries from './graphql.js';
// Custom JSON parser. // Custom JSON parser.
superagent.parse = { superagent.parse = {
@ -76,45 +77,6 @@ export default {
'headers': headers(token) 'headers': headers(token)
}, defaults.github); }, defaults.github);
const query = `query {
repository(owner:"twbs", name:"bootstrap"){
project(number: 14) {
createdAt
closedAt
columns(first: 10) {
nodes {
name
cards(first: 100) {
nodes {
content {
... on Issue {
number
title
createdAt
state
}
}
}
}
}
}
}
}
}
`;
let graphqlReq = _.defaults({
path: '/graphql',
body: JSON.stringify({query}),
headers: {
'Authorization': `bearer ${token}`,
},
method: 'POST',
}, defaults.github);
console.log(graphqlReq);
request(graphqlReq, (err, result) => {
console.log('graphql response!', err, result);
});
request(data, function(err, data) { request(data, function(err, data) {
console.log('oneMilestone', data); console.log('oneMilestone', data);
cb(err, data); cb(err, data);
@ -131,8 +93,66 @@ export default {
}, defaults.github); }, defaults.github);
return request(data, cb); return request(data, cb);
} },
allProjects: (user, { owner, name }, cb) => {
let token = (user && user.credential != null) ? user.credential.accessToken : null;
let data = _.defaults({
path: '/graphql',
body: JSON.stringify(name ? {
query: graphqlQueries.allProjectsForRepo,
variables: {
owner,
name
}
} : {
query: graphqlQueries.allProjectsForOrg,
variables: {
login: owner
}
}),
headers: {
'Authorization': `bearer ${token}`,
},
method: 'POST',
}, defaults.github);
request(data, (err, result) => {
console.log('graphql response!', err, result);
cb(err, result);
});
},
oneProject: (user, { owner, name, project }, cb) => {
let token = (user && user.credential != null) ? user.credential.accessToken : null;
let data = _.defaults({
path: '/graphql',
body: JSON.stringify(name ? {
query: graphqlQueries.allProjectsForRepo,
variables: {
owner,
name,
project
}
} : {
query: graphqlQueries.oneOrgProject,
variables: {
owner,
project
}
}),
headers: {
'Authorization': `bearer ${token}`,
},
method: 'POST',
}, defaults.github);
request(data, (err, result) => {
console.log('graphql response!', err, result);
// Filter down to cards that are issues (as opposed to notes) here?
cb(err, result);
});
}
}; };
// Make a request using SuperAgent. // Make a request using SuperAgent.
@ -150,7 +170,6 @@ let request = ({ protocol, host, method, path, query, headers, body }, cb) => {
let req = method === 'POST' ? superagent.post(url) : superagent.get(url); let req = method === 'POST' ? superagent.post(url) : superagent.get(url);
// Add headers. // Add headers.
_.each(headers, (v, k) => { req.set(k, v); }); _.each(headers, (v, k) => { req.set(k, v); });
console.log(`Requesting ${url}`);
// Timeout for requests that do not finish... see #32. // Timeout for requests that do not finish... see #32.
let ms = config.request.timeout; let ms = config.request.timeout;

View File

@ -76,6 +76,8 @@ class ProjectsStore extends Store {
'owner': args.owner, 'owner': args.owner,
'name': args.name 'name': args.name
}, args.milestone, true); // notify as well }, args.milestone, true); // notify as well
} else if ('project' in args) {
// ...
} else { } else {
// For a single project. // For a single project.
_.find(this.get('list'), (obj) => { _.find(this.get('list'), (obj) => {