void LYGithubManager::getIssues(LYGithubManager::IssuesFilter filter, LYGithubManager::IssuesState state, LYGithubManager::IssuesSort sort, LYGithubManager::IssuesDirection direction, int page){
	if(!isAuthenticated() || repository_.isEmpty() || getIssuesReply_)
		return;

	LYGithubProductBacklogStatusLog::statusLog()->appendStatusMessage("Starting getIssues request");

	fullIssuesReply_.clear();
	QNetworkRequest request;

	QString issuesURL = "https://api.github.com/repos/"+repository_+"/issues";
	QString issuesOptions = "?";
	issuesOptions.append("filter=");
	switch(filter){
	case LYGithubManager::IssuesFilterAssigned:
		issuesOptions.append("assigned&");
		break;
	case LYGithubManager::IssuesFilterCreated:
		issuesOptions.append("created&");
		break;
	case LYGithubManager::IssuesFilterMentioned:
		issuesOptions.append("mentioned&");
		break;
	case LYGithubManager::IssuesFilterSubscribed:
		issuesOptions.append("subscribed&");
		break;
	case LYGithubManager::IssuesFilterAll:
		issuesOptions.append("all&");
		break;
	default:
		issuesOptions.append("all&");
	}
	issuesOptions.append("state=");
	switch(state){
	case LYGithubManager::IssuesStateOpen:
		issuesOptions.append("open&");
		break;
	case LYGithubManager::IssuesStateClosed:
		issuesOptions.append("closed&");
		break;
	default:
		issuesOptions.append("open&");
	}
	issuesOptions.append("sort=");
	switch(sort){
	case LYGithubManager::IssuesSortCreated:
		issuesOptions.append("created&");
		break;
	case LYGithubManager::IssuesSortUpdated:
		issuesOptions.append("updated&");
		break;
	case LYGithubManager::IssuesSortComments:
		issuesOptions.append("comments&");
		break;
	}
	issuesOptions.append("direction=");
	switch(direction){
	case LYGithubManager::IssuesDirectionAscending:
		issuesOptions.append("asc&");
		break;
	case LYGithubManager::IssuesDirectionDescending:
		issuesOptions.append("desc&");
		break;
	}
	issuesOptions.append(QString("page=%1&").arg(page));
	// Above per_page=45 Qt seems to freak out for some reason.
	// The qjson parser freaks out if the string coming back is too big it seems. Tried some testing and it was inconclusive, it managed a QByteArray of 149904 but died after one of 118460.
	// Keeping this count lower and making sure there aren't ridiculously big comments is the solution right now.
	issuesOptions.append("per_page=30");
	lastGetIssuesRequest_ = issuesURL+issuesOptions;
	request.setUrl(QUrl(issuesURL+issuesOptions));

	QString userInfo = userName_+":"+password_;
	QByteArray userData = userInfo.toLocal8Bit().toBase64();
	QString headerData = "Basic " + userData;
	request.setRawHeader("Authorization", headerData.toLocal8Bit());

	getIssuesReply_ = manager_->get(request);
	connect(getIssuesReply_, SIGNAL(readyRead()), this, SLOT(onIssuesReturned()));
}
Beispiel #2
0
void AMGithubManager::getIssues(AMGithubManager::IssuesFilter filter, AMGithubManager::IssuesState state, AMGithubManager::IssuesSort sort, AMGithubManager::IssuesDirection direction){
	if(!isAuthenticated() || repository_.isEmpty() || getIssuesReply_)
		return;
	QNetworkRequest request;

	QString issuesURL = "https://api.github.com/repos/"+repository_+"/issues";
	QString issuesOptions = "?";
	switch(filter){
	issuesOptions.append("filter=");
	case AMGithubManager::IssuesFilterAssigned:
		issuesOptions.append("assigned&");
		break;
	case AMGithubManager::IssuesFilterCreated:
		issuesOptions.append("created&");
		break;
	case AMGithubManager::IssuesFilterMentioned:
		issuesOptions.append("mentioned&");
		break;
	case AMGithubManager::IssuesFilterSubscribed:
		issuesOptions.append("subscribed&");
		break;
	}
	switch(state){
	issuesOptions.append("state=");
	case AMGithubManager::IssuesStateOpen:
		issuesOptions.append("open&");
		break;
	case AMGithubManager::IssuesStateClosed:
		issuesOptions.append("closed&");
		break;
	}
	switch(sort){
	issuesOptions.append("sort=");
	case AMGithubManager::IssuesSortCreated:
		issuesOptions.append("created&");
		break;
	case AMGithubManager::IssuesSortUpdated:
		issuesOptions.append("updated&");
		break;
	case AMGithubManager::IssuesSortComments:
		issuesOptions.append("comments&");
		break;
	}
	switch(direction){
	issuesOptions.append("direction=");
	case AMGithubManager::IssuesDirectionAscending:
		issuesOptions.append("asc");
		break;
	case AMGithubManager::IssuesDirectionDescending:
		issuesOptions.append("desc");
		break;
	}
	request.setUrl(QUrl(issuesURL+issuesOptions));

	QString userInfo = userName_+":"+password_;
	QByteArray userData = userInfo.toLocal8Bit().toBase64();
	QString headerData = "Basic " + userData;
	request.setRawHeader("Authorization", headerData.toLocal8Bit());

	getIssuesReply_ = manager_->get(request);
	connect(getIssuesReply_, SIGNAL(readyRead()), this, SLOT(onIssuesReturned()));
}
void LYGithubManager::onIssuesReturned(){

	QList<QByteArray> headerList = getIssuesReply_->rawHeaderList();
	for(int x = 0; x < headerList.count(); x++){
		if(headerList.at(x) == "Link" && lastPageNumber_ == -1){
			QString linkHeader = getIssuesReply_->rawHeader(headerList.at(x));
			int lastPageNumber = -1;
			int nextPageNumber = -1;
			QStringList linkHeaderItems = linkHeader.split(',');
			for(int y = 0; y < linkHeaderItems.count(); y++){
				if(linkHeaderItems.at(y).contains("; rel=\"last\""))
					lastPageNumber = pageNumberFromURLString(linkHeaderItems.at(y));
				if(linkHeaderItems.at(y).contains("; rel=\"next\""))
					nextPageNumber = pageNumberFromURLString(linkHeaderItems.at(y));
			}

			lastPageNumber_ = lastPageNumber;
		}
	}

	int currentPageNumber = -1;
	if(lastPageNumber_ != -1)
		currentPageNumber = pageNumberFromURLString(lastGetIssuesRequest_);

	QJson::Parser parser;
	QVariant githubFullReply = parser.parse(getIssuesReply_->readAll());
	bool doEmit = false;
	QList<QVariantMap> localRetVal;
	QVariantMap oneIssue;
	if(githubFullReply.canConvert(QVariant::List)){
		QVariantList githubListReply = githubFullReply.toList();
		if(githubListReply.at(0).canConvert(QVariant::Map)){
			if((lastPageNumber_ == -1) || (currentPageNumber == lastPageNumber_) )
				doEmit = true;
			for(int x = 0; x < githubListReply.count(); x++){
				oneIssue = githubListReply.at(x).toMap();
				localRetVal.append(oneIssue);
			}
		}
	}

	fullIssuesReply_.append(localRetVal);

	disconnect(getIssuesReply_, 0);
	getIssuesReply_->deleteLater();
	getIssuesReply_ = 0;

	if((lastPageNumber_ != -1) && (currentPageNumber != lastPageNumber_)){

		QNetworkRequest request;

		QString currentPageNumberString = QString("&page=%1").arg(currentPageNumber);
		QString nextPageNumberString = QString("&page=%1").arg(currentPageNumber+1);
		lastGetIssuesRequest_.replace(currentPageNumberString, nextPageNumberString);
		request.setUrl(QUrl(lastGetIssuesRequest_));

		QString userInfo = userName_+":"+password_;
		QByteArray userData = userInfo.toLocal8Bit().toBase64();
		QString headerData = "Basic " + userData;
		request.setRawHeader("Authorization", headerData.toLocal8Bit());

		LYGithubProductBacklogStatusLog::statusLog()->appendStatusMessage(QString("Processed page %1 of %2 for getIssues request").arg(currentPageNumber).arg(lastPageNumber_));

		getIssuesReply_ = manager_->get(request);
		connect(getIssuesReply_, SIGNAL(readyRead()), this, SLOT(onIssuesReturned()));
		return;
	}

	if(doEmit){
		LYGithubProductBacklogStatusLog::statusLog()->appendStatusMessage("Processed final getIssues request");

		lastPageNumber_ = -1;
		emit issuesReturned(fullIssuesReply_);
		return;
	}
	LYGithubProductBacklogStatusLog::statusLog()->appendStatusMessage("Something went wrong in getIssues request");
}