190 lines
5.5 KiB
Go
190 lines
5.5 KiB
Go
|
package main
|
||
|
|
||
|
import (
|
||
|
"context"
|
||
|
"encoding/json"
|
||
|
"go.mongodb.org/mongo-driver/bson"
|
||
|
"go.mongodb.org/mongo-driver/bson/primitive"
|
||
|
"go.mongodb.org/mongo-driver/mongo"
|
||
|
"go.mongodb.org/mongo-driver/mongo/options"
|
||
|
"log"
|
||
|
"net/http"
|
||
|
"time"
|
||
|
|
||
|
"github.com/gorilla/mux"
|
||
|
)
|
||
|
|
||
|
var client *mongo.Client
|
||
|
|
||
|
type Person struct {
|
||
|
ID primitive.ObjectID `bson:"_id,omitempty"`
|
||
|
Name string `bson:"name"`
|
||
|
}
|
||
|
|
||
|
type Debt struct {
|
||
|
ID primitive.ObjectID `bson:"_id,omitempty"`
|
||
|
PersonID primitive.ObjectID `bson:"fk_pid"`
|
||
|
Amount int `bson:"amount"`
|
||
|
Description string `bson:"description,omitempty"`
|
||
|
Datetime time.Time `bson:"datetime"`
|
||
|
}
|
||
|
|
||
|
func getDebtsForPerson(client *mongo.Client, personID string) ([]Debt, error) {
|
||
|
var results []Debt
|
||
|
|
||
|
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
|
||
|
defer cancel()
|
||
|
|
||
|
// Umwandlung der personID von string in primitive.ObjectID
|
||
|
objID, err := primitive.ObjectIDFromHex(personID)
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
|
||
|
// Verbindung zur "debts" Sammlung
|
||
|
debtsCollection := client.Database("debtlist").Collection("debts")
|
||
|
|
||
|
// Abfrage erstellen, die alle Schulden findet, deren fk_pid mit der personID übereinstimmt
|
||
|
filter := bson.M{"fk_pid": objID}
|
||
|
cursor, err := debtsCollection.Find(ctx, filter)
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
defer cursor.Close(ctx)
|
||
|
|
||
|
// Durchlaufen des Cursors und Hinzufügen der Ergebnisse zur results-Slice
|
||
|
for cursor.Next(ctx) {
|
||
|
var debt Debt
|
||
|
if err := cursor.Decode(&debt); err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
results = append(results, debt)
|
||
|
}
|
||
|
|
||
|
if err := cursor.Err(); err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
|
||
|
return results, nil
|
||
|
}
|
||
|
|
||
|
func main() {
|
||
|
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
|
||
|
defer cancel()
|
||
|
var err error
|
||
|
client, err = mongo.Connect(ctx, options.Client().ApplyURI("mongodb://root:example@localhost:27017"))
|
||
|
if err != nil {
|
||
|
panic(err)
|
||
|
}
|
||
|
|
||
|
// Router initialisieren
|
||
|
r := mux.NewRouter()
|
||
|
r.HandleFunc("/persons", createPerson).Methods("POST")
|
||
|
r.HandleFunc("/persons/{id}", getPerson).Methods("GET")
|
||
|
r.HandleFunc("/persons", getAllPersons).Methods("GET")
|
||
|
r.HandleFunc("/persons/{id}", updatePerson).Methods("PUT")
|
||
|
r.HandleFunc("/persons/{id}", deletePerson).Methods("DELETE")
|
||
|
err = http.ListenAndServe(":3333", r)
|
||
|
if err != nil {
|
||
|
log.Fatal(err)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func createPerson(w http.ResponseWriter, r *http.Request) {
|
||
|
w.Header().Set("Content-Type", "application/json")
|
||
|
var person Person
|
||
|
json.NewDecoder(r.Body).Decode(&person)
|
||
|
collection := client.Database("debtlist").Collection("persons")
|
||
|
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
|
||
|
defer cancel()
|
||
|
result, err := collection.InsertOne(ctx, person)
|
||
|
if err != nil {
|
||
|
w.WriteHeader(http.StatusInternalServerError)
|
||
|
w.Write([]byte(`{"message": "` + err.Error() + `"}`))
|
||
|
return
|
||
|
|
||
|
}
|
||
|
json.NewEncoder(w).Encode(result)
|
||
|
}
|
||
|
func updatePerson(w http.ResponseWriter, r *http.Request) {
|
||
|
w.Header().Set("Content-Type", "application/json")
|
||
|
var person Person
|
||
|
json.NewDecoder(r.Body).Decode(&person)
|
||
|
collection := client.Database("debtlist").Collection("persons")
|
||
|
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
|
||
|
defer cancel()
|
||
|
filter := bson.M{"_id": person.ID}
|
||
|
update := bson.M{
|
||
|
"$set": bson.M{
|
||
|
"name": person.Name,
|
||
|
},
|
||
|
}
|
||
|
result, err := collection.UpdateOne(ctx, filter, update)
|
||
|
if err != nil {
|
||
|
w.WriteHeader(http.StatusInternalServerError)
|
||
|
w.Write([]byte(`{"message": "` + err.Error() + `"}`))
|
||
|
return
|
||
|
|
||
|
}
|
||
|
json.NewEncoder(w).Encode(result)
|
||
|
}
|
||
|
func deletePerson(w http.ResponseWriter, r *http.Request) {
|
||
|
w.Header().Set("Content-Type", "application/json")
|
||
|
var person Person
|
||
|
json.NewDecoder(r.Body).Decode(&person)
|
||
|
collection := client.Database("debtlist").Collection("persons")
|
||
|
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
|
||
|
defer cancel()
|
||
|
filter := bson.M{"_id": person.ID}
|
||
|
result, err := collection.DeleteOne(ctx, filter)
|
||
|
if err != nil {
|
||
|
w.WriteHeader(http.StatusInternalServerError)
|
||
|
w.Write([]byte(`{"message": "` + err.Error() + `"}`))
|
||
|
return
|
||
|
}
|
||
|
json.NewEncoder(w).Encode(result)
|
||
|
}
|
||
|
func getPerson(w http.ResponseWriter, r *http.Request) {
|
||
|
vars := mux.Vars(r)
|
||
|
personID := vars["id"]
|
||
|
w.Header().Set("Content-Type", "application/json")
|
||
|
var person Person
|
||
|
collection := client.Database("debtlist").Collection("persons")
|
||
|
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
|
||
|
defer cancel()
|
||
|
pid, err := primitive.ObjectIDFromHex(personID)
|
||
|
filter := bson.M{"_id": pid}
|
||
|
err = collection.FindOne(ctx, filter).Decode(&person)
|
||
|
if err != nil {
|
||
|
w.WriteHeader(http.StatusInternalServerError)
|
||
|
w.Write([]byte(`{"message": "` + err.Error() + `"}`))
|
||
|
return
|
||
|
}
|
||
|
json.NewEncoder(w).Encode(person)
|
||
|
}
|
||
|
func getAllPersons(w http.ResponseWriter, r *http.Request) {
|
||
|
w.Header().Set("Content-Type", "application/json")
|
||
|
var persons []Person
|
||
|
collection := client.Database("debtlist").Collection("persons")
|
||
|
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
|
||
|
defer cancel()
|
||
|
cursor, err := collection.Find(ctx, bson.M{})
|
||
|
if err != nil {
|
||
|
w.WriteHeader(http.StatusInternalServerError)
|
||
|
w.Write([]byte(`{"message": "` + err.Error() + `"}`))
|
||
|
return
|
||
|
}
|
||
|
defer cursor.Close(ctx)
|
||
|
for cursor.Next(ctx) {
|
||
|
var person Person
|
||
|
cursor.Decode(&person)
|
||
|
persons = append(persons, person)
|
||
|
}
|
||
|
if err := cursor.Err(); err != nil {
|
||
|
w.WriteHeader(http.StatusInternalServerError)
|
||
|
w.Write([]byte(`{"message": "` + err.Error() + `"}`))
|
||
|
return
|
||
|
}
|
||
|
json.NewEncoder(w).Encode(persons)
|
||
|
}
|