2025-12-27 19:27:08 +00:00
swagger : "2.0"
2025-12-13 22:44:37 +00:00
info :
2025-12-27 19:27:08 +00:00
description : "Drexa is a file storage and management API. It provides endpoints for authentication, user management, file uploads, and virtual filesystem operations."
title : "Drexa API"
2025-12-13 22:44:37 +00:00
contact :
2025-12-27 19:27:08 +00:00
name : "Drexa Support"
url : "https://github.com/get-drexa/drexa"
2025-12-13 22:44:37 +00:00
license :
2025-12-27 19:27:08 +00:00
name : "MIT"
url : "https://opensource.org/licenses/MIT"
2025-12-13 22:44:37 +00:00
version : "1.0"
2025-12-27 19:27:08 +00:00
host : "localhost:8080"
basePath : "/api"
2025-12-13 22:44:37 +00:00
paths :
/accounts :
2025-12-27 19:27:08 +00:00
get :
security :
-
BearerAuth : [ ]
description : "Retrieve all accounts for the authenticated user"
produces :
- "application/json"
tags :
- "accounts"
summary : "List accounts"
responses :
200 :
description : "List of accounts for the authenticated user"
schema :
type : "array"
items :
$ref : "#/definitions/internal_account.Account"
401 :
description : "Not authenticated"
schema :
type : "string"
2025-12-13 22:44:37 +00:00
post :
2025-12-27 19:27:08 +00:00
description : "Create a new user account with email and password. Returns the account, user, and authentication tokens. Tokens can be delivered via HTTP-only cookies or in the response body based on the tokenDelivery field."
2025-12-13 22:44:37 +00:00
consumes :
2025-12-27 19:27:08 +00:00
- "application/json"
2025-12-13 22:44:37 +00:00
produces :
2025-12-27 19:27:08 +00:00
- "application/json"
tags :
- "accounts"
summary : "Register new account"
parameters :
-
description : "Registration details"
name : "request"
in : "body"
required : true
schema :
$ref : "#/definitions/internal_account.registerAccountRequest"
2025-12-13 22:44:37 +00:00
responses :
2025-12-27 19:27:08 +00:00
200 :
description : "Account created successfully"
2025-12-13 22:44:37 +00:00
schema :
2025-12-27 19:27:08 +00:00
$ref : "#/definitions/internal_account.registerAccountResponse"
400 :
description : "Invalid request body or token delivery method"
2025-12-13 22:44:37 +00:00
schema :
2025-12-27 19:27:08 +00:00
type : "string"
409 :
description : "Email already registered"
2025-12-13 22:44:37 +00:00
schema :
2025-12-27 19:27:08 +00:00
type : "string"
2025-12-13 22:44:37 +00:00
/accounts/{accountID}:
get :
2025-12-27 19:27:08 +00:00
security :
-
BearerAuth : [ ]
description : "Retrieve account details including storage usage and quota"
2025-12-13 22:44:37 +00:00
produces :
2025-12-27 19:27:08 +00:00
- "application/json"
tags :
- "accounts"
summary : "Get account"
parameters :
-
type : "string"
format : "uuid"
description : "Account ID"
name : "accountID"
in : "path"
required : true
2025-12-13 22:44:37 +00:00
responses :
2025-12-27 19:27:08 +00:00
200 :
description : "Account details"
2025-12-13 22:44:37 +00:00
schema :
2025-12-27 19:27:08 +00:00
$ref : "#/definitions/internal_account.Account"
401 :
description : "Not authenticated"
2025-12-13 22:44:37 +00:00
schema :
2025-12-27 19:27:08 +00:00
type : "string"
404 :
description : "Account not found"
2025-12-13 22:44:37 +00:00
schema :
2025-12-27 19:27:08 +00:00
type : "string"
2025-12-13 22:44:37 +00:00
/accounts/{accountID}/directories:
post :
2025-12-27 19:27:08 +00:00
security :
-
BearerAuth : [ ]
description : "Create a new directory within a parent directory"
2025-12-13 22:44:37 +00:00
consumes :
2025-12-27 19:27:08 +00:00
- "application/json"
2025-12-13 22:44:37 +00:00
produces :
2025-12-27 19:27:08 +00:00
- "application/json"
tags :
- "directories"
summary : "Create directory"
parameters :
-
type : "string"
format : "uuid"
description : "Account ID"
name : "accountID"
in : "path"
required : true
-
description : "Directory details"
name : "request"
in : "body"
required : true
schema :
$ref : "#/definitions/internal_catalog.createDirectoryRequest"
-
enum :
- "path"
type : "string"
description : "Include additional fields"
name : "include"
in : "query"
2025-12-13 22:44:37 +00:00
responses :
2025-12-27 19:27:08 +00:00
200 :
description : "Created directory"
2025-12-13 22:44:37 +00:00
schema :
2025-12-27 19:27:08 +00:00
$ref : "#/definitions/internal_catalog.DirectoryInfo"
400 :
description : "Parent not found or not a directory"
2025-12-13 22:44:37 +00:00
schema :
2025-12-27 19:27:08 +00:00
type : "object"
2025-12-13 22:44:37 +00:00
additionalProperties :
2025-12-27 19:27:08 +00:00
type : "string"
401 :
description : "Not authenticated"
2025-12-13 22:44:37 +00:00
schema :
2025-12-27 19:27:08 +00:00
type : "string"
409 :
description : "Directory already exists"
2025-12-13 22:44:37 +00:00
schema :
2025-12-27 19:27:08 +00:00
type : "object"
2025-12-13 22:44:37 +00:00
additionalProperties :
2025-12-27 19:27:08 +00:00
type : "string"
delete :
2025-12-13 22:44:37 +00:00
security :
2025-12-27 19:27:08 +00:00
-
BearerAuth : [ ]
description : "Delete multiple directories permanently or move them to trash. Deleting directories also affects all their contents. All items must be directories."
2025-12-13 22:44:37 +00:00
tags :
2025-12-27 19:27:08 +00:00
- "directories"
summary : "Bulk delete directories"
2025-12-13 22:44:37 +00:00
parameters :
2025-12-27 19:27:08 +00:00
-
type : "string"
format : "uuid"
description : "Account ID"
name : "accountID"
in : "path"
required : true
-
type : "string"
description : "Comma-separated list of directory IDs to delete"
name : "id"
in : "query"
required : true
-
type : "boolean"
default : false
description : "Move to trash instead of permanent delete"
name : "trash"
in : "query"
2025-12-13 22:44:37 +00:00
responses :
2025-12-27 19:27:08 +00:00
200 :
description : "Trashed directories (when trash=true)"
schema :
type : "array"
items :
$ref : "#/definitions/internal_catalog.DirectoryInfo"
204 :
description : "Directories deleted"
2025-12-13 22:44:37 +00:00
schema :
2025-12-27 19:27:08 +00:00
type : "string"
400 :
description : "All items must be directories"
2025-12-13 22:44:37 +00:00
schema :
2025-12-27 19:27:08 +00:00
type : "object"
additionalProperties :
type : "string"
401 :
description : "Not authenticated"
2025-12-13 22:44:37 +00:00
schema :
2025-12-27 19:27:08 +00:00
type : "string"
/accounts/{accountID}/directories/{directoryID}:
get :
2025-12-13 22:44:37 +00:00
security :
2025-12-27 19:27:08 +00:00
-
BearerAuth : [ ]
description : "Retrieve metadata for a specific directory"
produces :
- "application/json"
2025-12-13 22:44:37 +00:00
tags :
2025-12-27 19:27:08 +00:00
- "directories"
summary : "Get directory info"
2025-12-13 22:44:37 +00:00
parameters :
2025-12-27 19:27:08 +00:00
-
type : "string"
format : "uuid"
description : "Account ID"
name : "accountID"
in : "path"
required : true
-
type : "string"
description : "Directory ID"
name : "directoryID"
in : "path"
required : true
-
enum :
- "path"
type : "string"
description : "Include additional fields"
name : "include"
in : "query"
2025-12-13 22:44:37 +00:00
responses :
2025-12-27 19:27:08 +00:00
200 :
description : "Directory metadata"
2025-12-13 22:44:37 +00:00
schema :
2025-12-27 19:27:08 +00:00
$ref : "#/definitions/internal_catalog.DirectoryInfo"
401 :
description : "Not authenticated"
2025-12-13 22:44:37 +00:00
schema :
2025-12-27 19:27:08 +00:00
type : "string"
404 :
description : "Directory not found"
2025-12-13 22:44:37 +00:00
schema :
2025-12-27 19:27:08 +00:00
type : "string"
delete :
2025-12-13 22:44:37 +00:00
security :
2025-12-27 19:27:08 +00:00
-
BearerAuth : [ ]
description : "Delete a directory permanently or move it to trash. Deleting a directory also affects all its contents."
2025-12-13 22:44:37 +00:00
tags :
2025-12-27 19:27:08 +00:00
- "directories"
summary : "Delete directory"
parameters :
-
type : "string"
format : "uuid"
description : "Account ID"
name : "accountID"
in : "path"
required : true
-
type : "string"
description : "Directory ID"
name : "directoryID"
in : "path"
required : true
-
type : "boolean"
default : false
description : "Move to trash instead of permanent delete"
name : "trash"
in : "query"
responses :
200 :
description : "Trashed directory info (when trash=true)"
schema :
$ref : "#/definitions/internal_catalog.DirectoryInfo"
204 :
description : "Directory deleted"
schema :
type : "string"
401 :
description : "Not authenticated"
schema :
type : "string"
404 :
description : "Directory not found"
schema :
type : "string"
2025-12-13 22:44:37 +00:00
patch :
2025-12-27 19:27:08 +00:00
security :
-
BearerAuth : [ ]
description : "Update directory properties such as name (rename)"
2025-12-13 22:44:37 +00:00
consumes :
2025-12-27 19:27:08 +00:00
- "application/json"
2025-12-13 22:44:37 +00:00
produces :
2025-12-27 19:27:08 +00:00
- "application/json"
tags :
- "directories"
summary : "Update directory"
parameters :
-
type : "string"
format : "uuid"
description : "Account ID"
name : "accountID"
in : "path"
required : true
-
type : "string"
description : "Directory ID"
name : "directoryID"
in : "path"
required : true
-
description : "Directory update"
name : "request"
in : "body"
required : true
schema :
$ref : "#/definitions/internal_catalog.patchDirectoryRequest"
2025-12-13 22:44:37 +00:00
responses :
2025-12-27 19:27:08 +00:00
200 :
description : "Updated directory metadata"
2025-12-13 22:44:37 +00:00
schema :
2025-12-27 19:27:08 +00:00
$ref : "#/definitions/internal_catalog.DirectoryInfo"
400 :
description : "Invalid request"
2025-12-13 22:44:37 +00:00
schema :
2025-12-27 19:27:08 +00:00
type : "object"
2025-12-13 22:44:37 +00:00
additionalProperties :
2025-12-27 19:27:08 +00:00
type : "string"
401 :
description : "Not authenticated"
2025-12-13 22:44:37 +00:00
schema :
2025-12-27 19:27:08 +00:00
type : "string"
404 :
description : "Directory not found"
2025-12-13 22:44:37 +00:00
schema :
2025-12-27 19:27:08 +00:00
type : "string"
2025-12-13 22:44:37 +00:00
/accounts/{accountID}/directories/{directoryID}/content:
get :
2025-12-27 19:27:08 +00:00
security :
-
BearerAuth : [ ]
description : "Get all files and subdirectories within a directory with optional pagination and sorting"
2025-12-13 22:44:37 +00:00
produces :
2025-12-27 19:27:08 +00:00
- "application/json"
tags :
- "directories"
summary : "List directory contents"
parameters :
-
type : "string"
format : "uuid"
description : "Account ID"
name : "accountID"
in : "path"
required : true
-
type : "string"
description : "Directory ID (use 'root' for the root directory)"
name : "directoryID"
in : "path"
required : true
-
enum :
- "name"
- "createdAt"
- "updatedAt"
type : "string"
description : "Sort field: name, createdAt, or updatedAt"
name : "orderBy"
in : "query"
-
enum :
- "asc"
- "desc"
type : "string"
description : "Sort direction: asc or desc"
name : "dir"
in : "query"
-
type : "integer"
description : "Maximum number of items to return (default: 100, min: 1)"
name : "limit"
in : "query"
-
type : "string"
description : "Cursor for pagination (base64-encoded cursor from previous response)"
name : "cursor"
in : "query"
2025-12-13 22:44:37 +00:00
responses :
2025-12-27 19:27:08 +00:00
200 :
description : "Paginated list of FileInfo and DirectoryInfo objects"
2025-12-13 22:44:37 +00:00
schema :
2025-12-27 19:27:08 +00:00
$ref : "#/definitions/internal_catalog.listDirectoryResponse"
400 :
description : "Invalid limit or cursor"
2025-12-13 22:44:37 +00:00
schema :
2025-12-27 19:27:08 +00:00
type : "object"
additionalProperties :
type : "string"
401 :
description : "Not authenticated"
2025-12-13 22:44:37 +00:00
schema :
2025-12-27 19:27:08 +00:00
type : "string"
404 :
description : "Directory not found"
schema :
type : "string"
2025-12-13 22:44:37 +00:00
post :
2025-12-27 19:27:08 +00:00
security :
-
BearerAuth : [ ]
description : "Move one or more files or directories into this directory. Returns detailed status for each item including which were successfully moved, which had conflicts, and which encountered errors."
2025-12-13 22:44:37 +00:00
consumes :
2025-12-27 19:27:08 +00:00
- "application/json"
2025-12-15 00:13:10 +00:00
produces :
2025-12-27 19:27:08 +00:00
- "application/json"
tags :
- "directories"
summary : "Move items to directory"
parameters :
-
type : "string"
format : "uuid"
description : "Account ID"
name : "accountID"
in : "path"
required : true
-
type : "string"
description : "Target directory ID"
name : "directoryID"
in : "path"
required : true
-
description : "Items to move"
name : "request"
in : "body"
required : true
schema :
$ref : "#/definitions/internal_catalog.postDirectoryContentRequest"
2025-12-13 22:44:37 +00:00
responses :
2025-12-27 19:27:08 +00:00
200 :
description : "Move operation results with moved, conflict, and error states"
2025-12-13 22:44:37 +00:00
schema :
2025-12-27 19:27:08 +00:00
$ref : "#/definitions/internal_catalog.moveItemsToDirectoryResponse"
400 :
description : "Invalid request or items not in same directory"
2025-12-13 22:44:37 +00:00
schema :
2025-12-27 19:27:08 +00:00
type : "object"
2025-12-13 22:44:37 +00:00
additionalProperties :
2025-12-27 19:27:08 +00:00
type : "string"
401 :
description : "Not authenticated"
2025-12-13 22:44:37 +00:00
schema :
2025-12-27 19:27:08 +00:00
type : "string"
404 :
description : "One or more items not found"
2025-12-13 22:44:37 +00:00
schema :
2025-12-27 19:27:08 +00:00
type : "object"
2025-12-13 22:44:37 +00:00
additionalProperties :
2025-12-27 19:27:08 +00:00
type : "string"
/accounts/{accountID}/directories/{directoryID}/shares:
get :
2025-12-13 22:44:37 +00:00
security :
2025-12-27 19:27:08 +00:00
-
BearerAuth : [ ]
description : "Get all share links that include this directory"
produces :
- "application/json"
2025-12-13 22:44:37 +00:00
tags :
2025-12-27 19:27:08 +00:00
- "directories"
summary : "List directory shares"
parameters :
-
type : "string"
format : "uuid"
description : "Account ID"
name : "accountID"
in : "path"
required : true
-
type : "string"
description : "Directory ID"
name : "directoryID"
in : "path"
required : true
responses :
200 :
description : "Array of shares"
schema :
type : "array"
items :
$ref : "#/definitions/github_com_get-drexa_drexa_internal_sharing.Share"
401 :
description : "Not authenticated"
schema :
type : "string"
404 :
description : "Directory not found"
schema :
type : "string"
/accounts/{accountID}/files:
2025-12-13 22:44:37 +00:00
delete :
2025-12-27 19:27:08 +00:00
security :
-
BearerAuth : [ ]
description : "Delete multiple files permanently or move them to trash. All items must be files."
tags :
- "files"
summary : "Bulk delete files"
2025-12-13 22:44:37 +00:00
parameters :
2025-12-27 19:27:08 +00:00
-
type : "string"
format : "uuid"
description : "Account ID"
name : "accountID"
in : "path"
required : true
-
type : "string"
description : "Comma-separated list of file IDs to delete"
name : "id"
in : "query"
required : true
-
type : "boolean"
default : false
description : "Move to trash instead of permanent delete"
name : "trash"
in : "query"
2025-12-13 22:44:37 +00:00
responses :
2025-12-27 19:27:08 +00:00
200 :
description : "Trashed files (when trash=true)"
2025-12-13 22:44:37 +00:00
schema :
2025-12-27 19:27:08 +00:00
type : "array"
items :
$ref : "#/definitions/internal_catalog.FileInfo"
204 :
description : "Files deleted"
2025-12-13 22:44:37 +00:00
schema :
2025-12-27 19:27:08 +00:00
type : "string"
400 :
description : "All items must be files"
2025-12-13 22:44:37 +00:00
schema :
2025-12-27 19:27:08 +00:00
type : "object"
additionalProperties :
type : "string"
401 :
description : "Not authenticated"
2025-12-13 22:44:37 +00:00
schema :
2025-12-27 19:27:08 +00:00
type : "string"
/accounts/{accountID}/files/{fileID}:
get :
2025-12-13 22:44:37 +00:00
security :
2025-12-27 19:27:08 +00:00
-
BearerAuth : [ ]
description : "Retrieve metadata for a specific file"
produces :
- "application/json"
2025-12-13 22:44:37 +00:00
tags :
2025-12-27 19:27:08 +00:00
- "files"
summary : "Get file info"
2025-12-13 22:44:37 +00:00
parameters :
2025-12-27 19:27:08 +00:00
-
type : "string"
format : "uuid"
description : "Account ID"
name : "accountID"
in : "path"
required : true
-
type : "string"
description : "File ID"
name : "fileID"
in : "path"
required : true
2025-12-13 22:44:37 +00:00
responses :
2025-12-27 19:27:08 +00:00
200 :
description : "File metadata"
2025-12-13 22:44:37 +00:00
schema :
2025-12-27 19:27:08 +00:00
$ref : "#/definitions/internal_catalog.FileInfo"
401 :
description : "Not authenticated"
2025-12-13 22:44:37 +00:00
schema :
2025-12-27 19:27:08 +00:00
type : "string"
404 :
description : "File not found"
2025-12-13 22:44:37 +00:00
schema :
2025-12-27 19:27:08 +00:00
type : "string"
delete :
2025-12-13 22:44:37 +00:00
security :
2025-12-27 19:27:08 +00:00
-
BearerAuth : [ ]
description : "Delete a file permanently or move it to trash"
produces :
- "application/json"
2025-12-13 22:44:37 +00:00
tags :
2025-12-27 19:27:08 +00:00
- "files"
summary : "Delete file"
parameters :
-
type : "string"
format : "uuid"
description : "Account ID"
name : "accountID"
in : "path"
required : true
-
type : "string"
description : "File ID"
name : "fileID"
in : "path"
required : true
-
type : "boolean"
default : false
description : "Move to trash instead of permanent delete"
name : "trash"
in : "query"
responses :
200 :
description : "Trashed file info (when trash=true)"
schema :
$ref : "#/definitions/internal_catalog.FileInfo"
204 :
description : "Permanently deleted (when trash=false)"
schema :
type : "string"
401 :
description : "Not authenticated"
schema :
type : "string"
404 :
description : "File not found"
schema :
type : "string"
2025-12-13 22:44:37 +00:00
patch :
2025-12-27 19:27:08 +00:00
security :
-
BearerAuth : [ ]
description : "Update file properties such as name (rename)"
2025-12-13 22:44:37 +00:00
consumes :
2025-12-27 19:27:08 +00:00
- "application/json"
2025-12-13 22:44:37 +00:00
produces :
2025-12-27 19:27:08 +00:00
- "application/json"
tags :
- "files"
summary : "Update file"
parameters :
-
type : "string"
format : "uuid"
description : "Account ID"
name : "accountID"
in : "path"
required : true
-
type : "string"
description : "File ID"
name : "fileID"
in : "path"
required : true
-
description : "File update"
name : "request"
in : "body"
required : true
schema :
$ref : "#/definitions/internal_catalog.patchFileRequest"
2025-12-13 22:44:37 +00:00
responses :
2025-12-27 19:27:08 +00:00
200 :
description : "Updated file metadata"
2025-12-13 22:44:37 +00:00
schema :
2025-12-27 19:27:08 +00:00
$ref : "#/definitions/internal_catalog.FileInfo"
400 :
description : "Invalid request"
2025-12-13 22:44:37 +00:00
schema :
2025-12-27 19:27:08 +00:00
type : "object"
2025-12-13 22:44:37 +00:00
additionalProperties :
2025-12-27 19:27:08 +00:00
type : "string"
401 :
description : "Not authenticated"
2025-12-13 22:44:37 +00:00
schema :
2025-12-27 19:27:08 +00:00
type : "string"
404 :
description : "File not found"
2025-12-13 22:44:37 +00:00
schema :
2025-12-27 19:27:08 +00:00
type : "string"
/accounts/{accountID}/files/{fileID}/content:
get :
2025-12-13 22:44:37 +00:00
security :
2025-12-27 19:27:08 +00:00
-
BearerAuth : [ ]
description : "Download the file content. May redirect to a signed URL for external storage."
produces :
- "application/octet-stream"
2025-12-13 22:44:37 +00:00
tags :
2025-12-27 19:27:08 +00:00
- "files"
summary : "Download file"
parameters :
-
type : "string"
format : "uuid"
description : "Account ID"
name : "accountID"
in : "path"
required : true
-
type : "string"
description : "File ID"
name : "fileID"
in : "path"
required : true
responses :
200 :
description : "File content stream"
schema :
type : "file"
307 :
description : "Redirect to download URL"
schema :
type : "string"
401 :
description : "Not authenticated"
schema :
type : "string"
404 :
description : "File not found"
schema :
type : "string"
/accounts/{accountID}/files/{fileID}/shares:
2025-12-13 22:44:37 +00:00
get :
2025-12-27 19:27:08 +00:00
security :
-
BearerAuth : [ ]
description : "Get all share links that include this file"
produces :
- "application/json"
tags :
- "files"
summary : "List file shares"
2025-12-13 22:44:37 +00:00
parameters :
2025-12-27 19:27:08 +00:00
-
type : "string"
format : "uuid"
description : "Account ID"
name : "accountID"
in : "path"
required : true
-
type : "string"
description : "File ID"
name : "fileID"
in : "path"
required : true
responses :
200 :
description : "Array of shares"
schema :
type : "array"
items :
$ref : "#/definitions/github_com_get-drexa_drexa_internal_sharing.Share"
401 :
description : "Not authenticated"
schema :
type : "string"
404 :
description : "File not found"
schema :
type : "string"
/accounts/{accountID}/shares:
post :
security :
-
BearerAuth : [ ]
description : "Create a new share link for one or more files or directories"
consumes :
- "application/json"
2025-12-13 22:44:37 +00:00
produces :
2025-12-27 19:27:08 +00:00
- "application/json"
tags :
- "shares"
summary : "Create share"
parameters :
-
type : "string"
format : "uuid"
description : "Account ID"
name : "accountID"
in : "path"
required : true
-
description : "Share details"
name : "request"
in : "body"
required : true
schema :
$ref : "#/definitions/internal_sharing.createShareRequest"
2025-12-13 22:44:37 +00:00
responses :
2025-12-27 19:27:08 +00:00
200 :
description : "Created share"
schema :
$ref : "#/definitions/internal_sharing.Share"
400 :
description : "Invalid request or no items provided"
schema :
type : "object"
additionalProperties :
type : "string"
401 :
description : "Not authenticated"
2025-12-13 22:44:37 +00:00
schema :
2025-12-27 19:27:08 +00:00
type : "string"
404 :
description : "One or more items not found"
2025-12-13 22:44:37 +00:00
schema :
2025-12-27 19:27:08 +00:00
type : "object"
additionalProperties :
type : "string"
/accounts/{accountID}/shares/{shareID}:
get :
security :
-
BearerAuth : [ ]
description : "Retrieve share link details by ID"
consumes :
- "application/json"
produces :
- "application/json"
tags :
- "shares"
summary : "Get share"
parameters :
-
type : "string"
format : "uuid"
description : "Account ID"
name : "accountID"
in : "path"
required : true
-
type : "string"
description : "Share ID"
name : "shareID"
in : "path"
required : true
responses :
200 :
description : "Share details"
schema :
$ref : "#/definitions/internal_sharing.Share"
401 :
description : "Not authenticated"
2025-12-13 22:44:37 +00:00
schema :
2025-12-27 19:27:08 +00:00
type : "string"
404 :
description : "Share not found"
2025-12-13 22:44:37 +00:00
schema :
2025-12-27 19:27:08 +00:00
type : "string"
delete :
2025-12-13 22:44:37 +00:00
security :
2025-12-27 19:27:08 +00:00
-
BearerAuth : [ ]
description : "Delete a share link, revoking access for all users"
2025-12-13 22:44:37 +00:00
tags :
2025-12-27 19:27:08 +00:00
- "shares"
summary : "Delete share"
parameters :
-
type : "string"
format : "uuid"
description : "Account ID"
name : "accountID"
in : "path"
required : true
-
type : "string"
description : "Share ID"
name : "shareID"
in : "path"
required : true
responses :
204 :
description : "Share deleted"
schema :
type : "string"
401 :
description : "Not authenticated"
schema :
type : "string"
404 :
description : "Share not found"
schema :
type : "string"
2025-12-13 22:44:37 +00:00
/accounts/{accountID}/uploads:
post :
2025-12-27 19:27:08 +00:00
security :
-
BearerAuth : [ ]
description : "Start a new file upload session. Returns an upload URL to PUT file content to."
2025-12-13 22:44:37 +00:00
consumes :
2025-12-27 19:27:08 +00:00
- "application/json"
2025-12-13 22:44:37 +00:00
produces :
2025-12-27 19:27:08 +00:00
- "application/json"
tags :
- "uploads"
summary : "Create upload session"
parameters :
-
type : "string"
format : "uuid"
description : "Account ID"
name : "accountID"
in : "path"
required : true
-
description : "Upload details"
name : "request"
in : "body"
required : true
schema :
$ref : "#/definitions/internal_upload.createUploadRequest"
2025-12-13 22:44:37 +00:00
responses :
2025-12-27 19:27:08 +00:00
200 :
description : "Upload session created"
2025-12-13 22:44:37 +00:00
schema :
2025-12-27 19:27:08 +00:00
$ref : "#/definitions/internal_upload.Upload"
400 :
description : "Parent is not a directory"
2025-12-13 22:44:37 +00:00
schema :
2025-12-27 19:27:08 +00:00
type : "object"
2025-12-13 22:44:37 +00:00
additionalProperties :
2025-12-27 19:27:08 +00:00
type : "string"
401 :
description : "Not authenticated"
2025-12-13 22:44:37 +00:00
schema :
2025-12-27 19:27:08 +00:00
type : "string"
404 :
description : "Parent directory not found"
2025-12-13 22:44:37 +00:00
schema :
2025-12-27 19:27:08 +00:00
type : "string"
409 :
description : "File with this name already exists"
2025-12-13 22:44:37 +00:00
schema :
2025-12-27 19:27:08 +00:00
type : "object"
2025-12-13 22:44:37 +00:00
additionalProperties :
2025-12-27 19:27:08 +00:00
type : "string"
2025-12-13 22:44:37 +00:00
/accounts/{accountID}/uploads/{uploadID}:
patch :
2025-12-27 19:27:08 +00:00
security :
-
BearerAuth : [ ]
description : "Mark an upload as completed after content has been uploaded. This finalizes the file in the filesystem."
2025-12-13 22:44:37 +00:00
consumes :
2025-12-27 19:27:08 +00:00
- "application/json"
2025-12-13 22:44:37 +00:00
produces :
2025-12-27 19:27:08 +00:00
- "application/json"
tags :
- "uploads"
summary : "Complete upload"
parameters :
-
type : "string"
format : "uuid"
description : "Account ID"
name : "accountID"
in : "path"
required : true
-
type : "string"
description : "Upload session ID"
name : "uploadID"
in : "path"
required : true
-
description : "Status update"
name : "request"
in : "body"
required : true
schema :
$ref : "#/definitions/internal_upload.updateUploadRequest"
2025-12-13 22:44:37 +00:00
responses :
2025-12-27 19:27:08 +00:00
200 :
description : "Upload completed"
2025-12-13 22:44:37 +00:00
schema :
2025-12-27 19:27:08 +00:00
$ref : "#/definitions/internal_upload.Upload"
400 :
description : "Content not uploaded yet or invalid status"
2025-12-13 22:44:37 +00:00
schema :
2025-12-27 19:27:08 +00:00
type : "object"
2025-12-13 22:44:37 +00:00
additionalProperties :
2025-12-27 19:27:08 +00:00
type : "string"
401 :
description : "Not authenticated"
2025-12-13 22:44:37 +00:00
schema :
2025-12-27 19:27:08 +00:00
type : "string"
404 :
description : "Upload session not found"
2025-12-13 22:44:37 +00:00
schema :
2025-12-27 19:27:08 +00:00
type : "string"
2025-12-13 22:44:37 +00:00
/accounts/{accountID}/uploads/{uploadID}/content:
put :
2025-12-27 19:27:08 +00:00
security :
-
BearerAuth : [ ]
description : "Stream file content to complete an upload. Send raw binary data in the request body."
2025-12-13 22:44:37 +00:00
consumes :
2025-12-27 19:27:08 +00:00
- "application/octet-stream"
tags :
- "uploads"
summary : "Upload file content"
2025-12-13 22:44:37 +00:00
parameters :
2025-12-27 19:27:08 +00:00
-
type : "string"
format : "uuid"
description : "Account ID"
name : "accountID"
in : "path"
required : true
-
type : "string"
description : "Upload session ID"
name : "uploadID"
in : "path"
required : true
-
description : "File content (binary)"
name : "file"
in : "body"
required : true
schema :
type : "array"
items :
type : "integer"
2025-12-13 22:44:37 +00:00
responses :
2025-12-27 19:27:08 +00:00
204 :
description : "Content received successfully"
2025-12-13 22:44:37 +00:00
schema :
2025-12-27 19:27:08 +00:00
type : "string"
401 :
description : "Not authenticated"
2025-12-13 22:44:37 +00:00
schema :
2025-12-27 19:27:08 +00:00
type : "string"
404 :
description : "Upload session not found"
2025-12-13 22:44:37 +00:00
schema :
2025-12-27 19:27:08 +00:00
type : "string"
2025-12-13 22:44:37 +00:00
/auth/login :
post :
2025-12-27 19:27:08 +00:00
description : "Authenticate with email and password to receive JWT tokens. Tokens can be delivered via HTTP-only cookies or in the response body based on the tokenDelivery field."
2025-12-13 22:44:37 +00:00
consumes :
2025-12-27 19:27:08 +00:00
- "application/json"
2025-12-13 22:44:37 +00:00
produces :
2025-12-27 19:27:08 +00:00
- "application/json"
tags :
- "auth"
summary : "User login"
parameters :
-
description : "Login credentials"
name : "request"
in : "body"
required : true
schema :
$ref : "#/definitions/internal_auth.loginRequest"
2025-12-13 22:44:37 +00:00
responses :
2025-12-27 19:27:08 +00:00
200 :
description : "Successful authentication"
2025-12-13 22:44:37 +00:00
schema :
2025-12-27 19:27:08 +00:00
$ref : "#/definitions/internal_auth.loginResponse"
400 :
description : "Invalid request body or token delivery method"
2025-12-13 22:44:37 +00:00
schema :
2025-12-27 19:27:08 +00:00
type : "object"
2025-12-13 22:44:37 +00:00
additionalProperties :
2025-12-27 19:27:08 +00:00
type : "string"
401 :
description : "Invalid email or password"
2025-12-13 22:44:37 +00:00
schema :
2025-12-27 19:27:08 +00:00
type : "object"
2025-12-13 22:44:37 +00:00
additionalProperties :
2025-12-27 19:27:08 +00:00
type : "string"
2025-12-13 22:44:37 +00:00
/auth/tokens :
post :
2025-12-27 19:27:08 +00:00
description : "Exchange a valid refresh token for a new pair of access and refresh tokens. The old refresh token is invalidated (rotation)."
2025-12-13 22:44:37 +00:00
consumes :
2025-12-27 19:27:08 +00:00
- "application/json"
2025-12-13 22:44:37 +00:00
produces :
2025-12-27 19:27:08 +00:00
- "application/json"
tags :
- "auth"
summary : "Refresh access token"
parameters :
-
description : "Refresh token"
name : "request"
in : "body"
required : true
schema :
$ref : "#/definitions/internal_auth.refreshAccessTokenRequest"
2025-12-13 22:44:37 +00:00
responses :
2025-12-27 19:27:08 +00:00
200 :
description : "New tokens"
2025-12-13 22:44:37 +00:00
schema :
2025-12-27 19:27:08 +00:00
$ref : "#/definitions/internal_auth.tokenResponse"
400 :
description : "Invalid request body"
2025-12-13 22:44:37 +00:00
schema :
2025-12-27 19:27:08 +00:00
type : "object"
2025-12-13 22:44:37 +00:00
additionalProperties :
2025-12-27 19:27:08 +00:00
type : "string"
401 :
description : "Invalid, expired, or reused refresh token"
2025-12-13 22:44:37 +00:00
schema :
2025-12-27 19:27:08 +00:00
type : "object"
2025-12-13 22:44:37 +00:00
additionalProperties :
2025-12-27 19:27:08 +00:00
type : "string"
2025-12-13 22:44:37 +00:00
/users/me :
get :
2025-12-27 19:27:08 +00:00
security :
-
BearerAuth : [ ]
description : "Retrieve the authenticated user's profile information"
2025-12-13 22:44:37 +00:00
produces :
2025-12-27 19:27:08 +00:00
- "application/json"
tags :
- "users"
summary : "Get current user"
2025-12-13 22:44:37 +00:00
responses :
2025-12-27 19:27:08 +00:00
200 :
description : "User profile"
2025-12-13 22:44:37 +00:00
schema :
2025-12-27 19:27:08 +00:00
$ref : "#/definitions/internal_user.User"
401 :
description : "Not authenticated"
2025-12-13 22:44:37 +00:00
schema :
2025-12-27 19:27:08 +00:00
type : "string"
definitions :
github_com_get-drexa_drexa_internal_sharing.Share :
description : "Share link information including expiration and timestamps"
type : "object"
properties :
createdAt :
description : "When the share was created (ISO 8601)"
type : "string"
example : "2024-12-13T15:04:05Z"
expiresAt :
description : "When the share expires, null if it never expires (ISO 8601)"
type : "string"
example : "2025-01-15T00:00:00Z"
id :
description : "Unique share identifier (public ID)"
type : "string"
example : "kRp2XYTq9A55"
updatedAt :
description : "When the share was last updated (ISO 8601)"
type : "string"
example : "2024-12-13T16:30:00Z"
github_com_get-drexa_drexa_internal_user.User :
description : "User account information"
type : "object"
properties :
displayName :
description : "User's display name"
type : "string"
example : "John Doe"
email :
description : "User's email address"
type : "string"
example : "john@example.com"
id :
description : "Unique user identifier"
type : "string"
example : "550e8400-e29b-41d4-a716-446655440000"
github_com_get-drexa_drexa_internal_virtualfs.PathSegment :
type : "object"
properties :
id :
type : "string"
name :
type : "string"
internal_account.Account :
description : "Storage account with usage and quota details"
type : "object"
properties :
createdAt :
description : "When the account was created (ISO 8601)"
type : "string"
example : "2024-12-13T15:04:05Z"
id :
description : "Unique account identifier"
type : "string"
example : "550e8400-e29b-41d4-a716-446655440000"
storageQuotaBytes :
description : "Maximum storage quota in bytes"
type : "integer"
example : 10737418240
storageUsageBytes :
description : "Current storage usage in bytes"
type : "integer"
example : 1073741824
updatedAt :
description : "When the account was last updated (ISO 8601)"
type : "string"
example : "2024-12-13T16:30:00Z"
userId :
description : "ID of the user who owns this account"
type : "string"
example : "550e8400-e29b-41d4-a716-446655440001"
internal_account.registerAccountRequest :
description : "Request to create a new account and user"
type : "object"
properties :
displayName :
description : "Display name for the user"
type : "string"
example : "Jane Doe"
email :
description : "Email address for the new account"
type : "string"
example : "newuser@example.com"
password :
description : "Password for the new account (min 8 characters)"
type : "string"
example : "securepassword123"
tokenDelivery :
description : "How to deliver tokens: \"cookie\" (set HTTP-only cookies) or \"body\" (include in response)"
type : "string"
enum :
- "cookie"
- "body"
example : "body"
internal_account.registerAccountResponse :
description : "Response after successful account registration"
type : "object"
properties :
accessToken :
description : "JWT access token for immediate authentication (only included when tokenDelivery is \"body\")"
type : "string"
example : "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiI1NTBlODQwMC1lMjliLTQxZDQtYTcxNi00NDY2NTU0NDAwMDAifQ.signature"
account :
description : "The created account"
allOf :
-
$ref : "#/definitions/internal_account.Account"
refreshToken :
description : "Base64 URL encoded refresh token (only included when tokenDelivery is \"body\")"
type : "string"
example : "dR4nD0mUu1DkZXlCeXRlc0FuZFJhbmRvbURhdGFIZXJlMTIzNDU2Nzg5MGFi"
user :
description : "The created user"
allOf :
-
$ref : "#/definitions/github_com_get-drexa_drexa_internal_user.User"
internal_auth.loginRequest :
description : "Login request with email, password, and token delivery preference"
type : "object"
properties :
email :
description : "User's email address"
type : "string"
example : "user@example.com"
password :
description : "User's password"
type : "string"
example : "secretpassword123"
tokenDelivery :
description : "How to deliver tokens: \"cookie\" (set HTTP-only cookies) or \"body\" (include in response)"
type : "string"
enum :
- "cookie"
- "body"
example : "body"
internal_auth.loginResponse :
description : "Login response containing user info and optionally tokens"
type : "object"
properties :
accessToken :
description : "JWT access token (only included when tokenDelivery is \"body\")"
type : "string"
example : "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiI1NTBlODQwMC1lMjliLTQxZDQtYTcxNi00NDY2NTU0NDAwMDAifQ.signature"
refreshToken :
description : "Base64 URL encoded refresh token (only included when tokenDelivery is \"body\")"
type : "string"
example : "dR4nD0mUu1DkZXlCeXRlc0FuZFJhbmRvbURhdGFIZXJlMTIzNDU2Nzg5MGFi"
user :
description : "Authenticated user information"
allOf :
-
$ref : "#/definitions/github_com_get-drexa_drexa_internal_user.User"
internal_auth.refreshAccessTokenRequest :
description : "Request to exchange a refresh token for new tokens"
type : "object"
properties :
refreshToken :
description : "Base64 URL encoded refresh token"
type : "string"
example : "dR4nD0mUu1DkZXlCeXRlc0FuZFJhbmRvbURhdGFIZXJlMTIzNDU2Nzg5MGFi"
internal_auth.tokenResponse :
description : "Response containing new access token and refresh token"
type : "object"
properties :
accessToken :
description : "New JWT access token"
type : "string"
example : "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiI1NTBlODQwMC1lMjliLTQxZDQtYTcxNi00NDY2NTU0NDAwMDAifQ.signature"
refreshToken :
description : "New base64 URL encoded refresh token"
type : "string"
example : "xK9mPqRsTuVwXyZ0AbCdEfGhIjKlMnOpQrStUvWxYz1234567890abcdefgh"
internal_catalog.DirectoryInfo :
description : "Directory information including path and timestamps"
type : "object"
properties :
createdAt :
description : "When the directory was created (ISO 8601)"
type : "string"
example : "2024-12-13T15:04:05Z"
deletedAt :
description : "When the directory was trashed, null if not trashed (ISO 8601)"
type : "string"
example : "2024-12-14T10:00:00Z"
id :
description : "Unique directory identifier"
type : "string"
example : "kRp2XYTq9A55"
kind :
description : "Item type, always \"directory\""
type : "string"
example : "directory"
name :
description : "Directory name"
type : "string"
example : "My Documents"
parentId :
description : "ParentID is the public ID of the directory this directory is in"
type : "string"
example : "kRp2XYTq9A55"
path :
description : "Full path from root (included when ?include=path)"
type : "array"
items :
$ref : "#/definitions/github_com_get-drexa_drexa_internal_virtualfs.PathSegment"
updatedAt :
description : "When the directory was last updated (ISO 8601)"
type : "string"
example : "2024-12-13T16:30:00Z"
internal_catalog.FileInfo :
description : "File information including name, size, and timestamps"
type : "object"
properties :
createdAt :
description : "When the file was created (ISO 8601)"
type : "string"
example : "2024-12-13T15:04:05Z"
deletedAt :
description : "When the file was trashed, null if not trashed (ISO 8601)"
type : "string"
example : "2024-12-14T10:00:00Z"
id :
description : "Unique file identifier"
type : "string"
example : "mElnUNCm8F22"
kind :
description : "Item type, always \"file\""
type : "string"
example : "file"
mimeType :
description : "MIME type of the file"
type : "string"
example : "application/pdf"
name :
description : "File name"
type : "string"
example : "document.pdf"
parentId :
description : "ParentID is the public ID of the directory this file is in"
type : "string"
example : "kRp2XYTq9A55"
size :
description : "File size in bytes"
type : "integer"
example : 1048576
updatedAt :
description : "When the file was last updated (ISO 8601)"
type : "string"
example : "2024-12-13T16:30:00Z"
internal_catalog.createDirectoryRequest :
description : "Request to create a new directory"
type : "object"
properties :
name :
description : "Name for the new directory"
type : "string"
example : "New Folder"
parentID :
description : "ID of the parent directory"
type : "string"
example : "kRp2XYTq9A55"
internal_catalog.listDirectoryResponse :
description : "Response to a request to list the contents of a directory"
type : "object"
properties :
items :
description : "Items is the list of items in the directory, limited to the limit specified in the request"
type : "array"
items : {}
nextCursor :
description : "NextCursor is the cursor to use to get the next page of results"
type : "string"
internal_catalog.moveItemError :
description : "Error details for a failed item move"
type : "object"
properties :
error :
description : "Error message describing what went wrong"
type : "string"
example : "permission denied"
id :
description : "ID of the item that failed to move"
type : "string"
example : "mElnUNCm8F22"
internal_catalog.moveItemsToDirectoryResponse :
description : "Response from moving items to a directory with status for each item"
type : "object"
properties :
conflicts :
description : "Array of IDs of items that conflicted with existing items in the target directory"
type : "array"
items :
type : "string"
example :
- "xYz123AbC456"
errors :
description : "Array of errors that occurred during the move operation"
type : "array"
items :
$ref : "#/definitions/internal_catalog.moveItemError"
items :
description : "Array of items included in the request (FileInfo or DirectoryInfo objects)"
type : "array"
items : {}
moved :
description : "Array of IDs of successfully moved items"
type : "array"
items :
type : "string"
example :
- "mElnUNCm8F22"
- "kRp2XYTq9A55"
internal_catalog.patchDirectoryRequest :
description : "Request to update directory properties"
type : "object"
properties :
name :
description : "New name for the directory"
type : "string"
example : "My Documents"
internal_catalog.patchFileRequest :
description : "Request to update file properties"
type : "object"
properties :
name :
description : "New name for the file"
type : "string"
example : "renamed-document.pdf"
internal_catalog.postDirectoryContentRequest :
description : "Request to move items into this directory"
type : "object"
properties :
items :
description : "Array of file/directory IDs to move"
type : "array"
items :
type : "string"
example :
- "mElnUNCm8F22"
- "kRp2XYTq9A55"
internal_sharing.Share :
description : "Share link information including expiration and timestamps"
type : "object"
properties :
createdAt :
description : "When the share was created (ISO 8601)"
type : "string"
example : "2024-12-13T15:04:05Z"
expiresAt :
description : "When the share expires, null if it never expires (ISO 8601)"
type : "string"
example : "2025-01-15T00:00:00Z"
id :
description : "Unique share identifier (public ID)"
type : "string"
example : "kRp2XYTq9A55"
updatedAt :
description : "When the share was last updated (ISO 8601)"
type : "string"
example : "2024-12-13T16:30:00Z"
internal_sharing.createShareRequest :
description : "Request to create a new share link for files or directories"
type : "object"
properties :
expiresAt :
description : "Optional expiration time for the share (ISO 8601)"
type : "string"
example : "2025-01-15T00:00:00Z"
items :
description : "Array of file/directory IDs to share"
type : "array"
items :
type : "string"
example :
- "mElnUNCm8F22"
- "kRp2XYTq9A55"
internal_upload.Status :
description : "Upload status enumeration"
type : "string"
enum :
- "pending"
- "completed"
- "failed"
x-enum-varnames :
- "StatusPending"
- "StatusCompleted"
- "StatusFailed"
internal_upload.Upload :
description : "File upload session with status and upload URL"
type : "object"
properties :
id :
description : "Unique upload session identifier"
type : "string"
example : "xNq5RVBt3K88"
status :
description : "Current upload status"
enum :
- "pending"
- "completed"
- "failed"
allOf :
-
$ref : "#/definitions/internal_upload.Status"
example : "pending"
uploadUrl :
description : "URL to upload file content to"
type : "string"
example : "https://api.example.com/api/accounts/550e8400-e29b-41d4-a716-446655440000/uploads/xNq5RVBt3K88/content"
internal_upload.createUploadRequest :
description : "Request to initiate a file upload"
type : "object"
properties :
name :
description : "Name of the file being uploaded"
type : "string"
example : "document.pdf"
parentId :
description : "ID of the parent directory to upload into"
type : "string"
example : "kRp2XYTq9A55"
internal_upload.updateUploadRequest :
description : "Request to update upload status (e.g., mark as completed)"
type : "object"
properties :
status :
description : "New status for the upload"
enum :
- "completed"
allOf :
-
$ref : "#/definitions/internal_upload.Status"
example : "completed"
internal_user.User :
description : "User account information"
type : "object"
properties :
displayName :
description : "User's display name"
type : "string"
example : "John Doe"
email :
description : "User's email address"
type : "string"
example : "john@example.com"
id :
description : "Unique user identifier"
type : "string"
example : "550e8400-e29b-41d4-a716-446655440000"
2025-12-13 22:44:37 +00:00
securityDefinitions :
BearerAuth :
2025-12-27 19:27:08 +00:00
description : "JWT access token. Format: \"Bearer {token}\""
type : "apiKey"
name : "Authorization"
in : "header"