Skip to content

Commit 9e8a4b1

Browse files
committed
Added API call to edit and create file requests, improved openapi
1 parent 5d10d5d commit 9e8a4b1

File tree

12 files changed

+372
-26
lines changed

12 files changed

+372
-26
lines changed

internal/configuration/database/Database.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -333,8 +333,9 @@ func GetAllFileRequests() []models.FileRequest {
333333
}
334334

335335
// SaveFileRequest stores the hotlink associated with the file in the database
336-
func SaveFileRequest(request models.FileRequest) {
337-
db.SaveFileRequest(request)
336+
// Returns the ID of the new request
337+
func SaveFileRequest(request models.FileRequest) int {
338+
return db.SaveFileRequest(request)
338339
}
339340

340341
// DeleteFileRequest deletes a file request with the given ID

internal/configuration/database/dbabstraction/DbAbstraction.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,8 @@ type Database interface {
103103
// GetAllFileRequests returns an array with all file requests
104104
GetAllFileRequests() []models.FileRequest
105105
// SaveFileRequest stores the hotlink associated with the file in the database
106-
SaveFileRequest(request models.FileRequest)
106+
// Returns the ID of the new request
107+
SaveFileRequest(request models.FileRequest) int
107108
// DeleteFileRequest deletes a file request with the given ID
108109
DeleteFileRequest(request models.FileRequest)
109110
}

internal/configuration/database/provider/redis/filerequests.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,8 @@ func sortFilerequests(users []models.FileRequest) []models.FileRequest {
5858
}
5959

6060
// SaveFileRequest stores the hotlink associated with the file in the database
61-
func (p DatabaseProvider) SaveFileRequest(request models.FileRequest) {
61+
// Returns the ID of the new request
62+
func (p DatabaseProvider) SaveFileRequest(request models.FileRequest) int {
6263
if request.Id == 0 {
6364
id := p.getIncreasedInt(prefixFileRequestCounter)
6465
request.Id = id
@@ -69,6 +70,7 @@ func (p DatabaseProvider) SaveFileRequest(request models.FileRequest) {
6970
}
7071
}
7172
p.setHashMap(p.buildArgs(prefixUsers + strconv.Itoa(request.Id)).AddFlat(request))
73+
return request.Id
7274
}
7375

7476
// DeleteFileRequest deletes a file request with the given ID

internal/configuration/database/provider/sqlite/Sqlite.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import (
1111

1212
"github.com/forceu/gokapi/internal/helper"
1313
"github.com/forceu/gokapi/internal/models"
14-
// Required for sqlite driver
14+
// Required for the sqlite driver
1515
_ "modernc.org/sqlite"
1616
)
1717

internal/configuration/database/provider/sqlite/filerequests.go

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,8 @@ func (p DatabaseProvider) GetAllFileRequests() []models.FileRequest {
6666
}
6767

6868
// SaveFileRequest stores the hotlink associated with the file in the database
69-
func (p DatabaseProvider) SaveFileRequest(request models.FileRequest) {
69+
// Returns the ID of the new request
70+
func (p DatabaseProvider) SaveFileRequest(request models.FileRequest) int {
7071
newData := schemaFileRequests{
7172
Id: request.Id,
7273
Name: request.Name,
@@ -79,15 +80,18 @@ func (p DatabaseProvider) SaveFileRequest(request models.FileRequest) {
7980

8081
// If ID is not 0, then an existing file request is being saved and needs to be
8182
// replaced in the database
82-
if newData.Id == 0 {
83-
_, err := p.sqliteDb.Exec("INSERT INTO UploadRequests (name, userid, expiry, maxFiles, maxSize, creation) VALUES (?, ?, ?, ?, ?, ?)",
84-
newData.Name, newData.UserId, newData.Expiry, newData.MaxFiles, newData.MaxSize, newData.Creation)
85-
helper.Check(err)
86-
} else {
83+
if newData.Id != 0 {
8784
_, err := p.sqliteDb.Exec("INSERT OR REPLACE INTO UploadRequests (id, name, userid, expiry, maxFiles, maxSize, creation) VALUES (?, ?, ?, ?, ?, ?, ?)",
8885
newData.Id, newData.Name, newData.UserId, newData.Expiry, newData.MaxFiles, newData.MaxSize, newData.Creation)
8986
helper.Check(err)
87+
return newData.Id
9088
}
89+
res, err := p.sqliteDb.Exec("INSERT INTO UploadRequests (name, userid, expiry, maxFiles, maxSize, creation) VALUES (?, ?, ?, ?, ?, ?)",
90+
newData.Name, newData.UserId, newData.Expiry, newData.MaxFiles, newData.MaxSize, newData.Creation)
91+
helper.Check(err)
92+
id, err := res.LastInsertId()
93+
helper.Check(err)
94+
return int(id)
9195
}
9296

9397
// DeleteFileRequest deletes a file request with the given ID

internal/models/User.go

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -64,23 +64,23 @@ func (u *User) IsSameUser(userId int) bool {
6464
}
6565

6666
const (
67-
// UserPermReplaceUploads allows replacing uploads
67+
// UserPermReplaceUploads allows replacing uploads PERM_REPLACE
6868
UserPermReplaceUploads UserPermission = 1 << iota
69-
// UserPermListOtherUploads allows also listing uploads by other users
69+
// UserPermListOtherUploads allows also listing uploads by other users PERM_LIST
7070
UserPermListOtherUploads
71-
// UserPermEditOtherUploads allows editing of uploads by other users
71+
// UserPermEditOtherUploads allows editing of uploads by other users PERM_EDIT
7272
UserPermEditOtherUploads
73-
// UserPermReplaceOtherUploads allows replacing of uploads by other users
73+
// UserPermReplaceOtherUploads allows replacing of uploads by other users PERM_REPLACE_OTHER
7474
UserPermReplaceOtherUploads
75-
// UserPermDeleteOtherUploads allows deleting uploads by other users
75+
// UserPermDeleteOtherUploads allows deleting uploads by other users PERM_DELETE
7676
UserPermDeleteOtherUploads
77-
// UserPermManageLogs allows viewing and deleting logs
77+
// UserPermManageLogs allows viewing and deleting logs PERM_LOGS
7878
UserPermManageLogs
79-
// UserPermManageApiKeys allows editing and deleting of API keys by other users
79+
// UserPermManageApiKeys allows editing and deleting of API keys by other users PERM_API
8080
UserPermManageApiKeys
81-
// UserPermManageUsers allows creating and editing of users, including granting and revoking permissions
81+
// UserPermManageUsers allows creating and editing of users, including granting and revoking permissions PERM_USERS
8282
UserPermManageUsers
83-
// UserPermGuestUploads allows creating file requests
83+
// UserPermGuestUploads allows creating file requests PERM_GUEST_UPLOAD
8484
UserPermGuestUploads
8585
)
8686

internal/webserver/api/Api.go

Lines changed: 50 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -773,7 +773,7 @@ func apiURequestDelete(w http.ResponseWriter, r requestParser, user models.User)
773773
sendError(w, http.StatusNotFound, "FileRequest does not exist with the given ID")
774774
return
775775
}
776-
if uploadRequest.UserId != user.Id && !user.HasPermission(models.UserPermListOtherUploads) {
776+
if uploadRequest.UserId != user.Id && !user.HasPermission(models.UserPermDeleteOtherUploads) {
777777
sendError(w, http.StatusUnauthorized, "No permission to delete this upload request")
778778
return
779779
}
@@ -782,6 +782,55 @@ func apiURequestDelete(w http.ResponseWriter, r requestParser, user models.User)
782782
_, _ = w.Write([]byte("{\"result\":\"OK\"}"))
783783
}
784784

785+
func apiURequestSave(w http.ResponseWriter, r requestParser, user models.User) {
786+
request, ok := r.(*paramURequestSave)
787+
if !ok {
788+
panic("invalid parameter passed")
789+
}
790+
uploadRequest := models.FileRequest{}
791+
792+
if !request.IsNewRequest {
793+
uploadRequest, ok = database.GetFileRequest(request.Id)
794+
if !ok {
795+
sendError(w, http.StatusNotFound, "FileRequest does not exist with the given ID")
796+
return
797+
}
798+
if uploadRequest.UserId != user.Id && !user.HasPermission(models.UserPermEditOtherUploads) {
799+
sendError(w, http.StatusUnauthorized, "No permission to edit this upload request")
800+
return
801+
}
802+
} else {
803+
uploadRequest.UserId = user.Id
804+
}
805+
806+
if request.Name == "" {
807+
if request.IsNameSet || uploadRequest.Name == "" {
808+
uploadRequest.Name = "Unnamed Request"
809+
}
810+
} else {
811+
uploadRequest.Name = request.Name
812+
}
813+
if request.IsExpirySet {
814+
uploadRequest.Expiry = request.Expiry
815+
}
816+
if request.IsMaxFilesSet {
817+
uploadRequest.MaxFiles = request.MaxFiles
818+
}
819+
if request.IsMaxSizeSet {
820+
uploadRequest.MaxSize = request.MaxSize
821+
}
822+
id := database.SaveFileRequest(uploadRequest)
823+
uploadRequest, ok = database.GetFileRequest(id)
824+
if !ok {
825+
sendError(w, http.StatusInternalServerError, "Could not save file request")
826+
return
827+
}
828+
uploadRequest.Populate(database.GetAllMetadata())
829+
result, err := json.Marshal(uploadRequest)
830+
helper.Check(err)
831+
_, _ = w.Write(result)
832+
}
833+
785834
func isAuthorisedForApi(r *http.Request, routing apiRoute) (models.User, bool) {
786835
apiKey := r.Header.Get("apikey")
787836
user, _, ok := isValidApiKey(apiKey, true, routing.ApiPerm)

internal/webserver/api/routing.go

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,12 @@ var routes = []apiRoute{
157157
execution: apiResetPassword,
158158
RequestParser: &paramUserResetPw{},
159159
},
160+
{
161+
Url: "/uploadrequest/save",
162+
ApiPerm: models.ApiPermManageFileRequests,
163+
execution: apiURequestSave,
164+
RequestParser: &paramURequestSave{},
165+
},
160166
{
161167
Url: "/uploadrequest/delete",
162168
ApiPerm: models.ApiPermManageFileRequests,
@@ -555,6 +561,40 @@ func (p *paramURequestDelete) ProcessParameter(_ *http.Request) error {
555561
return nil
556562
}
557563

564+
type paramURequestSave struct {
565+
Id int `header:"id"`
566+
Name string `header:"name"`
567+
Expiry int64 `header:"expiry"`
568+
MaxFiles int `header:"maxfiles"`
569+
MaxSize int `header:"maxsize"`
570+
IsNewRequest bool
571+
IsNameSet bool
572+
IsExpirySet bool
573+
IsMaxFilesSet bool
574+
IsMaxSizeSet bool
575+
576+
foundHeaders map[string]bool
577+
}
578+
579+
func (p *paramURequestSave) ProcessParameter(_ *http.Request) error {
580+
if !p.foundHeaders["id"] {
581+
p.IsNewRequest = true
582+
}
583+
if p.foundHeaders["name"] {
584+
p.IsNameSet = true
585+
}
586+
if p.foundHeaders["expiry"] {
587+
p.IsExpirySet = true
588+
}
589+
if p.foundHeaders["maxfiles"] {
590+
p.IsMaxFilesSet = true
591+
}
592+
if p.foundHeaders["maxsize"] {
593+
p.IsMaxSizeSet = true
594+
}
595+
return nil
596+
}
597+
558598
func checkHeaderExists(r *http.Request, key string, isRequired, isString bool) (bool, error) {
559599
if r.Header.Get(key) != "" {
560600
return true, nil

internal/webserver/api/routingParsing.go

Lines changed: 77 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)