Home

Awesome

<h1 align="center"><a href="https://bluewavelabs.ca" target="_blank">BlueWave DataRoom</a></h1> <p align="center"><strong>An open source DocSend alternative</strong></p>

BlueWave DataRoom is an open source DocSend alternative where you can share your files privately with anyone outside of your organization.

Currently, BlueWave DataRoom is in its early stage of development. The current designs and the style guide can be viewed here. Note that they are WIP.

Github social

Features & roadmap

Tech stack

Database

Data Types
<details> <summary><code>User</code></summary>
NameTypeNotes
userIdstringPrimary Key. Unique ID for each user
firstNamestringFirst name
lastNamestringLast name
emailstringUnique. User's email
profilePicUrlstringURL to User's picture
isActivebooleanDefault: true
isVerifiedbooleanDefault: false
lastLoginDateTimestamp of the last login
createdAtDateNot Null. Timestamp when the user was created
updatedAtDateNot Null. Timestamp when the user was last updated
</details> <details> <summary><code>Documents</code></summary>
NameTypeNotes
fileIdstringPrimary Key. Unique ID identifying the file
parentFileIdstringForeign Key. References Documents.fileId
fileNamestringName of the file
typestringFile type / extension
fileDirectorystringDirectory where the file is located
fileSizeintSize of the file in bytes
mimeTypestringMIME type of the file
createdBystringForeign Key. References User.userId
createdAtDateNot Null. Creation time
updatedAtDateNot Null. Last update time
updatedBystringForeign Key. References User.userId
totalViewsintTotal number of times the file was viewed
uniqueViewsintNumber of unique viewers of the file
</details> <details> <summary><code>Links</code></summary>
NameTypeNotes
linkIdstringPrimary Key. Unique ID for the link
fileIdstringForeign Key. References Documents.fileId
linkNamestringName of the link
linkUrlstringURL of the link
isPublicbooleanIndicates if the link is public
emailRequiredbooleanIndicates if an email is required for download
passwordRequiredbooleanIndicates if a password is required to view and download the file
linkPasswordstringPassword reqired to view and download the file
linkUrlstringURL of the link
canExpirebooleanIndicates if the link can expire
expirationTimeDateExpiration date of the link (nullable)
updatedAtDateNot Null. Last update time
createdAtDateNot Null. Creation time
createdBystringForeign Key. References User.userId
</details> <details> <summary><code>DataRooms</code></summary>
NameTypeNotes
folderIdstringPrimary Key. Unique ID for the folder
folderNamestringName of the folder
folderLocationstringLocation of the folder
updatedAtDateNot Null. Last update time
updatedBystringForeign Key. References User.userId
createdAtDateNot Null. Creation time
createdBystringForeign Key. References User.userId
</details> <details> <summary><code>AccessLogs</code></summary>
NameTypeNotes
logIdstringPrimary Key. Unique ID for each access log
linkIdstringForeign Key. ID of the link accessed
userIdstringForeign Key. ID of the user who accessed the link
accessTimeDateNot Null. Timestamp when the link was accessed
ipAddressstringIP address of the user who accessed the link
</details>

Endpoints

Auth

<details> <summary id='#get-all-users-id'><code>GET</code> <b>/api/v1/auth/users</b></summary>
Method/Headers
Method/HeadersValue
MethodGET
content-typeapplication/json
Response Payload
TypeNotes
Array<User>Returns an array containing all users
</details> <details> <summary id='post-register'><code>POST</code> <b>/api/v1/auth/register</b></summary>
Method/Headers
Method/HeadersValue
MethodPOST
content-typemultipart/form-data
Form
NameTypeNotes
firstNamestring
lastNamestring
emailstringValid email address
passwordstringMin 8 chars, One Upper, one number, one special
roleArray<string>Array of user roles
Response Payload
TypeNotes
UserUser data
JWTJSON web token
</details> <details> <summary id='post-login'><code>POST</code> <b>/api/v1/auth/login</b></summary>
Method/Headers
Method/HeadersValue
MethodPOST
content-typeapplication/json
Body
NameTypeNotes
emailstringValid email address
passwordstring
Response Payload
TypeNotes
UserUser data
JWTJSON web token
</details> <details> <summary id='post-auth-user-edit-id'><code>POST</code> <b>/api/v1/auth/user/{userId}</b></summary>
Method/Headers
Method/HeadersValue
MethodPOST
content-typemultipart/form-data
Form
NameTypeNotes
firstNamestringOptional
lastNamestringOptional
profileIamefileOptional
passwordstringRequired to change password
newPasswordstringRequired to change password
Response Payload
TypeNotes
UserReturns the updated user
</details> <details> <summary id='post-auth-recovery-request-id'><code>POST</code> <b>/api/v1/auth/recovery/request</b></summary>
Method/Headers
Method/HeadersValue
MethodPOST
content-typeapplication/json
Body
NameTypeNotes
emailstringUser's email
Response Payload
TypeNotes
RecoveryTokenReturns a recovery token if email found
</details> <details> <summary id='post-auth-recovery-validate-id'><code>POST</code> <b>/api/v1/auth/recovery/validate</b></summary>
Method/Headers
Method/HeadersValue
MethodPOST
content-typeapplication/json
Body
NameTypeNotes
recoveryTokenstringToken issued in /recovery/request
Response Payload
TypeNotes
RecoveryTokenReturns the recovery token
</details> <details> <summary id='post-auth-recovery-reset-id'><code>POST</code> <b>/api/v1/auth/recovery/reset</b></summary>
Method/Headers
Method/HeadersValue
MethodPOST
content-typeapplication/json
Body
NameTypeNotes
recoveryTokenstringToken issued returned by /recovery/validate
passwordstringUser's new password`
Response Payload
TypeNotes
UserReturns the updated user
</details>

Documents

<details> <summary id='get-documents'><code>GET</code> <b>/api/v1/documents</b></summary>
Method/Headers
Method/HeadersValue
MethodGET
content-typeapplication/json
Response Payload
TypeNotes
Array<Document>Array of all latest versions of documents
</details> <details> <summary id='get-documents'><code>GET</code> <b>/api/v1/documents/versions/{documentId}</b></summary>
Method/Headers
Method/HeadersValue
MethodGET
content-typeapplication/json
Response Payload
TypeNotes
Array<Document>Array of all documents versions for the parent document
</details> <details> <summary id='get-document'><code>GET</code> <b>/api/v1/document/{documentId}</b></summary>
Method/Headers
Method/HeadersValue
MethodGET
content-typeapplication/json
Response Payload
TypeNotes
DocumentDocument with the id in the request parameter
</details> <details> <summary id='post-document'><code>POST</code> <b>/api/v1/document</b></summary>
Method/Headers
Method/HeadersValue
MethodPOST
content-typemultipart/form-data
Body
NameTypeNotesAccepted Values
fileDatastringThe file to be uploaded
fileNamestringName of the file
typestringFile type / extension
fileDirectorystringDirectory where the file should go
fileSizeintSize of the file in bytes
mimeTypestringMIME type of the file
userIdstringUserId of current user
Response Payload
TypeNotes
DocumentReturns newly created Document
</details> <details> <summary id='post-document-del-id'><code>POST</code> <b>/api/v1/document/delete/{fileId}</b></summary>
Method/Headers
Method/HeadersValue
MethodPOST
content-typeapplication/json
Response Payload
TypeNotes
NoneNo payload returned
</details> <details> <summary id='post-document-edit-id'><code>POST</code> <b>/api/v1/document/edit/{fileId}</b></summary>
Method/Headers
Method/HeadersValue
MethodPOST
content-typemultipart/form-data
Body
NameTypeNotesAccepted Values
fileDatastringThe file to be uploaded
fileNamestringName of the file
typestringFile type / extension
fileDirectorystringDirectory where the file should go
fileSizeintSize of the file in bytes
mimeTypestringMIME type of the file
userIdstringUserId of current user
Response Payload
TypeNotes
DocumentReturns updated Document
</details>

DataRooms

<details> <summary id='get-datarooms'><code>GET</code> <b>/api/v1/datarooms</b></summary>
Method/Headers
Method/HeadersValue
MethodGET
content-typeapplication/json
Response Payload
TypeNotes
Array<DataRoom>Array of all datarooms
</details> <details> <summary id='get-dataroom'><code>GET</code> <b>/api/v1/dataroom/{folderId}</b></summary>
Method/Headers
Method/HeadersValue
MethodGET
content-typeapplication/json
Response Payload
TypeNotes
DataRoomSingle dataroom with the id in the request parameter
</details> <details> <summary id='post-dataroom'><code>POST</code> <b>/api/v1/dataroom</b></summary>
Method/Headers
Method/HeadersValue
MethodPOST
content-typeapplication/json
Body
NameTypeNotesAccepted Values
folderNamestringName of the file
folderLocationstringFile type / extension
userIdstringUserId of current user
Response Payload
TypeNotes
DataRoomReturns newly created DataRoom
</details> <details> <summary id='post-dataroom-del-id'><code>POST</code> <b>/api/v1/dataroom/delete/{folderId}</b></summary>
Method/Headers
Method/HeadersValue
MethodPOST
content-typeapplication/json
Response Payload
TypeNotes
NoneNo payload returned
</details> <details> <summary id='post-document-edit-id'><code>POST</code> <b>/api/v1/dataroom/edit/{folderId}</b></summary>
Method/Headers
Method/HeadersValue
MethodPOST
content-typeapplication/json
Body
NameTypeNotesAccepted Values
folderNamestringName of the file
folderLocationstringFile type / extension
userIdstringUserId of current user
Response Payload
TypeNotes
DataRoomReturns updated DataRoom
</details>

Links

<details> <summary id='get-links'><code>GET</code> <b>/api/v1/links</b></summary>
Method/Headers
Method/HeadersValue
MethodGET
content-typeapplication/json
Response Payload
TypeNotes
Array<Links>Array of all links
</details> <details> <summary id='get-link'><code>GET</code> <b>/api/v1/link/{linkId}</b></summary>
Method/Headers
Method/HeadersValue
MethodGET
content-typeapplication/json
Response Payload
TypeNotes
LinkSinge Link with the id in the request parameter
</details> <details> <summary id='post-link'><code>POST</code> <b>/api/v1/link</b></summary>
Method/Headers
Method/HeadersValue
MethodPOST
content-typeapplication/json
Body
NameTypeNotesAccepted Values
fileIdstringThe fileId of the file the link is generated for
linkNamestringName of the link
isPublicbooleanIndicates if the link is public
emailRequiredbooleanIndicates if email is required to download
passwordRequiredbooleanIndicates if password is required to download
linkPasswordstringPassword required to download
canExpirebooleanIndicates if the link can expire
expirationTimeDateDate in which the link expires
Response Payload
TypeNotes
LinkReturns newly created Link
</details> <details> <summary id='post-link-del-id'><code>POST</code> <b>/api/v1/link/delete/{linkId}</b></summary>
Method/Headers
Method/HeadersValue
MethodPOST
content-typeapplication/json
Response Payload
TypeNotes
NoneNo payload returned
</details> <details> <summary id='post-link-edit-id'><code>POST</code> <b>/api/v1/link/edit/{linkId}</b></summary>
Method/Headers
Method/HeadersValue
MethodPOST
content-typeapplication/json
Body
NameTypeNotesAccepted Values
linkNamestringName of the link
isPublicbooleanIndicates if the link is public
emailRequiredbooleanIndicates if email is required to download
passwordRequiredbooleanIndicates if password is required to download
linkPasswordstringPassword required to download
canExpirebooleanIndicates if the link can expire
expirationTimeDateDate in which the link expires
Response Payload
TypeNotes
LinkReturns updated Link
</details>