-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.js
136 lines (116 loc) · 4.51 KB
/
index.js
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
131
132
133
134
135
136
// Importieren von HTTPS, Express und dotenv
const https = require('https');
const express = require('express');
require('dotenv').config(); // Laden der Umgebungsvariablen aus der .env Datei
// Initialisieren der Express-Anwendung
const app = express();
const port = 3000; // Definieren des Ports, auf dem der Server Anfragen annimmt
// Optionen für die HTTPS-Anfrage
const options = {
hostname: 'api.github.com', // Hostname der API
method: 'GET', // HTTP-Methode
headers: {
'User-Agent': 'devskillfinder', // Erforderlich von der GitHub API
'Authorization': `token ${process.env.GITHUB_TOKEN}` // GitHub-Token aus den Umgebungsvariablen laden
}
};
// Funktion zum Abrufen von Daten von einer URL
function fetchData(url) {
return new Promise((resolve, reject) => {
// Erstellen der HTTPS-Anfrage
const req = https.request(url, options, (res) => {
let data = ''; // Variable zum Akkumulieren der Antwortdaten
// Event-Listener für den Empfang von Datenstücken
res.on('data', (chunk) => {
data += chunk; // Jedes empfangene Datenstück hinzufügen
});
// Event-Listener für das Ende der Datenübertragungs
res.on('end', () => {
try {
const parsedData = JSON.parse(data); // Parsen der akkumulierten Daten als JSON
resolve(parsedData); // Promise mit den geparsten Daten auflösen
} catch (error) {
reject(error); // Bei Fehlern beim Parsen das Promise ablehnen
}
});
});
// Event-Listener für Fehler bei der Anfrage
req.on('error', (err) => {
reject(err); // Promise bei einem Fehler ablehnen
});
req.end(); // Beenden der Anfrage
});
}
// Funktion zum Abrufen der Mitglieder der codecentric-Organisation
async function fetchOrganizationMembers() {
const membersUrl = 'https://api.github.com/orgs/codecentric/members';
return fetchData(membersUrl); // Verwenden der fetchData Funktion, um die Mitglieder abzurufen
}
// Funktion zum Abrufen der Repositories eines spezifischen Nutzers
async function fetchUserRepositories(login) {
const repositoriesUrl = `https://api.github.com/users/${login}/repos`;
return fetchData(repositoriesUrl); // Verwenden der fetchData Funktion, um die Repositories abzurufen
}
// Funktion zum Abrufen der Programmiersprachen eines spezifischen Repositories
async function fetchRepositoryLanguages(login, repo) {
const repositoriesUrl = `https://api.github.com/repos/${login}/${repo}`;
const repositoryData = await fetchData(repositoriesUrl);
const languagesUrl = repositoryData.languages_url;
return fetchData(languagesUrl); // Verwenden der fetchData Funktion, um die Programmiersprachen abzurufen
}
// Funktion zum Abrufen aller Programmiersprachen eines Nutzers
async function fetchUserLanguages(login) {
const repos = await fetchUserRepositories(login);
const languages = new Set();
for (const repo of repos) {
const repoLanguages = await fetchRepositoryLanguages(login, repo.name);
for (const lang in repoLanguages) {
languages.add(lang);
}
}
return Array.from(languages);
}
// Funktion zum Filtern der Mitglieder nach einer Programmiersprache
async function fetchMembersByLanguage(language) {
const members = await fetchOrganizationMembers();
const matchingMembers = [];
for (const member of members) {
const userLanguages = await fetchUserLanguages(member.login);
if (userLanguages.includes(language)) {
matchingMembers.push(member);
}
}
return matchingMembers;
}
// Definieren der Route für die Mitglieder der Organisation
app.get('/members', async (req, res) => {
try {
const members = await fetchOrganizationMembers();
res.json(members);
} catch (error) {
res.status(500).json({ error: error.message });
}
});
// Definieren der Route für die Repositories eines Nutzers
app.get('/repos/:login', async (req, res) => {
try {
const repos = await fetchUserRepositories(req.params.login);
res.json(repos);
} catch (error) {
res.status(500).json({ error: error.message });
}
});
// Definieren der Route für die Programmiersprachen eines Repositories
app.get('/languages/:login/:repo', async (req, res) => {
try {
const languages = await fetchRepositoryLanguages(req.params.login, req.params.repo);
console.log(`User ${req.params.login} languages:`, languages);
res.json(languages);
} catch (error) {
res.status(500).json({ error: error.message });
}
});
// Starten des Servers
app.listen(port, () => {
console.log(`Server is running on http://localhost:${port}`);
});