/ keys / keys.go
keys.go
 1  // SPDX-FileCopyrightText: Amolith <amolith@secluded.site>
 2  //
 3  // SPDX-License-Identifier: AGPL-3.0-or-later
 4  
 5  package keys
 6  
 7  import (
 8  	"database/sql"
 9  	"fmt"
10  
11  	"adresilo-server/db"
12  )
13  
14  type Key = db.Key
15  
16  type Tier struct {
17  	ID      int
18  	Name    string
19  	Price   int
20  	Queries int
21  	Enabled bool
22  }
23  
24  // Generate generates a new key and stores it in the database
25  func Generate(tierID int, tiers []Tier, dbConn *sql.DB) (string, error) {
26  	key, err := db.InsertKey(tiers[tierID].Queries, dbConn)
27  	if err != nil {
28  		return "", fmt.Errorf("failed to generate and save key: %w", err)
29  	}
30  
31  	return key, nil
32  }
33  
34  // Authorised returns true if the key is authorised to make a request
35  func Authorised(keyID string, dbConn *sql.DB) (bool, error) {
36  	key, err := db.GetKey(keyID, dbConn)
37  	if err != nil {
38  		return false, fmt.Errorf("failed to get key from database: %w", err)
39  	}
40  
41  	if key.Disabled || key.Queries <= 0 {
42  		return false, nil
43  	}
44  	return true, nil
45  }
46  
47  // Disable disables a key
48  func Disable(key string, dbConn *sql.DB) error {
49  	return db.DisableKey(key, dbConn)
50  }
51  
52  // Delete permanently deletes a key
53  func Delete(key string, dbConn *sql.DB) error {
54  	return db.DeleteKey(key, dbConn)
55  }
56  
57  // Decrement decrements the number of queries remaining for a given key
58  func Decrement(key string, dbConn *sql.DB) error {
59  	return db.DecrementKey(key, dbConn)
60  }
61  
62  // Status returns the number of queries remaining for a given key
63  func Status(givenKey string, dbConn *sql.DB) (int, error) {
64  	key, err := db.GetKey(givenKey, dbConn)
65  	if err != nil {
66  		return 0, err
67  	}
68  
69  	return key.Queries, nil
70  }