fix: various lintings, simple improvements

This commit is contained in:
2025-08-25 23:41:43 -05:00
parent 2bf0e72e2e
commit 7edd1f16bf
4 changed files with 37 additions and 36 deletions

View File

@@ -23,9 +23,9 @@ import (
) )
var ( var (
latestSession string = "" latestSession string
sessionTime time.Time sessionTime time.Time
expiryTime time.Duration = 25 * time.Minute expiryTime = 25 * time.Minute
) )
// ResetSessionTimer resets the session timer to the current time. // ResetSessionTimer resets the session timer to the current time.
@@ -175,7 +175,7 @@ func (term BannerTerm) Archived() bool {
// GetTerms retrieves and parses the term information for a given search term. // GetTerms retrieves and parses the term information for a given search term.
// Page number must be at least 1. // Page number must be at least 1.
func GetTerms(search string, page int, max int) ([]BannerTerm, error) { func GetTerms(search string, page int, maxResults int) ([]BannerTerm, error) {
// Ensure offset is valid // Ensure offset is valid
if page <= 0 { if page <= 0 {
return nil, errors.New("offset must be greater than 0") return nil, errors.New("offset must be greater than 0")
@@ -185,7 +185,7 @@ func GetTerms(search string, page int, max int) ([]BannerTerm, error) {
"searchTerm": search, "searchTerm": search,
// Page vs Offset is not a mistake here, the API uses "offset" as the page number // Page vs Offset is not a mistake here, the API uses "offset" as the page number
"offset": strconv.Itoa(page), "offset": strconv.Itoa(page),
"max": strconv.Itoa(max), "max": strconv.Itoa(maxResults),
"_": utils.Nonce(), "_": utils.Nonce(),
}) })
@@ -214,7 +214,7 @@ func GetTerms(search string, page int, max int) ([]BannerTerm, error) {
} }
terms := make([]BannerTerm, 0, 10) terms := make([]BannerTerm, 0, 10)
json.Unmarshal(body, &terms) err = json.Unmarshal(body, &terms)
if err != nil { if err != nil {
return nil, fmt.Errorf("failed to parse terms: %w", err) return nil, fmt.Errorf("failed to parse terms: %w", err)
@@ -225,14 +225,14 @@ func GetTerms(search string, page int, max int) ([]BannerTerm, error) {
// SelectTerm selects the given term in the Banner system. // SelectTerm selects the given term in the Banner system.
// This function completes the initial term selection process, which is required before any other API calls can be made with the session ID. // This function completes the initial term selection process, which is required before any other API calls can be made with the session ID.
func SelectTerm(term string, sessionId string) error { func SelectTerm(term string, sessionID string) error {
form := url.Values{ form := url.Values{
"term": {term}, "term": {term},
"studyPath": {""}, "studyPath": {""},
"studyPathText": {""}, "studyPathText": {""},
"startDatepicker": {""}, "startDatepicker": {""},
"endDatepicker": {""}, "endDatepicker": {""},
"uniqueSessionId": {sessionId}, "uniqueSessionId": {sessionID},
} }
params := map[string]string{ params := map[string]string{
@@ -249,7 +249,7 @@ func SelectTerm(term string, sessionId string) error {
// Assert that the response is JSON // Assert that the response is JSON
if !utils.ContentTypeMatch(res, "application/json") { if !utils.ContentTypeMatch(res, "application/json") {
return fmt.Errorf("response was not JSON: %w", res.Header.Get("Content-Type")) return fmt.Errorf("response was not JSON: %s", res.Header.Get("Content-Type"))
} }
// Acquire fwdUrl // Acquire fwdUrl
@@ -260,12 +260,12 @@ func SelectTerm(term string, sessionId string) error {
} }
var redirectResponse struct { var redirectResponse struct {
FwdUrl string `json:"fwdUrl"` FwdURL string `json:"fwdUrl"`
} }
json.Unmarshal(body, &redirectResponse) json.Unmarshal(body, &redirectResponse)
// Make a GET request to the fwdUrl // Make a GET request to the fwdUrl
req = utils.BuildRequest("GET", redirectResponse.FwdUrl, nil) req = utils.BuildRequest("GET", redirectResponse.FwdURL, nil)
res, err = DoRequest(req) res, err = DoRequest(req)
if err != nil { if err != nil {
return fmt.Errorf("failed to follow redirect: %w", err) return fmt.Errorf("failed to follow redirect: %w", err)
@@ -273,7 +273,7 @@ func SelectTerm(term string, sessionId string) error {
// Assert that the response is OK (200) // Assert that the response is OK (200)
if res.StatusCode != 200 { if res.StatusCode != 200 {
return fmt.Errorf("redirect response was not 200: %w", res.StatusCode) return fmt.Errorf("redirect response was not 200: %d", res.StatusCode)
} }
return nil return nil
@@ -281,7 +281,7 @@ func SelectTerm(term string, sessionId string) error {
// GetPartOfTerms retrieves and parses the part of term information for a given term. // GetPartOfTerms retrieves and parses the part of term information for a given term.
// Ensure that the offset is greater than 0. // Ensure that the offset is greater than 0.
func GetPartOfTerms(search string, term int, offset int, max int) ([]BannerTerm, error) { func GetPartOfTerms(search string, term int, offset int, maxResults int) ([]BannerTerm, error) {
// Ensure offset is valid // Ensure offset is valid
if offset <= 0 { if offset <= 0 {
return nil, errors.New("offset must be greater than 0") return nil, errors.New("offset must be greater than 0")
@@ -291,7 +291,7 @@ func GetPartOfTerms(search string, term int, offset int, max int) ([]BannerTerm,
"searchTerm": search, "searchTerm": search,
"term": strconv.Itoa(term), "term": strconv.Itoa(term),
"offset": strconv.Itoa(offset), "offset": strconv.Itoa(offset),
"max": strconv.Itoa(max), "max": strconv.Itoa(maxResults),
"uniqueSessionId": GetSession(), "uniqueSessionId": GetSession(),
"_": utils.Nonce(), "_": utils.Nonce(),
}) })
@@ -325,7 +325,7 @@ func GetPartOfTerms(search string, term int, offset int, max int) ([]BannerTerm,
// In my opinion, it is unclear what providing the term does, as the results should be the same regardless of the term. // In my opinion, it is unclear what providing the term does, as the results should be the same regardless of the term.
// This function is included for completeness, but probably isn't useful. // This function is included for completeness, but probably isn't useful.
// Ensure that the offset is greater than 0. // Ensure that the offset is greater than 0.
func GetInstructors(search string, term string, offset int, max int) ([]Instructor, error) { func GetInstructors(search string, term string, offset int, maxResults int) ([]Instructor, error) {
// Ensure offset is valid // Ensure offset is valid
if offset <= 0 { if offset <= 0 {
return nil, errors.New("offset must be greater than 0") return nil, errors.New("offset must be greater than 0")
@@ -335,7 +335,7 @@ func GetInstructors(search string, term string, offset int, max int) ([]Instruct
"searchTerm": search, "searchTerm": search,
"term": term, "term": term,
"offset": strconv.Itoa(offset), "offset": strconv.Itoa(offset),
"max": strconv.Itoa(max), "max": strconv.Itoa(maxResults),
"uniqueSessionId": GetSession(), "uniqueSessionId": GetSession(),
"_": utils.Nonce(), "_": utils.Nonce(),
}) })
@@ -445,7 +445,7 @@ func Search(query *Query, sort string, sortDescending bool) (*models.SearchResul
// GetSubjects retrieves and parses the subject information for a given search term. // GetSubjects retrieves and parses the subject information for a given search term.
// The results of this response shouldn't change much, but technically could as new majors are developed, or old ones are removed. // The results of this response shouldn't change much, but technically could as new majors are developed, or old ones are removed.
// Ensure that the offset is greater than 0. // Ensure that the offset is greater than 0.
func GetSubjects(search string, term string, offset int, max int) ([]Pair, error) { func GetSubjects(search string, term string, offset int, maxResults int) ([]Pair, error) {
// Ensure offset is valid // Ensure offset is valid
if offset <= 0 { if offset <= 0 {
return nil, errors.New("offset must be greater than 0") return nil, errors.New("offset must be greater than 0")
@@ -455,7 +455,7 @@ func GetSubjects(search string, term string, offset int, max int) ([]Pair, error
"searchTerm": search, "searchTerm": search,
"term": term, "term": term,
"offset": strconv.Itoa(offset), "offset": strconv.Itoa(offset),
"max": strconv.Itoa(max), "max": strconv.Itoa(maxResults),
"uniqueSessionId": GetSession(), "uniqueSessionId": GetSession(),
"_": utils.Nonce(), "_": utils.Nonce(),
}) })
@@ -489,7 +489,7 @@ func GetSubjects(search string, term string, offset int, max int) ([]Pair, error
// In my opinion, it is unclear what providing the term does, as the results should be the same regardless of the term. // In my opinion, it is unclear what providing the term does, as the results should be the same regardless of the term.
// This function is included for completeness, but probably isn't useful. // This function is included for completeness, but probably isn't useful.
// Ensure that the offset is greater than 0. // Ensure that the offset is greater than 0.
func GetCampuses(search string, term int, offset int, max int) ([]Pair, error) { func GetCampuses(search string, term int, offset int, maxResults int) ([]Pair, error) {
// Ensure offset is valid // Ensure offset is valid
if offset <= 0 { if offset <= 0 {
return nil, errors.New("offset must be greater than 0") return nil, errors.New("offset must be greater than 0")
@@ -499,7 +499,7 @@ func GetCampuses(search string, term int, offset int, max int) ([]Pair, error) {
"searchTerm": search, "searchTerm": search,
"term": strconv.Itoa(term), "term": strconv.Itoa(term),
"offset": strconv.Itoa(offset), "offset": strconv.Itoa(offset),
"max": strconv.Itoa(max), "max": strconv.Itoa(maxResults),
"uniqueSessionId": GetSession(), "uniqueSessionId": GetSession(),
"_": utils.Nonce(), "_": utils.Nonce(),
}) })
@@ -533,7 +533,7 @@ func GetCampuses(search string, term int, offset int, max int) ([]Pair, error) {
// In my opinion, it is unclear what providing the term does, as the results should be the same regardless of the term. // In my opinion, it is unclear what providing the term does, as the results should be the same regardless of the term.
// This function is included for completeness, but probably isn't useful. // This function is included for completeness, but probably isn't useful.
// Ensure that the offset is greater than 0. // Ensure that the offset is greater than 0.
func GetInstructionalMethods(search string, term string, offset int, max int) ([]Pair, error) { func GetInstructionalMethods(search string, term string, offset int, maxResults int) ([]Pair, error) {
// Ensure offset is valid // Ensure offset is valid
if offset <= 0 { if offset <= 0 {
return nil, errors.New("offset must be greater than 0") return nil, errors.New("offset must be greater than 0")
@@ -543,7 +543,7 @@ func GetInstructionalMethods(search string, term string, offset int, max int) ([
"searchTerm": search, "searchTerm": search,
"term": term, "term": term,
"offset": strconv.Itoa(offset), "offset": strconv.Itoa(offset),
"max": strconv.Itoa(max), "max": strconv.Itoa(maxResults),
"uniqueSessionId": GetSession(), "uniqueSessionId": GetSession(),
"_": utils.Nonce(), "_": utils.Nonce(),
}) })

View File

@@ -140,11 +140,10 @@ func ScrapeMajor(subject string) error {
log.Debug().Str("subject", subject).Int("nextOffset", offset).Msg("Sleeping before next page") log.Debug().Str("subject", subject).Int("nextOffset", offset).Msg("Sleeping before next page")
time.Sleep(time.Second * 3) time.Sleep(time.Second * 3)
continue continue
} else {
// Log the number of classes scraped
log.Info().Str("subject", subject).Int("total", totalClassCount).Msgf("Subject %s Scraped", subject)
break
} }
// Log the number of classes scraped
log.Info().Str("subject", subject).Int("total", totalClassCount).Msgf("Subject %s Scraped", subject)
break
} }
term := utils.Default(time.Now()).ToString() term := utils.Default(time.Now()).ToString()
@@ -180,7 +179,7 @@ func CalculateExpiry(term string, count int, priority bool) time.Duration {
// Subjects with less than 50 classes have a reversed expiry (less classes, longer interval) // Subjects with less than 50 classes have a reversed expiry (less classes, longer interval)
// 1 class => 12 hours, 49 classes => 1 hour // 1 class => 12 hours, 49 classes => 1 hour
if count < 50 { if count < 50 {
hours := utils.Slope(utils.Point{1, 12}, utils.Point{49, 1}, float64(count)).Y hours := utils.Slope(utils.Point{X: 1, Y: 12}, utils.Point{X: 49, Y: 1}, float64(count)).Y
baseExpiry = time.Duration(hours * float64(time.Hour)) baseExpiry = time.Duration(hours * float64(time.Hour))
} }

View File

@@ -95,11 +95,13 @@ func (q *Query) TermPart(termPart []string) *Query {
return q return q
} }
// Campus sets the campuses for the query
func (q *Query) Campus(campus []string) *Query { func (q *Query) Campus(campus []string) *Query {
q.campus = &campus q.campus = &campus
return q return q
} }
// InstructionalMethod sets the instructional methods for the query
func (q *Query) InstructionalMethod(instructionalMethod []string) *Query { func (q *Query) InstructionalMethod(instructionalMethod []string) *Query {
q.instructionalMethod = &instructionalMethod q.instructionalMethod = &instructionalMethod
return q return q

View File

@@ -12,39 +12,39 @@ func Setup() {
// Makes the initial requests that sets up the session cookies for the rest of the application // Makes the initial requests that sets up the session cookies for the rest of the application
log.Info().Msg("Setting up session...") log.Info().Msg("Setting up session...")
request_queue := []string{ requestQueue := []string{
"/registration/registration", "/registration/registration",
"/selfServiceMenu/data", "/selfServiceMenu/data",
} }
for _, path := range request_queue { for _, path := range requestQueue {
req := utils.BuildRequest("GET", path, nil) req := utils.BuildRequest("GET", path, nil)
DoRequest(req) DoRequest(req)
} }
// Validate that cookies were set // Validate that cookies were set
baseUrlParsed, err := url.Parse(config.BaseURL) baseURLParsed, err := url.Parse(config.BaseURL)
if err != nil { if err != nil {
log.Fatal().Stack().Str("baseURL", config.BaseURL).Err(err).Msg("Failed to parse baseURL") log.Fatal().Stack().Str("baseURL", config.BaseURL).Err(err).Msg("Failed to parse baseURL")
} }
current_cookies := config.Client.Jar.Cookies(baseUrlParsed) currentCookies := config.Client.Jar.Cookies(baseURLParsed)
required_cookies := map[string]bool{ requiredCookies := map[string]bool{
"JSESSIONID": false, "JSESSIONID": false,
"SSB_COOKIE": false, "SSB_COOKIE": false,
} }
for _, cookie := range current_cookies { for _, cookie := range currentCookies {
_, present := required_cookies[cookie.Name] _, present := requiredCookies[cookie.Name]
// Check if this cookie is required // Check if this cookie is required
if present { if present {
required_cookies[cookie.Name] = true requiredCookies[cookie.Name] = true
} }
} }
// Check if all required cookies were set // Check if all required cookies were set
for cookieName, cookie_set := range required_cookies { for cookieName, cookieSet := range requiredCookies {
if !cookie_set { if !cookieSet {
log.Warn().Str("cookieName", cookieName).Msg("Required cookie not set") log.Warn().Str("cookieName", cookieName).Msg("Required cookie not set")
} }
} }