Compare commits

...

3 Commits

Author SHA1 Message Date
e047b35f77 fixed 2024-09-01 07:39:42 +02:00
be71cc40d1 logger auth error 2024-08-31 22:56:25 +02:00
a0eedd4250 update front with logger 2024-08-30 09:45:01 +02:00
7 changed files with 116 additions and 13 deletions

View File

@ -1,6 +1,8 @@
package main
import (
"bytes"
"encoding/json"
"errors"
"fmt"
"net/http"
@ -30,6 +32,15 @@ func (app *Config) Authenticate(w http.ResponseWriter, r *http.Request) {
app.errorJSON(w, errors.New("invalid credentials"), http.StatusBadRequest)
return
}
// log authentication
err = app.logRequest("authentication", fmt.Sprintf("%s is logged in", user.Email))
if err != nil {
app.errorJSON(w, err)
return
}
payload := jsonResponse{
Error: false,
Message: fmt.Sprintf("%s %s is authorized to log in.", user.FirstName, user.LastName),
@ -38,3 +49,30 @@ func (app *Config) Authenticate(w http.ResponseWriter, r *http.Request) {
app.writeJSON(w, http.StatusAccepted, payload)
}
func (app *Config) logRequest(name, data string) error {
var entry struct {
Name string `json:"name"`
Data string `json:"data"`
}
entry.Name = name
entry.Data = data
jsonData, _ := json.MarshalIndent(entry, "", "\t")
logServiceURL := "http://logger-service/log"
request, err := http.NewRequest("POST", logServiceURL, bytes.NewBuffer(jsonData))
if err != nil {
return err
}
request.Header.Add("Content-Type", "application/json")
client := &http.Client{}
_, err = client.Do(request)
if err != nil {
return err
}
return nil
}

View File

@ -57,8 +57,9 @@ func (app *Config) authenticate(w http.ResponseWriter, a AuthPayload) {
Input: a,
Addr: "http://authentication-service/authenticate",
ErrCode: statusError{
Code: http.StatusUnauthorized,
Err: errors.New("invalid credentials"),
ExpectedCode: http.StatusAccepted,
ErrCode: http.StatusUnauthorized,
Err: errors.New("invalid credentials"),
},
SuccessMsg: "Authenticated",
}
@ -66,12 +67,14 @@ func (app *Config) authenticate(w http.ResponseWriter, a AuthPayload) {
}
func (app *Config) LogItem(w http.ResponseWriter, entry LogPayload) {
log.Println(entry)
loggerService := Microservice{
Input: entry,
Addr: "http://logger-service/log",
ErrCode: statusError{
Code: http.StatusInternalServerError,
Err: errors.New("internal error"),
ExpectedCode: http.StatusAccepted,
ErrCode: http.StatusInternalServerError,
Err: errors.New("internal error"),
},
SuccessMsg: "Logged!",
}
@ -79,8 +82,9 @@ func (app *Config) LogItem(w http.ResponseWriter, entry LogPayload) {
}
type statusError struct {
Code int
Err error
ExpectedCode int
ErrCode int
Err error
}
type Microservice struct {
@ -97,6 +101,7 @@ func (app *Config) callService(w http.ResponseWriter, ms Microservice) {
app.errorJSON(w, err, http.StatusBadRequest)
return
}
log.Println(ms.Input)
// call the service
req, err := http.NewRequest(
@ -120,8 +125,8 @@ func (app *Config) callService(w http.ResponseWriter, ms Microservice) {
log.Println(resp.Body)
// make sure we get back the correct status code
if resp.StatusCode != http.StatusAccepted {
app.errorJSON(w, ms.ErrCode.Err, ms.ErrCode.Code)
if resp.StatusCode != ms.ErrCode.ExpectedCode {
app.errorJSON(w, ms.ErrCode.Err, ms.ErrCode.ErrCode)
return
}

View File

@ -9,6 +9,7 @@
<a id="brokerBtn" class="btn btn-outline-secondary" href="javascript:void(0);">Test Broker</a>
<a id="authBrokerBtn" class="btn btn-outline-secondary" href="javascript:void(0);">Test Auth</a>
<a id="logBtn" class="btn btn-outline-secondary" href="javascript:void(0);">Test Log</a>
<div id="output" class="mt-5" style="outline: 1px solid silver; padding: 2em;">
<span class="text-muted">Output shows here...</span>
@ -36,6 +37,7 @@
<script>
let brokerBtn = document.getElementById("brokerBtn");
let authBrokerBtn = document.getElementById("authBrokerBtn");
let logBtn = document.getElementById("logBtn");
let output = document.getElementById("output");
let sent = document.getElementById("payload");
let received = document.getElementById("received");
@ -91,5 +93,38 @@
output.innerHTML += "<br><br>Error: " + error;
});
});
logBtn.addEventListener("click", () => {
const payload = {
action: "log",
log: {
name: "event",
data: "some kind of data",
}
};
const headers = new Headers();
headers.append("Content-Type", "application/json");
const body = {
method: 'POST',
body: JSON.stringify(payload),
headers: headers,
}
fetch("http:\/\/localhost:8080/handle", body)
.then((response) => response.json())
.then((data) => {
sent.innerHTML = JSON.stringify(payload, undefined, 4);
received.innerHTML = JSON.stringify(data, undefined, 4);
if (data.error) {
console.log(data.message);
output.innerHTML += `<br><strong>Error:</strong>: ${data.message}`;
} else {
output.innerHTML += `<br><strong>Response from broker service</strong>: ${data.message}`;
}
})
.catch((error) => {
output.innerHTML += "<br><br>Error: " + error;
});
});
</script>
{{end}}

View File

@ -1,6 +1,7 @@
package main
import (
"log"
"logger/data"
"net/http"
)
@ -18,6 +19,7 @@ func (app *Config) WriteLog(w http.ResponseWriter, r *http.Request) {
app.errorJSON(w, err)
return
}
log.Println("requestpayload", requestPayload)
// insert data
event := data.LogEntry{
@ -25,6 +27,8 @@ func (app *Config) WriteLog(w http.ResponseWriter, r *http.Request) {
Data: requestPayload.Data,
}
log.Println("event", event)
err = app.Models.LogEntry.Insert(event)
if err != nil {
app.errorJSON(w, err)

View File

@ -8,6 +8,7 @@ import (
"net/http"
"time"
"go.mongodb.org/mongo-driver/bson"
"go.mongodb.org/mongo-driver/mongo"
"go.mongodb.org/mongo-driver/mongo/options"
)
@ -42,6 +43,8 @@ func main() {
}
}()
client = mongoClient
app := Config{
Models: data.New(client),
}
@ -75,6 +78,12 @@ func connectToMongo() (*mongo.Client, error) {
return nil, err
}
var result bson.M
if err = client.Database("admin").RunCommand(context.TODO(), bson.D{{Key: "ping", Value: 1}}).Decode(&result); err != nil {
log.Println("Error ping:", err)
return nil, err
}
log.Println("Connected to Mongo")
return client, nil

View File

@ -35,13 +35,15 @@ type LogEntry struct {
func (l *LogEntry) Insert(entry LogEntry) error {
collection := client.Database("logs").Collection("logs")
_, err := collection.InsertOne(context.TODO(), LogEntry{
newLog := LogEntry{
Name: entry.Name,
Data: entry.Data,
CreatedAt: time.Now(),
UpdatedAt: time.Now(),
})
}
_, err := collection.InsertOne(context.TODO(), newLog)
if err != nil {
log.Println("Insert error:", err)
return err
}
return nil

View File

@ -51,9 +51,8 @@ services:
ports:
- "27017:27017"
environment:
MONGO_INITDB_DATABASE: logs
MONGO_INITDB_USERNAME: admin
MONGO_INITDB_PASSWORD: password
MONGO_INITDB_ROOT_USERNAME: admin
MONGO_INITDB_ROOT_PASSWORD: password
volumes:
- ./db-data/mongo:/data/db
@ -62,3 +61,14 @@ services:
restart: always
ports:
- 8090:8080
mongo-express:
image: mongo-express
restart: always
ports:
- 8091:8081
environment:
ME_CONFIG_MONGODB_ADMINUSERNAME: admin
ME_CONFIG_MONGODB_ADMINPASSWORD: password
ME_CONFIG_MONGODB_URL: mongodb://admin:password@mongo:27017/
ME_CONFIG_BASICAUTH: false