2023-12-23 18:27:07 +01:00
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
2023-12-27 18:00:18 +01:00
Answers [ ] QuestionAnswer
2023-12-23 18:27:07 +01:00
}
2023-12-27 18:00:18 +01:00
func GetUserQuestions ( respondentID int ) ( [ ] UserQuestions , error ) {
2023-12-23 18:27:07 +01:00
// 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 )
}
2024-01-14 12:19:37 +01:00
getQuestionsStatement := `
2024-01-17 18:52:10 +01:00
WITH FilteredQuestions AS (
SELECT s . SpørsmålID , s . tekst
FROM Spørsmål s
LEFT JOIN (
SELECT ss . spørsmålID
FROM Spørsmålsvar ss
LEFT JOIN SvarVurdering sv ON ss . svarID = sv . svarID
GROUP BY ss . spørsmålID
2024-01-26 14:37:25 +01:00
HAVING COUNT ( sv . vurderingID ) < 5
2024-01-17 18:52:10 +01:00
) AS subquery ON s . spørsmålID = subquery . spørsmålID
WHERE subquery . spørsmålID IS NOT NULL
LIMIT 5
) ,
RandomQuestions AS (
SELECT s . SpørsmålID , s . tekst
FROM Spørsmål s
WHERE s . SpørsmålID NOT IN ( SELECT SpørsmålID FROM FilteredQuestions )
ORDER BY RANDOM ( )
LIMIT 5
)
SELECT * FROM FilteredQuestions
UNION ALL
SELECT * FROM RandomQuestions
LIMIT 5
2024-01-14 12:19:37 +01:00
`
2023-12-23 18:27:07 +01:00
2023-12-27 16:31:43 +01:00
stmt , err := db . Prepare ( getQuestionsStatement )
if err != nil {
log . Fatalf ( "Error preparing statement: %v\n" , err )
}
defer stmt . Close ( )
2023-12-27 18:00:18 +01:00
var questionAnswers [ ] UserQuestions
2023-12-27 16:31:43 +01:00
2024-01-14 13:08:36 +01:00
rows , err := stmt . Query ( )
2023-12-27 18:00:18 +01:00
if err != nil {
return questionAnswers , err
}
defer rows . Close ( )
2023-12-27 16:31:43 +01:00
2023-12-27 18:00:18 +01:00
for rows . Next ( ) {
var question FormQuestion
if err := rows . Scan ( & question . QuestionID , & question . QuestionText ) ; err != nil {
return questionAnswers , err
}
2024-01-04 18:23:45 +01:00
getAnswersStatement :=
`
WITH TrueAnswer AS (
2023-12-27 18:00:18 +01:00
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
}
2023-12-23 18:27:07 +01:00
2023-12-27 18:00:18 +01:00
return questionAnswers , nil
2024-01-26 14:37:25 +01:00
}