Skip to content
Snippets Groups Projects
Commit 2185c068 authored by Simen Ørstavik Kloster-Jensen's avatar Simen Ørstavik Kloster-Jensen
Browse files

Merge branch '4-backend-graphql-api' into 'Layout'

# Conflicts:
#   package-lock.json
#   webdev-p3/src/App.tsx
parents caa75b8e ab2fe631
No related branches found
No related tags found
No related merge requests found
/node_modules
\ No newline at end of file
-----BEGIN CERTIFICATE-----
MIIFDDCCAvSgAwIBAgIIAyvLotzZfNUwDQYJKoZIhvcNAQELBQAwSTEhMB8GA1UE
AxMYNjM0M2RkZjkzMjMwNmIxM2U3ZDBkMzc1MQ4wDAYDVQQLEwVBdGxhczEUMBIG
A1UEChMLTW9uZ29EQiBJbmMwHhcNMjIxMDEwMDgyMzQ0WhcNMjMxMDEwMDkyMzQ0
WjAXMRUwEwYDVQQDDAxkZWZhdWx0X3VzZXIwggIiMA0GCSqGSIb3DQEBAQUAA4IC
DwAwggIKAoICAQCkK2uXGlnvBhjCuIEi3I+4DzHiQNROkLc3JSWtOKw1j8qAwH1M
uVt0UuuqfOUPAH0t6ND/6q2vDHudsGRjh7QkfT/y5edkrDNHOS05mdSNeeP/W3O6
aRfviPcWCJ7ftrdWN+BsVKGxMnwCp2XPZNT+MwTrVw/7S2tTMSdDznmJHw03LsXG
5vcqaZwCDzZ/f4X466q0EfogTlitwSoOzGwWg1rX/G4hH8bHeN9vMxaE1OdjKDwh
BRtFsAG+J8OpLhFnbktD9UU7707r349ySmWY5ZFO0NGRLePkMXE7q2DH+I8d9MMQ
l+H7TGVl2JGfPFPTXCAkAn9PI0LIuhafzRZiSVyLlMsPZ6nYT+kx9nk22xHFLgKL
Tbx2YvLpOrDhfcRlz1cUW/Z2owKRN0Y+sI3RtTXEGGYJMeDG1KqkQh3kV3oz8fm4
q6kTnhG0KqgAEnFNY8xJCckvXLAsj+YvbEIcE4M+AXNOmxUMmZFPbrRIF0qeaY8j
eFc98ut1VjR9N+mm7WK71b3UaWvi/iL80QAAxEAuZtoXNRoCX8XjyTCL9TTa2EqE
EOmqZhAKqpChvrHEBEQj0tOWOdbLmUJAmR+foFqHEKIEP6wDn48RRSDaQijDrBB/
ajhx5r7yJ45BUHAyAAEtB/1561qHzW1udSPpCV8gkUZF+R6sQ5sv7kJUCQIDAQAB
oyowKDAOBgNVHQ8BAf8EBAMCB4AwFgYDVR0lAQH/BAwwCgYIKwYBBQUHAwIwDQYJ
KoZIhvcNAQELBQADggIBAEurx7g1QuyhiS/J7mi7lH8YD58ucaSaS25lEL+PUVft
nu2YZLVC249ZxZuLKOVJ2e0FHJbccGe3nf6yAJ6v/vK7HNI+jXMkAXV/NGvBWneQ
+pVqzZq+w48ZaEk2WmX03C32swllu/92iSrFwXcRsaBp0N8jE/fulOBbcLDQ4Mmm
Z6CIqbwKCz75LqqjzayqB+WF34vTmJQDbK5zYYmEltbxUqaqxs4eu1v3Nej2aR86
+7QQFV82/721LcTChJZTFzaAKr1f+Iz/lDyq0+7T66aHwwu6I8v9blkIRJGz2LL4
dA+GBc0aaycNZjz4mVtontgdxmMii9/UALvEOTkFYNUKBINuWuzlbWLaQM6ml7CR
YXgntcDeofN6G/ZMFQc+jZfyRT+Y7MJ0XMVA8lDglrbRPiWetBzS2i8y03Xt7puA
r7JBHWcRw54HhsEMx4FGybeTYpwPdhM09Op9akzSJERRRXWqpRAL/ULi51q10IO6
KiurVbXAzG/xAxhjomgt4FEoUv0PSvy3Pp7I60tZtNB/16eIw3fwVdnM0gvBqSXn
gyEgVubPNG3tDFVLyiCOp0Ghj+vKJYcPACRK13rAYfX3V9P3LB2yIAUlLp5TeIY/
VopN8RTJeRcqYdGdJMP84VCaZd7FrUfeTWyVHTxIaCrFMjWiWLxIOJNRulzR7IJ7
-----END CERTIFICATE-----
-----BEGIN PRIVATE KEY-----
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
ysDmcFgHCfWA2w7RxwSkt/vwIvDp
-----END PRIVATE KEY-----
// const { MongoClient, ServerApiVersion } = require('mongodb');
// const fs = require('fs');
import { MongoClient, ServerApiVersion } from 'mongodb';
import fs from 'fs';
import fetch from 'node-fetch';
const credentials = 'X509-cert-228500106462723285.pem'
const client = new MongoClient('mongodb+srv://pokeurmom.mv5clur.mongodb.net/?authSource=%24external&authMechanism=MONGODB-X509&retryWrites=true&w=majority', {
sslKey: credentials,
sslCert: credentials,
serverApi: ServerApiVersion.v1
});
var pokemon = [];
async function run() {
try {
await client.connect();
const database = client.db("pokedex");
const collection = database.collection("pokemon");
// Gets a list of all pokemon and shows their names and next evolution
// var pokemon = await collection.find({}).toArray();
// for (var i = 0; i < pokemon.length; i++) {
// if (pokemon[i]['next-evo']) {
// try {
// var evolutions = pokemon[i]['next-evo']
// if (evolutions.length > 1) {
// evolutions = evolutions.map(evo => {return pokemon[evo]['name']})
// console.log(pokemon[i]['name'] + ' evolves into ' + evolutions.join(', '));
// } else{
// console.log(pokemon[i]['name'] + ' evolves into ' + pokemon[evolutions]['name']);
// }
// } catch (error) {
// console.log(error)
// console.log(pokemon[i]['name'] + " evolves into " + pokemon[i]['next-evo']);
// }
// } else{
// console.log(pokemon[i]['name']);
// }
// }
// Gets data from the pokeapi and generates a new pokemon object
// console.log("Fetching data from PokeAPI...");
// for (let i = 1; i <= speciesNum; i++) {
// var pokemonJSON = {};
// var species = await fetch("https://pokeapi.co/api/v2/pokemon-species/" + i).then(response => response.json()).catch(error =>{
// console.log("Error fetching species " + i);
// console.log("Retrying...");
// i--;
// });
// if (!species) {
// continue;
// }
// pokemonJSON["poke-index"] = species.id;
// pokemonJSON["name"] = species.name;
// pokemonJSON["next-evo"] = [];
// pokemonJSON["prev-evo"] = [];
// pokemonJSON["img"] = species.name + ".png"
// var detailsURL;
// for (let j = 0; j < species.varieties.length; j++) {
// if (species.varieties[j].is_default) {
// detailsURL = species.varieties[j].pokemon.url;
// }
// }
// if (!detailsURL) {
// detailsURL = species.varieties[0].pokemon.url;
// }
// pokemonJSON["types"] = [];
// var details = await fetch(detailsURL).then(response => response.json()).catch(error => {
// console.log("Error fetching details " + i);
// console.log("Retrying...");
// i--;
// });
// if (!details) {
// continue;
// }
// for (let j = 0; j < details.types.length; j++) {
// pokemonJSON["types"].push(details.types[j].type.name);
// }
// pokemonJSON["upvotes"] = 0;
// pokemonJSON["downvotes"] = 0;
// if (species.evolves_from_species) {
// var prevEvo = await fetch(species.evolves_from_species.url).then(response => response.json()).catch(error => {
// console.log("Error fetching previous evolution " + i);
// console.log("Retrying...");
// i--;
// });
// if (!prevEvo) {
// continue;
// }
// pokemonJSON["prev-evo"].push(prevEvo.id);
// }
// console.log("Progress:", i, "/", speciesNum);
// pokemon.push(pokemonJSON);
// }
// console.log("Finished fetching data from PokeAPI!");
// Reads the pokemon data from a json file
// console.log("Reading data from JSON file...");
// pokemon = JSON.parse(fs.readFileSync('pokemon.json', 'utf8'));
// console.log("Finished reading data from JSON file!");
// Fixes evolution data
// console.log("Fixing evolution data...");
// for (let i = 0; i < pokemon.length; i++) {
// if (pokemon[i]["prev-evo"].length > 0) {
// var prev = pokemon.find(poke => pokemon[i]["prev-evo"].includes(poke["poke-index"]));
// if (prev) {
// prev["next-evo"].push(pokemon[i]["poke-index"]);
// console.log("Assigned", pokemon[i]["name"], "as the evolution of", prev["name"]);
// } else {
// console.log("Failed to assign evolutiion");
// console.log("Tried to assign " + pokemon[i]["poke-index"] + " as the next evolution of " + pokemon[i]["prev-evo"]);
// }
// }
// }
// for (let i = 0; i < pokemon.length; i++) {
// if (pokemon[i]["next-evo"].length == 0) {
// pokemon[i]["next-evo"] = null;
// }
// if (pokemon[i]["prev-evo"].length == 0) {
// pokemon[i]["prev-evo"] = null;
// }
// }
// console.log("Finished fixing evolution data!");
// Writes the pokemon data to a json file
// console.log("Writing to file...");
// fs.writeFile("pokemon.json", JSON.stringify(pokemon), function(err) {
// if (err) {
// return console.log(err);
// }
// console.log("Finished writing to file!");
// });
// Inserts the pokemon data into the database
// console.log("Inserting data into database...");
// const result = await collection.insertMany(pokemon);
// console.log("Finished inserting data into database!");
// console.log(`${result.insertedCount} documents were inserted`);
// console.log(docCount);
// perform actions using client
} finally {
// Ensures that the client will close when you finish/error
await client.close();
}
}
run().catch(console.dir);
This diff is collapsed.
{
"name": "backend",
"version": "0.1.0",
"description": "backend for pokeurmom",
"type": "module",
"scripts": {
"test": "node test.js",
"start": "node index.js",
"dev": "nodemon server.js"
},
"author": "",
"license": "ISC",
"main": "server.js",
"dependencies": {
"@graphql-tools/schema": "^9.0.4",
"cors": "^2.8.5",
"express": "^4.18.2",
"express-graphql": "^0.12.0",
"graphql": "^14.7.0",
"mongodb": "4.10",
"node-fetch": "^3.2.10"
},
"devDependencies": {
"nodemon": "^2.0.20"
}
}
This diff is collapsed.
import express from 'express'
import cors from 'cors'
import { graphqlHTTP } from 'express-graphql'
import { buildSchema } from 'graphql'
import { MongoClient } from 'mongodb';
const client = new MongoClient('mongodb://admin:admin@129.241.104.157:27017', {
auth: {
username: 'admin',
password: 'admin'
}
});
var collection = undefined;
run()
async function run(){
try {
await client.connect();
console.log("Connected correctly to server");
const database = client.db("pokedex", {authSource: "admin"});
collection = database.collection("pokemon");
} catch (err) {
console.log(err.stack);
}
}
// Construct a schema, using GraphQL schema language
var schema = buildSchema(`
type Pokemon {
pokeIndex: Int
name: String
nextEvo: [Int]
prevEvo: [Int]
img: String
types: [String]
upvotes: Int
downvotes: Int
}
type User {
username: String
team: [Pokemon]
upvotes: [Int]
downvotes: [Int]
}
type Query {
pokemon(pokeIndex: Int, name: String) : Pokemon
pokemonList(name:String, type1: String, type2: String) : [Pokemon]
getUser(username: String!) : User
addUser(username: String!) : User
addPokemonToTeam(username: String!, pokeIndex: Int!) : User
removePokemonFromTeam(username: String!, pokeIndex: Int!) : User
getUpvotes(username: String!) : [Pokemon]
getDownvotes(username: String!) : [Pokemon]
addUpvote(pokeIndex: Int!, username: String!) : Pokemon
removeUpvote(pokeIndex: Int!, username: String!) : Pokemon
addDownvote(pokeIndex: Int!, username: String!) : Pokemon
removeDownvote(pokeIndex: Int!, username: String!) : Pokemon
}
`);
// The root provides a resolver function for each API endpoint
var root = {
pokemon: ({pokeIndex, name}) => {
if (pokeIndex) {
return collection.findOne({pokeIndex: pokeIndex})
} else if (name) {
return collection.findOne({name: name})
} else {
return collection.findOne({name: "amoonguss"})
}
},
pokemonList: ({name, type1, type2}) => {
// const nameString = /name/i;
if (!name){
name = "";
}
if (type2) {
if (type1 === type2) {
return collection.find({$and: [{name: {$regex: name, $options: "$i"}}, {types: [type1]}]}).toArray().then((pokemon) => {
return pokemon;
});
} else {
return collection.find({$and: [{name: {$regex: name, $options: "$i"}}, {types: type1}, {types: type2}]}).toArray().then((pokemon) => {
return pokemon;
});
}
} else if (type1) {
return collection.find({$and: [{name: {$regex: name, $options: "$i"}},{types: type1}]}).toArray().then((pokemon) => {
return pokemon;
});
} else {
return collection.find({name: {$regex: name, $options: "$i"}}).toArray().then((pokemon) => {
return pokemon;
});
}
},
addUpvote: ({pokeIndex}) => {
return collection.findOneAndUpdate({pokeIndex: pokeIndex}, {$inc: {upvotes: 1}}, {returnOriginal: false}).then((pokemon) => {
return pokemon.value;
});
},
removeUpvote: ({pokeIndex}) => {
return collection.findOneAndUpdate({pokeIndex: pokeIndex}, {$inc: {upvotes: -1}}, {returnOriginal: false}).then((pokemon) => {
return pokemon.value;
});
},
addDownvote: ({pokeIndex}) => {
return collection.findOneAndUpdate({pokeIndex: pokeIndex}, {$inc: {downvotes: 1}}, {returnOriginal: false}).then((pokemon) => {
return pokemon.value;
});
},
removeDownvote: ({pokeIndex}) => {
return collection.findOneAndUpdate({pokeIndex: pokeIndex}, {$inc: {downvotes: -1}}, {returnOriginal: false}).then((pokemon) => {
return pokemon.value;
});
}
};
var app = express();
app.use(cors())
app.use(express.json())
app.use(express.urlencoded({ extended: true }))
app.use('/graphql', graphqlHTTP({
schema: schema,
rootValue: root,
graphiql: true,
}));
var server = app.listen(4000);
console.log('Running a GraphQL API server at localhost:4000/graphql');
server.on('close', () => {
client.close();
});
import React from 'react';
import getPokemon from './pokemon/getPokemon';
import getPokemonList from './pokemon/getPokemonList';
// Eksemple på hvordan apiet kan brukes (gjerne kommenter ut flere av eksemplene for å ikke kjøre alle samtidig):
// (Kommenter ut Api(); i App.tsx for å bruke dette eksempelet)
function Api() {
// --------------------- getPokemon --------------------- //
// Henter en pokemon med index 69, og henter ut pokeIndex, name, og typer (man må alltid hente ut noen verdier om pokemonen i en liste):
getPokemon(["pokeIndex","name","types"], 69).then((data) => {
if (data === null) {
return
}
console.log(data);
});
// Henter en pokemon med navn "Pikachu" (må oppgi pokeIndex -1 for å søke etter navn), og henter ut pokeIndex, og evolutions:
getPokemon(["pokeIndex","nextEvo"], -1, "pikachu").then((data) => {
if (data === null) {
return
}
console.log(data);
});
// Henter en pokemon uten no parametere, som vil gi en "haha funny" pokemon, og henter ut navn, upvotes, og downvotes:
getPokemon(["name","upvotes","downvotes"]).then((data) => {
if (data === null) {
return
}
console.log(data);
});
// -------------------------- getPokemonList -------------------------- //
// getPokemonList henter ut en liste med pokemoner, og kan filtrere på navn, type1, og type2.
// (Values er dette samme som i getPokemon: verdier for hver pokemon i listen, som må oppgis)
// Navn i dette tilfellet er en substring, så i dette tilfellet vil den finne alle navn som inneholder 'b'.
getPokemonList(["pokeIndex","name","types"], "b", "grass", "poison").then((data) => {
if (data === null) {
return
}
console.log(data);
});
//For å hente bare etter type og ikke navn må man gi en tom string til navn.
//Og dersom man bare skal ha en type, oppgi bare en, og ikke type1 = "" og type2 = "type".
getPokemonList(["pokeIndex","name","types"], "", "poison").then((data) => {
if (data === null) {
return
}
console.log(data);
});
//Dersom type1 = type2 vil den gi pokemon som har eksusivt den typen.
getPokemonList(["pokeIndex","name","types"], "", "poison", "poison").then((data) => {
if (data === null) {
return
}
console.log(data);
});
//Ingen søkeparametere vil gi en liste med alle pokemoner.
getPokemonList(["pokeIndex","name",]).then((data) => {
if (data === null) {
return
}
console.log(data);
});
}
export default Api;
\ No newline at end of file
import { getRequest } from '../requests';
export default async function getPokemon(values: String[], pokeIndex: number = -1, pokeName: string = "") {
if (pokeIndex < 0 && pokeName === "") {
let pokemon = await getRequest("{pokemon{"+values.join(",")+"}}");
return pokemon.data
}
let query;
if (pokeIndex > 0) {
query = "{pokemon(pokeIndex:"+pokeIndex+"){"+values.join(",")+"}}";
} else {
query = '{pokemon(name:"'+pokeName+'"){'+values.join(",")+'}}';
}
let data = await getRequest(query);
return data.data;
}
\ No newline at end of file
import { getRequest } from '../requests';
export default async function getPokemonList(values: String[], pokeName: string = "", type1: string = "", type2: string = "") {
var query = "{pokemonList";
const valueString = values.join(",");
if (pokeName === "" && type1 === "" && type2 === "") {
query += " {"+valueString+"}}";
} else {
query += "(";
if (pokeName !== "") {
query += 'name:"'+pokeName+'",';
} if (type1 !== "") {
query += 'type1:"'+type1+'",';
} if (type2 !== "") {
query += 'type2:"'+type2+'",';
}
query += "){"+valueString+"}}";
}
console.log("Query i pokemonList: ", query);
let pokemonlist = await getRequest(query);
return pokemonlist.data;
}
\ No newline at end of file
export async function getRequest(query: String){
let url = "http://localhost:4000/graphql";
let queryUrl = url + "?query=" + query;
console.log(queryUrl);
return fetch(queryUrl, {
method: 'GET',
headers: {
'Content-Type': 'application/json',
'Accept': 'application/json'
}
}).then(response => response.json())
.then(data => {
return data;
})
.catch(error => {
console.log(error);
});
}
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment