Skip to content

Commit

Permalink
Feature/angular UI (#1)
Browse files Browse the repository at this point in the history
* added angular ui

* - added backend configuration via file and env variables
-  changed ui from to angular based sass to based on css

* - added ui to docker build
- added more config
- added small demo data set
  • Loading branch information
rherlt authored Aug 10, 2023
1 parent 8841573 commit b1853f5
Show file tree
Hide file tree
Showing 289 changed files with 75,094 additions and 70 deletions.
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -22,3 +22,5 @@ bin

# Go workspace file
go.work

tmp
33 changes: 33 additions & 0 deletions .vscode/launch.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "Launch reval Go Package",
"type": "go",
"request": "launch",
"mode": "auto",
"program": "cmd/reval/main.go",
"args": [
"${workspaceFolder}/configs/debug/"
]
},
{
"name": "Launch mailtransformer Go Package",
"type": "go",
"request": "launch",
"mode": "auto",
"program": "cmd/mailtransformer/main.go"
},
{
"type": "firefox",
"request": "launch",
"name": "Launch Angular",
"url": "http://localhost:4200",
"reAttach": true,
"file": "${workspaceFolder}/ui/reval-web/src/index.html"
}
]
}
6 changes: 3 additions & 3 deletions api/evaluationapi.yaml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
openapi: 3.0.3
info:
title: Evaluation API
description: This API is for evaluating generated email responses from a LLM.
description: This API is for evaluating responses from a response generator.
contact:
name: Rico Herlt
email: mail@rherlt.com
Expand Down Expand Up @@ -39,7 +39,7 @@ paths:
get:
tags:
- Response Evaluation
summary: Gets the next message for evaluation
summary: Gets the next message for evaluation.
description: Gets the next message for evaluation.
operationId: GetEvaluation
parameters:
Expand Down Expand Up @@ -146,7 +146,7 @@ components:
- request
- evaluations
Message:
description: Message.
description: The message Message.
properties:
from:
type: string
Expand Down
3 changes: 3 additions & 0 deletions build/reval/.dockerignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# ignore local prebuild distributions and node_modules
dist
node_modules
25 changes: 20 additions & 5 deletions build/reval/Dockerfile
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# syntax=docker/dockerfile:1

# Build the application from source
FROM golang:1.20 AS build-stage
# Build the go backend application from source
FROM golang:1.20 AS go-build-stage

WORKDIR /app

Expand All @@ -11,18 +11,33 @@ RUN go mod download && go mod verify
COPY . .

RUN CGO_ENABLED=0 GOOS=linux go build -v -o /usr/local/bin/app/ ./...
# Run the tests in the container
FROM build-stage AS run-test-stage


# Run the go backend tests in the container
FROM go-build-stage AS go-run-test-stage
RUN go test -v ./...

FROM node:20.5-alpine AS node-build-stage

WORKDIR /app

COPY ui/reval-web/package.json ui/reval-web/package-lock.json ./

RUN apk update && apk add openjdk17-jdk && npm install @openapitools/openapi-generator-cli && npm install
COPY . .
RUN cd ui/reval-web/ && npm run build

# Deploy the application binary into a lean image
FROM gcr.io/distroless/base-debian11 AS build-release-stage

ENV GIN_MODE=release

WORKDIR /app

COPY --from=build-stage /usr/local/bin/app/ /app
COPY --from=go-build-stage /usr/local/bin/app/ /app/configs/docker/reval.env /app/
#COPY --from=go-build-stage /app/configs/docker/reval.env /app
COPY --from=go-build-stage /app/data /app/data
COPY --from=node-build-stage /app/ui/reval-web/dist/reval-web/ /app/www

EXPOSE 8080

Expand Down
95 changes: 95 additions & 0 deletions cmd/mailtransformer/main.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
package main

import (
"encoding/json"
"fmt"
"io"
"os"
"strings"

"github.com/rherlt/reval/internal/api/evaluationapi"
)

type MailItem struct {
RequestMail string `json:"requestMail"`
MailResponse string `json:"mailResponse"`
}

func main() {

// Open our jsonFile
jsonFile, err := os.Open("../../tmp/output.json")
// if we os.Open returns an error then handle it
if err != nil {
fmt.Println(err)
}

// defer the closing of our jsonFile so that we can parse it later on
defer jsonFile.Close()

// read our opened jsonFile as a byte array.
bytes, _ := io.ReadAll(jsonFile)

// we initialize our Users array
var mails []MailItem

// we unmarshal our byteArray which contains our
// jsonFile's content into 'users' which we defined above
json.Unmarshal(bytes, &mails)

var transformedMails []evaluationapi.GetEvaluationResponse

// we iterate through every user within our users array and
// print out the user Type, their name, and their facebook url
// as just an example
for i := 0; i < len(mails); i++ {
var currentMail = mails[i]
transformedMails = append(transformedMails, evaluationapi.GetEvaluationResponse{
Id: int32(i),
Request: evaluationapi.Message{
Body: GetStringAfterInBetween(currentMail.RequestMail, "Betreff: ", "\n\n"),
From: "chatgpt/gpt-3.5-turbo",
Subject: GetStringInBetween(currentMail.RequestMail, "Betreff: ", "\n"),
},
Response: evaluationapi.Message{
Body: currentMail.MailResponse,
From: "chatgpt/gpt-3.5-turbo",
Subject: "",
},
})
}

outFile, _ := json.MarshalIndent(transformedMails, "", " ")

_ = os.WriteFile("../../tmp/reval-transformed.json", outFile, 0644)
}

// GetStringInBetween Returns empty string if no start string found
func GetStringInBetween(str string, start string, end string) (result string) {
s := strings.Index(str, start)
if s == -1 {
return
}
s += len(start)
e := strings.Index(str[s:], end)
if e == -1 {
return
}
fin := s + e
return str[s:fin]
}

// GetStringInBetween Returns empty string if no start string found
func GetStringAfterInBetween(str string, start string, end string) (result string) {
s := strings.Index(str, start)
if s == -1 {
return str
}
s += len(start)
e := strings.Index(str[s:], end)
if e == -1 {
return str
}
fin := s + e + len(end)
return str[fin:]
}
42 changes: 37 additions & 5 deletions cmd/reval/main.go
Original file line number Diff line number Diff line change
@@ -1,23 +1,55 @@
package main

import (
"log"
"net/http"
"os"

"github.com/rherlt/reval/internal/api/evaluationapi"
"github.com/rherlt/reval/internal/config"
"github.com/rherlt/reval/internal/controller"

"github.com/gin-contrib/cors"
"github.com/gin-gonic/gin"
)

func main() {

//load config path from command line or use "." (current application path)
var configPath string = "."
if len(os.Args) > 1 {
configPath = os.Args[1:][0]
}

err := config.LoadConfig(configPath)
if err != nil {
log.Fatal("cannot load config:", err)
}

//todo replace with load from database
controller.LoadDataFromFile()

//setup gin webserver
r := gin.Default()
//TODO: remove for production builds.
r.Use(cors.Default())
//TODO: https://github.com/deepmap/oapi-codegen/blob/master/examples/petstore-expanded/gin/petstore.go#L21C1-L48C1

r.GET("/openapi.json", controller.GetSwagger)
r.NoRoute(func(c *gin.Context) {
c.Redirect(http.StatusMovedPermanently, config.Current.Gin_Web_BaseUrl)
})

//register folder for static web deployment
r.Static("/ui/", config.Current.Gin_Web_Path)

corsConfig := cors.DefaultConfig()
corsConfig.AllowHeaders = append(corsConfig.AllowHeaders, config.Current.Gin_Cors_AdditionalAllowedHeaders...)
corsConfig.AllowAllOrigins = config.Current.Gin_Cors_AllowAllOrigins
r.Use(cors.New(corsConfig))
//TODO: https://github.com/deepmap/oapi-codegen/blob/master/examples/petstore-expanded/gin/petstore.go#L21C1-L48C1
r.GET("/swagger/openapi.json", controller.GetSwagger)

//register HTTP handlers
si := new(controller.EvaluationApiServerInterface)
evaluationapi.RegisterHandlersWithOptions(r, si, si.GetServerOptions())

r.Run(":8080")
//run webserver
r.Run(config.Current.Gin_WebServerAddress)
}
9 changes: 9 additions & 0 deletions configs/debug/reval.env
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
# default configuration for debugging reval
DATAPATH=../../data/reval-transformed.json
# Gin Webserver Settings
GIN_CORS_ALLOWALLORIGINS=true
GIN_CORS_ADDITIONALALLOWEDHEADERS=Authorization
GIN_WEB_PATH=../../ui/reval-web/dist/reval-web/
GIN_WEBSERVERADDRESS=:8080
GIN_API_BASEURL=/api/
GIN_WEB_BASEURL=/ui/
9 changes: 9 additions & 0 deletions configs/docker/reval.env
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
# default configuration for debugging reval
DATAPATH=./data/reval-transformed.json
# Gin Webserver Settings
GIN_CORS_ALLOWALLORIGINS=true
GIN_CORS_ADDITIONALALLOWEDHEADERS=Authorization
GIN_WEB_PATH=./www/
GIN_WEBSERVERADDRESS=:8080
GIN_API_BASEURL=/api/
GIN_WEB_BASEURL=/ui/
62 changes: 62 additions & 0 deletions data/reval-transformed.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
[
{
"evaluations": {
"numNegative": 0,
"numNeutral": 0,
"numPositive": 0
},
"id": 0,
"request": {
"body": "Sehr geehrte Damen und Herren,\nich wollte nur kurz nachfragen, ob meine Rechnung eingegangen ist bzw. ob die Abbuchung von meinem Konto erfolgreich war. Über eine kurze Rückmeldung wäre ich sehr dankbar.\nMit freundlichen Grüßen\n[Name des Kunden]",
"date": "",
"from": "chatgpt/gpt-3.5-turbo",
"subject": ""
},
"response": {
"body": "Sehr geehrter Herr/Frau [Name des Kunden],\n\nvielen Dank für Ihre Anfrage. Gerne teile ich Ihnen mit, dass Ihre Rechnung erfolgreich bei uns eingegangen ist. Die Abbuchung von Ihrem Konto war ebenfalls erfolgreich.\n\nFür weitere Fragen oder Informationen stehe ich Ihnen gerne zur Verfügung.\n\nMit freundlichen Grüßen\n[Dein Name]\nKundenbetreuer Energieversorgung",
"date": "",
"from": "chatgpt/gpt-3.5-turbo",
"subject": ""
}
},
{
"evaluations": {
"numNegative": 0,
"numNeutral": 0,
"numPositive": 0
},
"id": 1,
"request": {
"body": "Sehr geehrte Damen und Herren,\n\nich möchte mich heute bei Ihnen bedanken und ein großes Lob aussprechen. Ich bin sehr zufrieden mit den Verbrauchsinformationen, die Sie mir zur Verfügung stellen. Der Umfang der Informationen ist genau richtig und gibt mir einen guten Überblick über meinen Energieverbrauch.\n\nBesonders gefällt mir, dass ich jederzeit online auf meine Verbrauchsdaten zugreifen kann. So kann ich meinen Verbrauch im Blick behalten und gegebenenfalls Anpassungen vornehmen, um Energie zu sparen.\n\nIch finde es toll, dass Sie sich so umfassend um Ihre Kunden kümmern und ihnen wertvolle Informationen zur Verfügung stellen. Das gibt mir das Gefühl, dass ich bei Ihnen in guten Händen bin.\n\nVielen Dank für Ihre tolle Arbeit!\n\nMit freundlichen Grüßen,\n\n[Name des Kunden]",
"date": "",
"from": "chatgpt/gpt-3.5-turbo",
"subject": ""
},
"response": {
"body": "Sehr geehrter Herr/Frau [Name des Kunden],\n\nvielen Dank für Ihre freundliche Mail und das positive Feedback! Es freut uns sehr zu hören, dass Sie mit unseren Verbrauchsinformationen zufrieden sind und einen guten Überblick über Ihren Energieverbrauch erhalten.\n\nUnser Ziel ist es, unseren Kunden wertvolle Informationen zur Verfügung zu stellen und ihnen dabei zu helfen, ihren Energieverbrauch im Blick zu behalten und gegebenenfalls Anpassungen vorzunehmen, um Energie zu sparen. Es freut uns, dass Ihnen besonders die Möglichkeit gefällt, jederzeit online auf Ihre Verbrauchsdaten zugreifen zu können.\n\nWir legen großen Wert darauf, unsere Kunden umfassend zu betreuen und ihnen einen exzellenten Service zu bieten. Ihr positives Feedback bestärkt uns in unserer Arbeit und wir werden weiterhin alles daran setzen, Ihnen den bestmöglichen Service zu bieten.\n\nNochmals vielen Dank für Ihr Lob! Sollten Sie weitere Fragen oder Anliegen haben, stehen wir Ihnen jederzeit gerne zur Verfügung.\n\nMit freundlichen Grüßen,\n\n[Dein Name]\nKundenbetreuer Energieversorgung",
"date": "",
"from": "chatgpt/gpt-3.5-turbo",
"subject": ""
}
},
{
"evaluations": {
"numNegative": 0,
"numNeutral": 0,
"numPositive": 0
},
"id": 2,
"request": {
"body": "Sehr geehrte Damen und Herren,\n\nich möchte mich heute einfach mal bei Ihnen bedanken! Ich bin Kunde Ihres Energieversorgungsunternehmens und ich bin wirklich beeindruckt von den Verbrauchsinformationen, die Sie mir zur Verfügung stellen.\n\nBesonders lobend möchte ich hervorheben, dass Sie sehr umfassende Informationen zu meinem Strom- und Gasverbrauch bereitstellen. Besonders nützlich finde ich auch die Vergleichsmöglichkeiten mit anderen Haushalten und die Möglichkeit, meine Verbräuche in verschiedenen Zeiträumen zu analysieren.\n\nDank Ihrer Informationen kann ich mein eigenes Verbrauchsverhalten besser verstehen und gezielt daran arbeiten, meinen Energieverbrauch zu optimieren. Auch die Möglichkeit, Informationen und Tipps zu Energiesparmaßnahmen zu erhalten, finde ich sehr nützlich.\n\nIch möchte mich nochmals ausdrücklich bei Ihnen dafür bedanken, dass Sie Ihren Kunden so umfassende und informative Verbrauchsinformationen zur Verfügung stellen. Das zeigt mir, dass Sie sich wirklich um das Wohl Ihrer Kunden kümmern.\n\nMit freundlichen Grüßen\n\n[Name des Kunden]",
"date": "",
"from": "chatgpt/gpt-3.5-turbo",
"subject": "Lob für umfassende und informative Verbrauchsinformationen"
},
"response": {
"body": "Sehr geehrter Herr/Frau [Name des Kunden],\n\nvielen Dank für Ihre freundliche E-Mail und das positive Feedback zu unseren Verbrauchsinformationen. Es freut uns sehr zu hören, dass Sie mit unserem Service zufrieden sind.\n\nUnser Ziel ist es, unseren Kunden nicht nur eine zuverlässige Energieversorgung zu bieten, sondern auch umfassende Informationen zur Verfügung zu stellen, um Ihnen bei der Optimierung Ihres Energieverbrauchs zu unterstützen. Es ist großartig zu hören, dass Sie unsere Vergleichsmöglichkeiten und Analysefunktionen als nützlich empfinden.\n\nWir sind stets bestrebt, unseren Kundenservice zu verbessern und Ihre Bedürfnisse zu erfüllen. Daher sind wir auch sehr dankbar für Ihr Feedback, da es uns hilft, unsere Dienstleistungen weiter zu optimieren.\n\nFalls Sie weitere Fragen oder Anregungen haben, zögern Sie bitte nicht, uns zu kontaktieren. Wir stehen Ihnen gerne zur Verfügung.\n\nWir bedanken uns nochmals herzlich für Ihr positives Feedback und wünschen Ihnen weiterhin eine angenehme Zusammenarbeit mit uns.\n\nMit freundlichen Grüßen\n\n[Dein Name]\nKundenbetreuer Energieversorgungsunternehmen",
"date": "",
"from": "chatgpt/gpt-3.5-turbo",
"subject": ""
}
}
]
1 change: 1 addition & 0 deletions docker-compose.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ services:
build:
context: .
dockerfile: build/reval/Dockerfile

image: local/reval:latest
ports:
- "8080:8080"
Loading

0 comments on commit b1853f5

Please sign in to comment.