🚚 moved db folder

Co-authored-by: Sindre Kjelsrud <kjelsrudsindre@gmail.com>
This commit is contained in:
haraldnilsen 2024-01-13 12:00:08 +01:00
parent cb25a3b35a
commit 98f25c1b32
7 changed files with 1 additions and 1 deletions

85
backend/cmd/db/db.go Normal file
View file

@ -0,0 +1,85 @@
package db
import (
"database/sql"
"fmt"
"log"
_ "github.com/lib/pq"
)
const (
host = "localhost"
port = 5432 // This is the default port for PostgreSQL
user = "admin"
password = "helse123"
dbname = "helseveileder"
)
func SetupDb() {
// Connection string
psqlInfo := fmt.Sprintf("host=%s port=%d user=%s "+
"password=%s dbname=%s sslmode=disable",
host, port, user, password, dbname)
// Connect to the database
db, err := sql.Open("postgres", psqlInfo)
if err != nil {
log.Fatalf("Error opening database: %v\n", err)
}
defer db.Close()
// Check the connection
err = db.Ping()
if err != nil {
log.Fatalf("Error connecting to the database: %v\n", err)
}
// SQL statements to create tables
createTableStatements := []string{
`CREATE TABLE IF NOT EXISTS Spørsmål (
spørsmålID SERIAL PRIMARY KEY,
tekst TEXT NOT NULL
);`,
`CREATE TABLE IF NOT EXISTS SpørsmålSvar (
svarID SERIAL PRIMARY KEY,
spørsmålID INT REFERENCES Spørsmål(spørsmålID),
chatgpt BOOL NOT NULL,
svartekst TEXT NOT NULL
);`,
`CREATE TABLE IF NOT EXISTS Respondent (
respondentID SERIAL PRIMARY KEY,
alder TEXT NOT NULL,
utdanningsgrad TEXT NOT NULL,
helsepersonell BOOL NOT NULL,
kjønn TEXT NOT NULL,
svartfør BOOL NOT NULL,
fylke TEXT NOT NULL,
dato TEXT NOT NULL
);`,
`CREATE TABLE IF NOT EXISTS SvarVurdering (
vurderingID SERIAL PRIMARY KEY,
respondentID INT REFERENCES Respondent(respondentID),
svarID INT REFERENCES SpørsmålSvar(svarID),
kunnskap INT,
empati INT,
hjelpsomhet INT
);`,
`CREATE TABLE IF NOT EXISTS Evaluering (
evalueringtekst TEXT
);`,
`CREATE TABLE IF NOT EXISTS FeilRapport (
feiltekst TEXT
);`,
}
// Execute SQL statements
for _, stmt := range createTableStatements {
_, err := db.Exec(stmt)
if err != nil {
log.Fatalf("Error creating table: %v\n", err)
}
}
fmt.Println("Tables created successfully.")
}

View file

@ -0,0 +1,138 @@
package db
import (
"database/sql"
"fmt"
"log"
_ "github.com/lib/pq"
)
type FormQuestion struct {
QuestionID int
QuestionText string
}
type QuestionAnswer struct {
AnswerID int
QuestionID int
IsChatGPT bool
AnswerText string
}
type UserQuestions struct {
Question FormQuestion
Answers []QuestionAnswer
}
func GetUserQuestions(respondentID int) ([]UserQuestions, error) {
// Connection string
psqlInfo := fmt.Sprintf("host=%s port=%d user=%s "+
"password=%s dbname=%s sslmode=disable",
host, port, user, password, dbname)
// Connect to the database
db, err := sql.Open("postgres", psqlInfo)
if err != nil {
log.Fatalf("Error opening database: %v\n", err)
}
defer db.Close()
// Check the connection
err = db.Ping()
if err != nil {
log.Fatalf("Error connecting to the database: %v\n", err)
}
getQuestionsStatement := `SELECT s.SpørsmålID, s.tekst
FROM Spørsmål s
LEFT JOIN Spørsmålsvar ss ON s.spørsmålID = ss.spørsmålID
LEFT JOIN SvarVurdering sv ON ss.svarID = sv.svarID AND sv.respondentID = $1
WHERE sv.vurderingID IS NULL
LIMIT 5`
stmt, err := db.Prepare(getQuestionsStatement)
if err != nil {
log.Fatalf("Error preparing statement: %v\n", err)
}
defer stmt.Close()
var questionAnswers []UserQuestions
rows, err := stmt.Query(respondentID)
if err != nil {
return questionAnswers, err
}
defer rows.Close()
for rows.Next() {
var question FormQuestion
if err := rows.Scan(&question.QuestionID, &question.QuestionText); err != nil {
return questionAnswers, err
}
getAnswersStatement :=
`
WITH TrueAnswer AS (
SELECT ss.svarID
FROM SpørsmålSvar ss
WHERE ss.spørsmålID = $1
AND ss.chatgpt = TRUE
AND NOT EXISTS (
SELECT 1
FROM SvarVurdering sv
WHERE sv.svarID = ss.svarID
AND sv.respondentID = $2
)
LIMIT 1
),
FalseAnswer AS (
SELECT ss.svarID
FROM SpørsmålSvar ss
WHERE ss.spørsmålID = $1
AND ss.chatgpt = FALSE
AND NOT EXISTS (
SELECT 1
FROM SvarVurdering sv
WHERE sv.svarID = ss.svarID
AND sv.respondentID = $2
)
LIMIT 1
)
SELECT ss.svarID, ss.spørsmålID, ss.chatgpt, ss.svartekst
FROM SpørsmålSvar ss
WHERE ss.svarID IN (SELECT svarID FROM TrueAnswer UNION ALL SELECT svarID FROM FalseAnswer);
`
stmt, err := db.Prepare(getAnswersStatement)
if err != nil {
log.Fatalf("Error preparing statement: %v\n", err)
}
defer stmt.Close()
var answers []QuestionAnswer
// var questionAnswers[5] UserQuestions
rows, err := stmt.Query(question.QuestionID, respondentID)
if err != nil {
return questionAnswers, err
}
defer rows.Close()
for rows.Next() {
var answer QuestionAnswer
if err := rows.Scan(&answer.AnswerID, &answer.QuestionID, &answer.IsChatGPT, &answer.AnswerText); err != nil {
return questionAnswers, err
}
answers = append(answers, answer)
}
questionAnswers = append(questionAnswers, UserQuestions{Question: question, Answers: answers})
}
if err = rows.Err(); err != nil {
return questionAnswers, err
}
return questionAnswers, nil
}

View file

@ -0,0 +1,48 @@
package db
import (
"database/sql"
"fmt"
"log"
_ "github.com/lib/pq"
)
func InsertBugReport(bugText string) (error) {
// Connection string
psqlInfo := fmt.Sprintf("host=%s port=%d user=%s "+
"password=%s dbname=%s sslmode=disable",
host, port, user, password, dbname)
// Connect to the database
db, err := sql.Open("postgres", psqlInfo)
if err != nil {
log.Fatalf("Error opening database: %v\n", err)
}
defer db.Close()
// Check the connection
err = db.Ping()
if err != nil {
log.Fatalf("Error connecting to the database: %v\n", err)
}
insertStatement := `
INSERT INTO FeilRapport (feiltekst)
VALUES ($1)
`
stmt, err := db.Prepare(insertStatement)
if err != nil {
log.Fatalf("Error preparing statement: %v\n", err)
}
defer stmt.Close()
_, err = stmt.Exec(bugText)
if err != nil {
log.Fatalf("Error executing statement: %v\n", err)
}
fmt.Print("Inserted bug successfully")
return nil
}

View file

@ -0,0 +1,48 @@
package db
import (
"database/sql"
"fmt"
"log"
_ "github.com/lib/pq"
)
func InsertEvaluation(evaluationText string) (error) {
// Connection string
psqlInfo := fmt.Sprintf("host=%s port=%d user=%s "+
"password=%s dbname=%s sslmode=disable",
host, port, user, password, dbname)
// Connect to the database
db, err := sql.Open("postgres", psqlInfo)
if err != nil {
log.Fatalf("Error opening database: %v\n", err)
}
defer db.Close()
// Check the connection
err = db.Ping()
if err != nil {
log.Fatalf("Error connecting to the database: %v\n", err)
}
insertStatement := `
INSERT INTO Evaluering (evalueringtekst)
VALUES ($1)
`
stmt, err := db.Prepare(insertStatement)
if err != nil {
log.Fatalf("Error preparing statement: %v\n", err)
}
defer stmt.Close()
_, err = stmt.Exec(evaluationText)
if err != nil {
log.Fatalf("Error executing statement: %v\n", err)
}
fmt.Print("Inserted evaluation successfully")
return nil
}

View file

@ -0,0 +1,107 @@
package db
import (
"database/sql"
"encoding/json"
"fmt"
"log"
_ "github.com/lib/pq"
)
type FormAnswer struct {
AnswerID int
Ratings []int
}
type AllFormAnswers []FormAnswer
func InsertUserAnswers(respondentId int, allAnswers string) (error) {
// Connection string
psqlInfo := fmt.Sprintf("host=%s port=%d user=%s "+
"password=%s dbname=%s sslmode=disable",
host, port, user, password, dbname)
// Connect to the database
db, err := sql.Open("postgres", psqlInfo)
if err != nil {
log.Fatalf("Error opening database: %v\n", err)
}
defer db.Close()
// Check the connection
err = db.Ping()
if err != nil {
log.Fatalf("Error connecting to the database: %v\n", err)
}
var convertedFormAnswers = convertAnswerFormat(allAnswers)
for _,formanswer := range convertedFormAnswers {
insertStatement := `
INSERT INTO SvarVurdering (svarID, respondentID, kunnskap, empati, hjelpsomhet)
VALUES ($1, $2, $3, $4, $5)
`
stmt, err := db.Prepare(insertStatement)
if err != nil {
log.Fatalf("Error preparing statement: %v\n", err)
}
defer stmt.Close()
kunnskap := formanswer.Ratings[0]
empati := formanswer.Ratings[1]
hjelpsomhet := formanswer.Ratings[2]
_, err = stmt.Exec(formanswer.AnswerID, respondentId, kunnskap, empati, hjelpsomhet)
if err != nil {
log.Fatalf("Error executing statement: %v\n", err)
}
}
fmt.Print("Inserted data successfully")
return nil
}
func convertAnswerFormat(allAnswers string) (AllFormAnswers) {
// Define an intermediate structure that matches the input format
var intermediate [][]interface{}
// Parse the JSON string into the intermediate structure
err := json.Unmarshal([]byte(allAnswers), &intermediate)
if err != nil {
log.Fatalf("Error parsing JSON: %v", err)
}
// Convert the intermediate structure to OuterSlice
var result AllFormAnswers
for _, pair := range intermediate {
if len(pair) != 2 {
log.Fatalf("Invalid pair length: %v", pair)
}
number, ok := pair[0].(float64) // JSON numbers are parsed as float64
if !ok {
log.Fatalf("Expected a number, got: %v", pair[0])
}
arrayInterface, ok := pair[1].([]interface{})
if !ok {
log.Fatalf("Expected an array, got: %v", pair[1])
}
var array []int
for _, item := range arrayInterface {
num, ok := item.(float64)
if !ok {
log.Fatalf("Expected a number in array, got: %v", item)
}
array = append(array, int(num))
}
result = append(result, FormAnswer{AnswerID: int(number), Ratings: array})
}
return result
}

View file

@ -0,0 +1,51 @@
package db
import (
"database/sql"
"fmt"
"log"
_ "github.com/lib/pq"
)
func InsertUserData(age string, education string, healthcarepersonell bool, gender string, answeredbefore bool, county string, submitdate string) (int, error) {
// Connection string
psqlInfo := fmt.Sprintf("host=%s port=%d user=%s "+
"password=%s dbname=%s sslmode=disable",
host, port, user, password, dbname)
// Connect to the database
db, err := sql.Open("postgres", psqlInfo)
if err != nil {
log.Fatalf("Error opening database: %v\n", err)
}
defer db.Close()
// Check the connection
err = db.Ping()
if err != nil {
log.Fatalf("Error connecting to the database: %v\n", err)
}
insertStatement := `
INSERT INTO Respondent (alder, utdanningsgrad, helsepersonell, kjønn, svartfør, fylke, dato)
VALUES ($1, $2, $3, $4, $5, $6, $7)
RETURNING respondentID
`
stmt, err := db.Prepare(insertStatement)
if err != nil {
log.Fatalf("Error preparing statement: %v\n", err)
}
defer stmt.Close()
var respondentID int
err = stmt.QueryRow(age, education, healthcarepersonell, gender, answeredbefore, county, submitdate).Scan(&respondentID)
if err != nil {
log.Fatalf("Error inserting userdata: %v\n", err)
}
fmt.Printf("Data inserted successfully with respondentID: %d\n", respondentID)
return respondentID, nil
}