Merge branch 'database-connect' into 'master'

Datbase connected to backend, frontend, backend and containers communicating

See merge request murphg62/2023-ca400-murphg62-byrnm257!5
This commit is contained in:
Malachy Byrne 2023-04-16 12:55:03 +00:00
commit 1c8556a111
9 changed files with 222 additions and 159 deletions

View File

@ -0,0 +1,9 @@
public class Module {
public String Name {get; set;}
public String Container {get; set;}
public Module(string name, string container){
Name = name;
Container = container;
}
}

View File

@ -0,0 +1,10 @@
<div class="card">
<div class="card-body">
<p>@Data.Text</p>
</div>
</div>
@code {
[Parameter]
public Component Data { get; set; }
}

View File

@ -4,7 +4,7 @@
@using System.Text.Json;
@inject IHttpService httpService
@* @if (data != null)
@if (data != null)
{
@foreach (var component in data) {
switch (component.Type) {
@ -27,16 +27,16 @@
}
}
} *@
}
<pre>@response.Text</pre>
@code {
private Component response;
private Component[] data;
protected override async Task OnInitializedAsync()
{
response = await httpService.GetAsync<Component>("http://localhost:8080/test");
var response = await httpService.GetAsync<Schema>("http://localhost:10000/localhost/schema");
data = response.components;
}
}

View File

@ -1,4 +1,8 @@
<div class="top-row ps-3 navbar navbar-dark">
@using PanoptesFrontend.Data
@using System.Text.Json;
@inject IHttpService httpService
<div class="top-row ps-3 navbar navbar-dark">
<div class="container-fluid">
<a class="navbar-brand" href="">PanoptesFrontend</a>
<button title="Navigation menu" class="navbar-toggler" @onclick="ToggleNavMenu">
@ -9,29 +13,31 @@
<div class="@NavMenuCssClass" @onclick="ToggleNavMenu">
<nav class="flex-column">
<div class="nav-item px-3">
<NavLink class="nav-link" href="" Match="NavLinkMatch.All">
<span class="oi oi-home" aria-hidden="true"></span> Home
</NavLink>
</div>
<div class="nav-item px-3">
<NavLink class="nav-link" href="counter">
<span class="oi oi-plus" aria-hidden="true"></span> Counter
</NavLink>
</div>
<div class="nav-item px-3">
<NavLink class="nav-link" href="fetchdata">
<span class="oi oi-list-rich" aria-hidden="true"></span> Fetch data
</NavLink>
</div>
@if (response != null)
{
@foreach (var module in response){
<div class="nav-item px-3">
<NavLink class="nav-link" href=@module.Name Match="NavLinkMatch.All">
<span class="oi oi-home" aria-hidden="true"></span> @module.Name
</NavLink>
</div>
}
}
</nav>
</div>
@code {
public Module[] response;
protected override async Task OnInitializedAsync()
{
response = await httpService.GetAsync<Module[]>("http://localhost:10000/modules");
}
private bool collapseNavMenu = true;
private string? NavMenuCssClass => collapseNavMenu ? "collapse" : null;
private void ToggleNavMenu()
{
collapseNavMenu = !collapseNavMenu;

View File

@ -1,95 +0,0 @@
package main
import (
"fmt"
"log"
"net/http"
"io/ioutil"
"github.com/gorilla/mux"
)
type Schema struct {
Name string `json:"Name"`
Type int `json:"Type"`
}
type Container struct {
Id string `json:"Id`
Name string `json:"Name"`
port string `json:"Port"`
}
var Containers []Container
func homePage(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Welcome to the home page!")
}
func getSchema(w http.ResponseWriter, r *http.Request){
vars := mux.Vars(r)
key := vars["container"]
for _, container := range Containers {
if container.Id == key {
requestURL := fmt.Sprintf("http://%s:%s/schema", container.Name, container.port)
resp, err := http.Get(requestURL)
if err != nil {
log.Fatal("Request to container failed: %v", err)
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
log.Fatal("Failed to print Body: %v", err)
}
fmt.Fprintf(w,string(body))
}
}
}
func getStats(w http.ResponseWriter, r *http.Request){
vars := mux.Vars(r)
key := vars["container"]
for _, container := range Containers {
if container.Id == key {
requestURL := fmt.Sprintf("http://%s:%s/stats", container.Name, container.port)
resp, err := http.Get(requestURL)
if err != nil {
log.Fatal("Request to container failed: %v", err)
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
log.Fatal("Failed to print Body: %v", err)
}
fmt.Fprintf(w,string(body))
}
}
}
func handleRequests() {
myRouter := mux.NewRouter().StrictSlash(true)
myRouter.HandleFunc("/", homePage)
myRouter.HandleFunc("/{container}/schema", getSchema)
myRouter.HandleFunc("/{container}/stats", getStats)
log.Fatal(http.ListenAndServe(":10000", myRouter))
}
func main() {
Containers = []Container{
Container{Id: "1", Name: "localhost", port: "3000"},
}
handleRequests()
}

131
src/backend/cmd/main.go Normal file
View File

@ -0,0 +1,131 @@
package main
import (
"database/sql"
"encoding/json"
"fmt"
"io/ioutil"
"log"
"net/http"
"github.com/gorilla/mux"
"gitlab.computing.dcu.ie/murphg62/2023-ca400-murphg62-byrnm257/src/backend/pkg/db"
_ "golang.org/x/mod/module"
)
type Schema struct {
Name string `json:"Name"`
Type int `json:"Type"`
}
type Container struct {
Id string `json:"Id`
Name string `json:"Name"`
port string `json:"Port"`
}
type Module struct {
Name string `json:"Name"`
Container string `json:"Container"`
}
func homePage(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Welcome to the home page!")
}
func getSchema(w http.ResponseWriter, r *http.Request){
vars := mux.Vars(r)
key := vars["container"]
requestURL := fmt.Sprintf("http://%s:8080/schema", key)
resp, err := http.Get(requestURL)
if err != nil {
log.Fatal("Request to container failed: %v", err)
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
log.Fatal("Failed to print Body: %v", err)
}
w.Header().Set("Content-Type", "application/json")
w.WriteHeader(resp.StatusCode)
w.Write(body)
}
func getStats(w http.ResponseWriter, r *http.Request){
vars := mux.Vars(r)
key := vars["container"]
requestURL := fmt.Sprintf("http://%s:8080/stats", key)
resp, err := http.Get(requestURL)
if err != nil {
log.Fatal("Request to container failed: %v", err)
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
log.Fatal("Failed to print Body: %v", err)
}
w.Header().Set("Content-Type", "application/json")
w.WriteHeader(resp.StatusCode)
w.Write(body)
}
func getModules(db *sql.DB) http.HandlerFunc{
return func(w http.ResponseWriter, r *http.Request){
if r.Method == "GET" {
var Modules []Module
rows, err := db.Query("Select name, container_name FROM Module")
if err != nil {
panic(err)
}
defer rows.Close()
for rows.Next() {
var module Module
if err := rows.Scan(&module.Name, &module.Container); err != nil {
panic(err)
}
Modules = append(Modules, module)
}
w.Header().Set("Content-Type", "application/json")
if err := json.NewEncoder(w).Encode(Modules); err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
}
}
}
func handleRequests(DB *sql.DB) {
myRouter := mux.NewRouter().StrictSlash(true)
myRouter.HandleFunc("/", homePage)
myRouter.HandleFunc("/{container}/schema", getSchema)
myRouter.HandleFunc("/{container}/stats", getStats)
myRouter.HandleFunc("/modules", getModules(DB))
log.Fatal(http.ListenAndServe(":10000", myRouter))
}
func main() {
DB := db.ConnectDB()
handleRequests(DB)
db.CloseDB(DB)
}

View File

@ -3,12 +3,7 @@ module gitlab.computing.dcu.ie/murphg62/2023-ca400-murphg62-byrnm257/src/backend
go 1.19
require (
github.com/golang/protobuf v1.5.3 // indirect
github.com/gorilla/mux v1.8.0 // indirect
golang.org/x/net v0.8.0 // indirect
golang.org/x/sys v0.6.0 // indirect
golang.org/x/text v0.8.0 // indirect
google.golang.org/genproto v0.0.0-20230306155012-7f2fa6fef1f4 // indirect
google.golang.org/grpc v1.53.0 // indirect
google.golang.org/protobuf v1.30.0 // indirect
github.com/gorilla/mux v1.8.0
github.com/lib/pq v1.10.8
golang.org/x/mod v0.8.0
)

View File

@ -1,35 +1,6 @@
github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw=
github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg=
github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI=
github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So=
golang.org/x/net v0.5.0 h1:GyT4nK/YDHSqa1c4753ouYCDajOYKTja9Xb/OHtgvSw=
golang.org/x/net v0.5.0/go.mod h1:DivGGAXEgPSlEBzxGzZI+ZLohi+xUj054jfeKui00ws=
golang.org/x/net v0.8.0 h1:Zrh2ngAOFYneWTAIAPethzeaQLuHwhuBkuV6ZiRnUaQ=
golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc=
golang.org/x/sys v0.4.0 h1:Zr2JFtRQNX3BCZ8YtxRE9hNJYC8J6I1MVbMg6owUp18=
golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.6.0 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ=
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/text v0.6.0 h1:3XmdazWV+ubf7QgHSTWeykHOci5oeekaGJBLkrkaw4k=
golang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
golang.org/x/text v0.8.0 h1:57P1ETyNKtuIjB4SRd15iJxuhj8Gc416Y78H3qgMh68=
golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
google.golang.org/genproto v0.0.0-20230109162033-3c3c17ce83e6 h1:uUn6GsgKK2eCI0bWeRMgRCcqDaQXYDuB+5tXA5Xeg/8=
google.golang.org/genproto v0.0.0-20230109162033-3c3c17ce83e6/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM=
google.golang.org/genproto v0.0.0-20230306155012-7f2fa6fef1f4 h1:DdoeryqhaXp1LtT/emMP1BRJPHHKFi5akj/nbx/zNTA=
google.golang.org/genproto v0.0.0-20230306155012-7f2fa6fef1f4/go.mod h1:NWraEVixdDnqcqQ30jipen1STv2r/n24Wb7twVTGR4s=
google.golang.org/grpc v1.51.0 h1:E1eGv1FTqoLIdnBCZufiSHgKjlqG6fKFf6pPWtMTh8U=
google.golang.org/grpc v1.51.0/go.mod h1:wgNDFcnuBGmxLKI/qn4T+m5BtEBYXJPvibbUPsAIPww=
google.golang.org/grpc v1.53.0 h1:LAv2ds7cmFV/XTS3XG1NneeENYrXGmorPxsBbptIjNc=
google.golang.org/grpc v1.53.0/go.mod h1:OnIrk0ipVdj4N5d9IUoFUx72/VlD7+jUsHwZgwSMQpw=
google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w=
google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
google.golang.org/protobuf v1.30.0 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cng=
google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
github.com/lib/pq v1.10.8 h1:3fdt97i/cwSU83+E0hZTC/Xpc9mTZxc6UWSCRcSbxiE=
github.com/lib/pq v1.10.8/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
golang.org/x/mod v0.8.0 h1:LUYupSeNrTNCGzR/hVBk2NHZO4hXcVaW1k4Qx7rjPx8=
golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=

36
src/backend/pkg/db/db.go Normal file
View File

@ -0,0 +1,36 @@
package db
import (
"database/sql"
"fmt"
_ "github.com/lib/pq"
)
// placeholder, replace with own
const (
host = "localhost"
port = 5432
user = "postgres"
password = "Gcvy4266"
dbname = "Panoptes"
)
func ConnectDB() *sql.DB {
psql := fmt.Sprintf("host=%s port=%d user=%s "+ "password=%s dbname=%s sslmode=disable", host, port, user, password, dbname)
db, err := sql.Open("postgres", psql)
if err != nil {
panic(err)
}
err = db.Ping()
if err != nil {
panic(err)
}
fmt.Printf("Successfully connected to db!")
return db
}
func CloseDB(db *sql.DB){
defer db.Close()
}