1
0
mirror of https://github.com/mattermost/focalboard.git synced 2025-01-08 15:06:08 +02:00

Update focalboard endpoints to v2 namespace (#2781)

This commit is contained in:
Miguel de la Cruz 2022-04-13 22:24:32 +02:00 committed by GitHub
parent 42d24d279a
commit 4c61ae9623
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
13 changed files with 14754 additions and 3315 deletions

View File

@ -10,7 +10,7 @@ declare global {
}
async function request(method: string, host: string, resource: string, body: any, token: string | null) {
const response = await fetch(`${host}/api/v1/${resource}`, {
const response = await fetch(`${host}/api/v2/${resource}`, {
'credentials': 'include',
'headers': {
'Accept': 'application/json',

View File

@ -5,4 +5,4 @@ if [[ $# < 2 ]] ; then
exit 1
fi
curl --unix-socket /var/tmp/focalboard_local.socket http://localhost/api/v1/admin/users/$1/password -X POST -H 'Content-Type: application/json' -d '{ "password": "'$2'" }'
curl --unix-socket /var/tmp/focalboard_local.socket http://localhost/api/v2/admin/users/$1/password -X POST -H 'Content-Type: application/json' -d '{ "password": "'$2'" }'

View File

@ -68,94 +68,94 @@ func NewAPI(app *app.App, singleUserToken string, authService string, permission
}
func (a *API) RegisterRoutes(r *mux.Router) {
apiv1 := r.PathPrefix("/api/v1").Subrouter()
apiv1.Use(a.panicHandler)
apiv1.Use(a.requireCSRFToken)
apiv2 := r.PathPrefix("/api/v2").Subrouter()
apiv2.Use(a.panicHandler)
apiv2.Use(a.requireCSRFToken)
// Board APIs
apiv1.HandleFunc("/teams/{teamID}/boards", a.sessionRequired(a.handleGetBoards)).Methods("GET")
apiv1.HandleFunc("/teams/{teamID}/boards/search", a.sessionRequired(a.handleSearchBoards)).Methods("GET")
apiv1.HandleFunc("/teams/{teamID}/templates", a.sessionRequired(a.handleGetTemplates)).Methods("GET")
apiv1.HandleFunc("/boards", a.sessionRequired(a.handleCreateBoard)).Methods("POST")
apiv1.HandleFunc("/boards/{boardID}", a.attachSession(a.handleGetBoard, false)).Methods("GET")
apiv1.HandleFunc("/boards/{boardID}", a.sessionRequired(a.handlePatchBoard)).Methods("PATCH")
apiv1.HandleFunc("/boards/{boardID}", a.sessionRequired(a.handleDeleteBoard)).Methods("DELETE")
apiv1.HandleFunc("/boards/{boardID}/duplicate", a.sessionRequired(a.handleDuplicateBoard)).Methods("POST")
apiv1.HandleFunc("/boards/{boardID}/undelete", a.sessionRequired(a.handleUndeleteBoard)).Methods("POST")
apiv1.HandleFunc("/boards/{boardID}/blocks", a.attachSession(a.handleGetBlocks, false)).Methods("GET")
apiv1.HandleFunc("/boards/{boardID}/blocks", a.sessionRequired(a.handlePostBlocks)).Methods("POST")
apiv1.HandleFunc("/boards/{boardID}/blocks", a.sessionRequired(a.handlePatchBlocks)).Methods("PATCH")
apiv1.HandleFunc("/boards/{boardID}/blocks/{blockID}", a.sessionRequired(a.handleDeleteBlock)).Methods("DELETE")
apiv1.HandleFunc("/boards/{boardID}/blocks/{blockID}", a.sessionRequired(a.handlePatchBlock)).Methods("PATCH")
apiv1.HandleFunc("/boards/{boardID}/blocks/{blockID}/undelete", a.sessionRequired(a.handleUndeleteBlock)).Methods("POST")
apiv1.HandleFunc("/boards/{boardID}/blocks/{blockID}/duplicate", a.sessionRequired(a.handleDuplicateBlock)).Methods("POST")
apiv1.HandleFunc("/boards/{boardID}/metadata", a.sessionRequired(a.handleGetBoardMetadata)).Methods("GET")
apiv2.HandleFunc("/teams/{teamID}/boards", a.sessionRequired(a.handleGetBoards)).Methods("GET")
apiv2.HandleFunc("/teams/{teamID}/boards/search", a.sessionRequired(a.handleSearchBoards)).Methods("GET")
apiv2.HandleFunc("/teams/{teamID}/templates", a.sessionRequired(a.handleGetTemplates)).Methods("GET")
apiv2.HandleFunc("/boards", a.sessionRequired(a.handleCreateBoard)).Methods("POST")
apiv2.HandleFunc("/boards/{boardID}", a.attachSession(a.handleGetBoard, false)).Methods("GET")
apiv2.HandleFunc("/boards/{boardID}", a.sessionRequired(a.handlePatchBoard)).Methods("PATCH")
apiv2.HandleFunc("/boards/{boardID}", a.sessionRequired(a.handleDeleteBoard)).Methods("DELETE")
apiv2.HandleFunc("/boards/{boardID}/duplicate", a.sessionRequired(a.handleDuplicateBoard)).Methods("POST")
apiv2.HandleFunc("/boards/{boardID}/undelete", a.sessionRequired(a.handleUndeleteBoard)).Methods("POST")
apiv2.HandleFunc("/boards/{boardID}/blocks", a.attachSession(a.handleGetBlocks, false)).Methods("GET")
apiv2.HandleFunc("/boards/{boardID}/blocks", a.sessionRequired(a.handlePostBlocks)).Methods("POST")
apiv2.HandleFunc("/boards/{boardID}/blocks", a.sessionRequired(a.handlePatchBlocks)).Methods("PATCH")
apiv2.HandleFunc("/boards/{boardID}/blocks/{blockID}", a.sessionRequired(a.handleDeleteBlock)).Methods("DELETE")
apiv2.HandleFunc("/boards/{boardID}/blocks/{blockID}", a.sessionRequired(a.handlePatchBlock)).Methods("PATCH")
apiv2.HandleFunc("/boards/{boardID}/blocks/{blockID}/undelete", a.sessionRequired(a.handleUndeleteBlock)).Methods("POST")
apiv2.HandleFunc("/boards/{boardID}/blocks/{blockID}/duplicate", a.sessionRequired(a.handleDuplicateBlock)).Methods("POST")
apiv2.HandleFunc("/boards/{boardID}/metadata", a.sessionRequired(a.handleGetBoardMetadata)).Methods("GET")
// Member APIs
apiv1.HandleFunc("/boards/{boardID}/members", a.sessionRequired(a.handleGetMembersForBoard)).Methods("GET")
apiv1.HandleFunc("/boards/{boardID}/members", a.sessionRequired(a.handleAddMember)).Methods("POST")
apiv1.HandleFunc("/boards/{boardID}/members/{userID}", a.sessionRequired(a.handleUpdateMember)).Methods("PUT")
apiv1.HandleFunc("/boards/{boardID}/members/{userID}", a.sessionRequired(a.handleDeleteMember)).Methods("DELETE")
apiv1.HandleFunc("/boards/{boardID}/join", a.sessionRequired(a.handleJoinBoard)).Methods("POST")
apiv1.HandleFunc("/boards/{boardID}/leave", a.sessionRequired(a.handleLeaveBoard)).Methods("POST")
apiv2.HandleFunc("/boards/{boardID}/members", a.sessionRequired(a.handleGetMembersForBoard)).Methods("GET")
apiv2.HandleFunc("/boards/{boardID}/members", a.sessionRequired(a.handleAddMember)).Methods("POST")
apiv2.HandleFunc("/boards/{boardID}/members/{userID}", a.sessionRequired(a.handleUpdateMember)).Methods("PUT")
apiv2.HandleFunc("/boards/{boardID}/members/{userID}", a.sessionRequired(a.handleDeleteMember)).Methods("DELETE")
apiv2.HandleFunc("/boards/{boardID}/join", a.sessionRequired(a.handleJoinBoard)).Methods("POST")
apiv2.HandleFunc("/boards/{boardID}/leave", a.sessionRequired(a.handleLeaveBoard)).Methods("POST")
// Sharing APIs
apiv1.HandleFunc("/boards/{boardID}/sharing", a.sessionRequired(a.handlePostSharing)).Methods("POST")
apiv1.HandleFunc("/boards/{boardID}/sharing", a.sessionRequired(a.handleGetSharing)).Methods("GET")
apiv2.HandleFunc("/boards/{boardID}/sharing", a.sessionRequired(a.handlePostSharing)).Methods("POST")
apiv2.HandleFunc("/boards/{boardID}/sharing", a.sessionRequired(a.handleGetSharing)).Methods("GET")
// Team APIs
apiv1.HandleFunc("/teams", a.sessionRequired(a.handleGetTeams)).Methods("GET")
apiv1.HandleFunc("/teams/{teamID}", a.sessionRequired(a.handleGetTeam)).Methods("GET")
apiv1.HandleFunc("/teams/{teamID}/regenerate_signup_token", a.sessionRequired(a.handlePostTeamRegenerateSignupToken)).Methods("POST")
apiv1.HandleFunc("/teams/{teamID}/users", a.sessionRequired(a.handleGetTeamUsers)).Methods("GET")
apiv1.HandleFunc("/teams/{teamID}/archive/export", a.sessionRequired(a.handleArchiveExportTeam)).Methods("GET")
apiv1.HandleFunc("/teams/{teamID}/{boardID}/files", a.sessionRequired(a.handleUploadFile)).Methods("POST")
apiv2.HandleFunc("/teams", a.sessionRequired(a.handleGetTeams)).Methods("GET")
apiv2.HandleFunc("/teams/{teamID}", a.sessionRequired(a.handleGetTeam)).Methods("GET")
apiv2.HandleFunc("/teams/{teamID}/regenerate_signup_token", a.sessionRequired(a.handlePostTeamRegenerateSignupToken)).Methods("POST")
apiv2.HandleFunc("/teams/{teamID}/users", a.sessionRequired(a.handleGetTeamUsers)).Methods("GET")
apiv2.HandleFunc("/teams/{teamID}/archive/export", a.sessionRequired(a.handleArchiveExportTeam)).Methods("GET")
apiv2.HandleFunc("/teams/{teamID}/{boardID}/files", a.sessionRequired(a.handleUploadFile)).Methods("POST")
// User APIs
apiv1.HandleFunc("/users/me", a.sessionRequired(a.handleGetMe)).Methods("GET")
apiv1.HandleFunc("/users/me/memberships", a.sessionRequired(a.handleGetMyMemberships)).Methods("GET")
apiv1.HandleFunc("/users/{userID}", a.sessionRequired(a.handleGetUser)).Methods("GET")
apiv1.HandleFunc("/users/{userID}/changepassword", a.sessionRequired(a.handleChangePassword)).Methods("POST")
apiv1.HandleFunc("/users/{userID}/config", a.sessionRequired(a.handleUpdateUserConfig)).Methods(http.MethodPut)
apiv2.HandleFunc("/users/me", a.sessionRequired(a.handleGetMe)).Methods("GET")
apiv2.HandleFunc("/users/me/memberships", a.sessionRequired(a.handleGetMyMemberships)).Methods("GET")
apiv2.HandleFunc("/users/{userID}", a.sessionRequired(a.handleGetUser)).Methods("GET")
apiv2.HandleFunc("/users/{userID}/changepassword", a.sessionRequired(a.handleChangePassword)).Methods("POST")
apiv2.HandleFunc("/users/{userID}/config", a.sessionRequired(a.handleUpdateUserConfig)).Methods(http.MethodPut)
// BoardsAndBlocks APIs
apiv1.HandleFunc("/boards-and-blocks", a.sessionRequired(a.handleCreateBoardsAndBlocks)).Methods("POST")
apiv1.HandleFunc("/boards-and-blocks", a.sessionRequired(a.handlePatchBoardsAndBlocks)).Methods("PATCH")
apiv1.HandleFunc("/boards-and-blocks", a.sessionRequired(a.handleDeleteBoardsAndBlocks)).Methods("DELETE")
apiv2.HandleFunc("/boards-and-blocks", a.sessionRequired(a.handleCreateBoardsAndBlocks)).Methods("POST")
apiv2.HandleFunc("/boards-and-blocks", a.sessionRequired(a.handlePatchBoardsAndBlocks)).Methods("PATCH")
apiv2.HandleFunc("/boards-and-blocks", a.sessionRequired(a.handleDeleteBoardsAndBlocks)).Methods("DELETE")
// Auth APIs
apiv1.HandleFunc("/login", a.handleLogin).Methods("POST")
apiv1.HandleFunc("/logout", a.sessionRequired(a.handleLogout)).Methods("POST")
apiv1.HandleFunc("/register", a.handleRegister).Methods("POST")
apiv1.HandleFunc("/clientConfig", a.getClientConfig).Methods("GET")
apiv2.HandleFunc("/login", a.handleLogin).Methods("POST")
apiv2.HandleFunc("/logout", a.sessionRequired(a.handleLogout)).Methods("POST")
apiv2.HandleFunc("/register", a.handleRegister).Methods("POST")
apiv2.HandleFunc("/clientConfig", a.getClientConfig).Methods("GET")
// Category APIs
apiv1.HandleFunc("/teams/{teamID}/categories", a.sessionRequired(a.handleCreateCategory)).Methods(http.MethodPost)
apiv1.HandleFunc("/teams/{teamID}/categories/{categoryID}", a.sessionRequired(a.handleUpdateCategory)).Methods(http.MethodPut)
apiv1.HandleFunc("/teams/{teamID}/categories/{categoryID}", a.sessionRequired(a.handleDeleteCategory)).Methods(http.MethodDelete)
apiv2.HandleFunc("/teams/{teamID}/categories", a.sessionRequired(a.handleCreateCategory)).Methods(http.MethodPost)
apiv2.HandleFunc("/teams/{teamID}/categories/{categoryID}", a.sessionRequired(a.handleUpdateCategory)).Methods(http.MethodPut)
apiv2.HandleFunc("/teams/{teamID}/categories/{categoryID}", a.sessionRequired(a.handleDeleteCategory)).Methods(http.MethodDelete)
// Category Block APIs
apiv1.HandleFunc("/teams/{teamID}/categories", a.sessionRequired(a.handleGetUserCategoryBlocks)).Methods(http.MethodGet)
apiv1.HandleFunc("/teams/{teamID}/categories/{categoryID}/blocks/{blockID}", a.sessionRequired(a.handleUpdateCategoryBlock)).Methods(http.MethodPost)
apiv2.HandleFunc("/teams/{teamID}/categories", a.sessionRequired(a.handleGetUserCategoryBlocks)).Methods(http.MethodGet)
apiv2.HandleFunc("/teams/{teamID}/categories/{categoryID}/blocks/{blockID}", a.sessionRequired(a.handleUpdateCategoryBlock)).Methods(http.MethodPost)
// Get Files API
apiv1.HandleFunc("/files/teams/{teamID}/{boardID}/{filename}", a.attachSession(a.handleServeFile, false)).Methods("GET")
apiv2.HandleFunc("/files/teams/{teamID}/{boardID}/{filename}", a.attachSession(a.handleServeFile, false)).Methods("GET")
// Subscriptions
apiv1.HandleFunc("/subscriptions", a.sessionRequired(a.handleCreateSubscription)).Methods("POST")
apiv1.HandleFunc("/subscriptions/{blockID}/{subscriberID}", a.sessionRequired(a.handleDeleteSubscription)).Methods("DELETE")
apiv1.HandleFunc("/subscriptions/{subscriberID}", a.sessionRequired(a.handleGetSubscriptions)).Methods("GET")
apiv2.HandleFunc("/subscriptions", a.sessionRequired(a.handleCreateSubscription)).Methods("POST")
apiv2.HandleFunc("/subscriptions/{blockID}/{subscriberID}", a.sessionRequired(a.handleDeleteSubscription)).Methods("DELETE")
apiv2.HandleFunc("/subscriptions/{subscriberID}", a.sessionRequired(a.handleGetSubscriptions)).Methods("GET")
// onboarding tour endpoints
apiv1.HandleFunc("/teams/{teamID}/onboard", a.sessionRequired(a.handleOnboard)).Methods(http.MethodPost)
apiv2.HandleFunc("/teams/{teamID}/onboard", a.sessionRequired(a.handleOnboard)).Methods(http.MethodPost)
// archives
apiv1.HandleFunc("/boards/{boardID}/archive/export", a.sessionRequired(a.handleArchiveExportBoard)).Methods("GET")
apiv1.HandleFunc("/teams/{teamID}/archive/import", a.sessionRequired(a.handleArchiveImport)).Methods("POST")
apiv2.HandleFunc("/boards/{boardID}/archive/export", a.sessionRequired(a.handleArchiveExportBoard)).Methods("GET")
apiv2.HandleFunc("/teams/{teamID}/archive/import", a.sessionRequired(a.handleArchiveImport)).Methods("POST")
}
func (a *API) RegisterAdminRoutes(r *mux.Router) {
r.HandleFunc("/api/v1/admin/users/{username}/password", a.adminRequired(a.handleAdminSetPassword)).Methods("POST")
r.HandleFunc("/api/v2/admin/users/{username}/password", a.adminRequired(a.handleAdminSetPassword)).Methods("POST")
}
func getUserID(r *http.Request) string {
@ -230,7 +230,7 @@ func (a *API) hasValidReadTokenForBoard(r *http.Request, boardID string) bool {
}
func (a *API) handleGetBlocks(w http.ResponseWriter, r *http.Request) {
// swagger:operation GET /api/v1/boards/{boardID}/blocks getBlocks
// swagger:operation GET /boards/{boardID}/blocks getBlocks
//
// Returns blocks
//
@ -591,7 +591,7 @@ func (a *API) handleUpdateCategoryBlock(w http.ResponseWriter, r *http.Request)
}
func (a *API) handlePostBlocks(w http.ResponseWriter, r *http.Request) {
// swagger:operation POST /api/v1/boards/{boardID}/blocks updateBlocks
// swagger:operation POST /boards/{boardID}/blocks updateBlocks
//
// Insert blocks. The specified IDs will only be used to link
// blocks with existing ones, the rest will be replaced by server
@ -719,7 +719,7 @@ func (a *API) handlePostBlocks(w http.ResponseWriter, r *http.Request) {
}
func (a *API) handleUpdateUserConfig(w http.ResponseWriter, r *http.Request) {
// swagger:operation PATCH /api/v1/users/{userID}/config updateUserConfig
// swagger:operation PATCH /users/{userID}/config updateUserConfig
//
// Updates user config
//
@ -793,7 +793,7 @@ func (a *API) handleUpdateUserConfig(w http.ResponseWriter, r *http.Request) {
}
func (a *API) handleGetUser(w http.ResponseWriter, r *http.Request) {
// swagger:operation GET /api/v1/users/{userID} getUser
// swagger:operation GET /users/{userID} getUser
//
// Returns a user
//
@ -842,7 +842,7 @@ func (a *API) handleGetUser(w http.ResponseWriter, r *http.Request) {
}
func (a *API) handleGetMe(w http.ResponseWriter, r *http.Request) {
// swagger:operation GET /api/v1/users/me getMe
// swagger:operation GET /users/me getMe
//
// Returns the currently logged-in user
//
@ -899,7 +899,7 @@ func (a *API) handleGetMe(w http.ResponseWriter, r *http.Request) {
}
func (a *API) handleGetMyMemberships(w http.ResponseWriter, r *http.Request) {
// swagger:operation GET /api/v1/users/me/memberships getMyMemberships
// swagger:operation GET /users/me/memberships getMyMemberships
//
// Returns the currently users board memberships
//
@ -944,7 +944,7 @@ func (a *API) handleGetMyMemberships(w http.ResponseWriter, r *http.Request) {
}
func (a *API) handleDeleteBlock(w http.ResponseWriter, r *http.Request) {
// swagger:operation DELETE /api/v1/boards/{boardID}/blocks/{blockID} deleteBlock
// swagger:operation DELETE /boards/{boardID}/blocks/{blockID} deleteBlock
//
// Deletes a block
//
@ -1012,7 +1012,7 @@ func (a *API) handleDeleteBlock(w http.ResponseWriter, r *http.Request) {
}
func (a *API) handleUndeleteBlock(w http.ResponseWriter, r *http.Request) {
// swagger:operation POST /api/v1/boards/{boardID}/blocks/{blockID}/undelete undeleteBlock
// swagger:operation POST /boards/{boardID}/blocks/{blockID}/undelete undeleteBlock
//
// Undeletes a block
//
@ -1105,7 +1105,7 @@ func (a *API) handleUndeleteBlock(w http.ResponseWriter, r *http.Request) {
}
func (a *API) handleUndeleteBoard(w http.ResponseWriter, r *http.Request) {
// swagger:operation POST /api/v1/boards/{boardID}/undelete undeleteBoard
// swagger:operation POST /boards/{boardID}/undelete undeleteBoard
//
// Undeletes a board
//
@ -1157,7 +1157,7 @@ func (a *API) handleUndeleteBoard(w http.ResponseWriter, r *http.Request) {
}
func (a *API) handlePatchBlock(w http.ResponseWriter, r *http.Request) {
// swagger:operation PATCH /api/v1/boards/{boardID}/blocks/{blockID} patchBlock
// swagger:operation PATCH /boards/{boardID}/blocks/{blockID} patchBlock
//
// Partially updates a block
//
@ -1244,7 +1244,7 @@ func (a *API) handlePatchBlock(w http.ResponseWriter, r *http.Request) {
}
func (a *API) handlePatchBlocks(w http.ResponseWriter, r *http.Request) {
// swagger:operation PATCH /api/v1/boards/{boardID}/blocks/ patchBlocks
// swagger:operation PATCH /boards/{boardID}/blocks/ patchBlocks
//
// Partially updates batch of blocks
//
@ -1327,7 +1327,7 @@ func (a *API) handlePatchBlocks(w http.ResponseWriter, r *http.Request) {
// Sharing
func (a *API) handleGetSharing(w http.ResponseWriter, r *http.Request) {
// swagger:operation GET /api/v1/boards/{boardID}/sharing getSharing
// swagger:operation GET /boards/{boardID}/sharing getSharing
//
// Returns sharing information for a board
//
@ -1396,7 +1396,7 @@ func (a *API) handleGetSharing(w http.ResponseWriter, r *http.Request) {
}
func (a *API) handlePostSharing(w http.ResponseWriter, r *http.Request) {
// swagger:operation POST /api/v1/boards/{boardID}/sharing postSharing
// swagger:operation POST /boards/{boardID}/sharing postSharing
//
// Sets sharing information for a board
//
@ -1491,7 +1491,7 @@ func (a *API) handlePostSharing(w http.ResponseWriter, r *http.Request) {
// Team
func (a *API) handleGetTeams(w http.ResponseWriter, r *http.Request) {
// swagger:operation GET /api/v1/teams getTeams
// swagger:operation GET /teams getTeams
//
// Returns information of all the teams
//
@ -1534,7 +1534,7 @@ func (a *API) handleGetTeams(w http.ResponseWriter, r *http.Request) {
}
func (a *API) handleGetTeam(w http.ResponseWriter, r *http.Request) {
// swagger:operation GET /api/v1/teams/{teamID} getTeam
// swagger:operation GET /teams/{teamID} getTeam
//
// Returns information of the root team
//
@ -1603,7 +1603,7 @@ func (a *API) handleGetTeam(w http.ResponseWriter, r *http.Request) {
}
func (a *API) handlePostTeamRegenerateSignupToken(w http.ResponseWriter, r *http.Request) {
// swagger:operation POST /api/v1/teams/{teamID}/regenerate_signup_token regenerateSignupToken
// swagger:operation POST /teams/{teamID}/regenerate_signup_token regenerateSignupToken
//
// Regenerates the signup token for the root team
//
@ -1654,7 +1654,7 @@ func (a *API) handlePostTeamRegenerateSignupToken(w http.ResponseWriter, r *http
// File upload
func (a *API) handleServeFile(w http.ResponseWriter, r *http.Request) {
// swagger:operation GET "api/v1/files/teams/{teamID}/{boardID}/{filename} getFile
// swagger:operation GET "api/v2/files/teams/{teamID}/{boardID}/{filename} getFile
//
// Returns the contents of an uploaded file
//
@ -1765,7 +1765,7 @@ func FileUploadResponseFromJSON(data io.Reader) (*FileUploadResponse, error) {
}
func (a *API) handleUploadFile(w http.ResponseWriter, r *http.Request) {
// swagger:operation POST /api/v1/teams/{teamID}/boards/{boardID}/files uploadFile
// swagger:operation POST /teams/{teamID}/boards/{boardID}/files uploadFile
//
// Upload a binary file, attached to a root block
//
@ -1866,7 +1866,7 @@ func (a *API) handleUploadFile(w http.ResponseWriter, r *http.Request) {
}
func (a *API) handleGetTeamUsers(w http.ResponseWriter, r *http.Request) {
// swagger:operation GET /api/v1/teams/{teamID}/users getTeamUsers
// swagger:operation GET /teams/{teamID}/users getTeamUsers
//
// Returns team users
//
@ -1931,7 +1931,7 @@ func (a *API) handleGetTeamUsers(w http.ResponseWriter, r *http.Request) {
}
func (a *API) handleGetBoards(w http.ResponseWriter, r *http.Request) {
// swagger:operation GET /api/v1/teams/{teamID}/boards getBoards
// swagger:operation GET /teams/{teamID}/boards getBoards
//
// Returns team boards
//
@ -1996,7 +1996,7 @@ func (a *API) handleGetBoards(w http.ResponseWriter, r *http.Request) {
}
func (a *API) handleGetTemplates(w http.ResponseWriter, r *http.Request) {
// swagger:operation GET /api/v1/teams/{teamID}/templates getTemplates
// swagger:operation GET /teams/{teamID}/templates getTemplates
//
// Returns team templates
//
@ -2072,7 +2072,7 @@ func (a *API) handleGetTemplates(w http.ResponseWriter, r *http.Request) {
// subscriptions
func (a *API) handleCreateSubscription(w http.ResponseWriter, r *http.Request) {
// swagger:operation POST /api/v1/subscriptions createSubscription
// swagger:operation POST /subscriptions createSubscription
//
// Creates a subscription to a block for a user. The user will receive change notifications for the block.
//
@ -2159,7 +2159,7 @@ func (a *API) handleCreateSubscription(w http.ResponseWriter, r *http.Request) {
}
func (a *API) handleDeleteSubscription(w http.ResponseWriter, r *http.Request) {
// swagger:operation DELETE /api/v1/subscriptions/{blockID}/{subscriberID} deleteSubscription
// swagger:operation DELETE /subscriptions/{blockID}/{subscriberID} deleteSubscription
//
// Deletes a subscription a user has for a a block. The user will no longer receive change notifications for the block.
//
@ -2221,7 +2221,7 @@ func (a *API) handleDeleteSubscription(w http.ResponseWriter, r *http.Request) {
}
func (a *API) handleGetSubscriptions(w http.ResponseWriter, r *http.Request) {
// swagger:operation GET /api/v1/subscriptions/{subscriberID} getSubscriptions
// swagger:operation GET /subscriptions/{subscriberID} getSubscriptions
//
// Gets subscriptions for a user.
//
@ -2286,7 +2286,7 @@ func (a *API) handleGetSubscriptions(w http.ResponseWriter, r *http.Request) {
}
func (a *API) handleCreateBoard(w http.ResponseWriter, r *http.Request) {
// swagger:operation POST /api/v1/boards createBoard
// swagger:operation POST /boards createBoard
//
// Creates a new board
//
@ -2375,7 +2375,7 @@ func (a *API) handleCreateBoard(w http.ResponseWriter, r *http.Request) {
}
func (a *API) handleOnboard(w http.ResponseWriter, r *http.Request) {
// swagger:operation POST /api/v1/team/{teamID}/onboard onboard
// swagger:operation POST /team/{teamID}/onboard onboard
//
// Onboards a user on Boards.
//
@ -2427,7 +2427,7 @@ func (a *API) handleOnboard(w http.ResponseWriter, r *http.Request) {
}
func (a *API) handleGetBoard(w http.ResponseWriter, r *http.Request) {
// swagger:operation GET /api/v1/boards/{boardID} getBoard
// swagger:operation GET /boards/{boardID} getBoard
//
// Returns a board
//
@ -2508,7 +2508,7 @@ func (a *API) handleGetBoard(w http.ResponseWriter, r *http.Request) {
}
func (a *API) handlePatchBoard(w http.ResponseWriter, r *http.Request) {
// swagger:operation PATCH /api/v1/boards/{boardID} patchBoard
// swagger:operation PATCH /boards/{boardID} patchBoard
//
// Partially updates a board
//
@ -2613,7 +2613,7 @@ func (a *API) handlePatchBoard(w http.ResponseWriter, r *http.Request) {
}
func (a *API) handleDeleteBoard(w http.ResponseWriter, r *http.Request) {
// swagger:operation DELETE /api/v1/boards/{boardID} deleteBoard
// swagger:operation DELETE /boards/{boardID} deleteBoard
//
// Removes a board
//
@ -2673,7 +2673,7 @@ func (a *API) handleDeleteBoard(w http.ResponseWriter, r *http.Request) {
}
func (a *API) handleDuplicateBoard(w http.ResponseWriter, r *http.Request) {
// swagger:operation POST /api/v1/boards/{boardID}/duplicate duplicateBoard
// swagger:operation POST /boards/{boardID}/duplicate duplicateBoard
//
// Returns the new created board and all the blocks
//
@ -2765,7 +2765,7 @@ func (a *API) handleDuplicateBoard(w http.ResponseWriter, r *http.Request) {
}
func (a *API) handleDuplicateBlock(w http.ResponseWriter, r *http.Request) {
// swagger:operation POST /api/v1/boards/{boardID}/blocks/{blockID}/duplicate duplicateBlock
// swagger:operation POST /boards/{boardID}/blocks/{blockID}/duplicate duplicateBlock
//
// Returns the new created blocks
//
@ -2868,7 +2868,7 @@ func (a *API) handleDuplicateBlock(w http.ResponseWriter, r *http.Request) {
}
func (a *API) handleGetBoardMetadata(w http.ResponseWriter, r *http.Request) {
// swagger:operation GET /api/v1/boards/{boardID}/metadata getBoardMetadata
// swagger:operation GET /boards/{boardID}/metadata getBoardMetadata
//
// Returns a board's metadata
//
@ -2943,7 +2943,7 @@ func (a *API) handleGetBoardMetadata(w http.ResponseWriter, r *http.Request) {
}
func (a *API) handleSearchBoards(w http.ResponseWriter, r *http.Request) {
// swagger:operation GET /api/v1/teams/{teamID}/boards/search searchBoards
// swagger:operation GET /teams/{teamID}/boards/search searchBoards
//
// Returns the boards that match with a search term
//
@ -3019,7 +3019,7 @@ func (a *API) handleSearchBoards(w http.ResponseWriter, r *http.Request) {
}
func (a *API) handleGetMembersForBoard(w http.ResponseWriter, r *http.Request) {
// swagger:operation GET /api/v1/boards/{boardID}/members getMembersForBoard
// swagger:operation GET /boards/{boardID}/members getMembersForBoard
//
// Returns the members of the board
//
@ -3453,7 +3453,7 @@ func (a *API) handleUpdateMember(w http.ResponseWriter, r *http.Request) {
}
func (a *API) handleDeleteMember(w http.ResponseWriter, r *http.Request) {
// swagger:operation DELETE /api/v1/boards/{boardID}/members/{userID} deleteMember
// swagger:operation DELETE /boards/{boardID}/members/{userID} deleteMember
//
// Deletes a member from a board
//
@ -3529,7 +3529,7 @@ func (a *API) handleDeleteMember(w http.ResponseWriter, r *http.Request) {
}
func (a *API) handleCreateBoardsAndBlocks(w http.ResponseWriter, r *http.Request) {
// swagger:operation POST /api/v1/boards-and-blocks insertBoardsAndBlocks
// swagger:operation POST /boards-and-blocks insertBoardsAndBlocks
//
// Creates new boards and blocks
//
@ -3673,7 +3673,7 @@ func (a *API) handleCreateBoardsAndBlocks(w http.ResponseWriter, r *http.Request
}
func (a *API) handlePatchBoardsAndBlocks(w http.ResponseWriter, r *http.Request) {
// swagger:operation PATCH /api/v1/boards-and-blocks patchBoardsAndBlocks
// swagger:operation PATCH /boards-and-blocks patchBoardsAndBlocks
//
// Patches a set of related boards and blocks
//
@ -3811,7 +3811,7 @@ func (a *API) handlePatchBoardsAndBlocks(w http.ResponseWriter, r *http.Request)
}
func (a *API) handleDeleteBoardsAndBlocks(w http.ResponseWriter, r *http.Request) {
// swagger:operation DELETE /api/v1/boards-and-blocks deleteBoardsAndBlocks
// swagger:operation DELETE /boards-and-blocks deleteBoardsAndBlocks
//
// Deletes boards and blocks
//

View File

@ -17,7 +17,7 @@ const (
)
func (a *API) handleArchiveExportBoard(w http.ResponseWriter, r *http.Request) {
// swagger:operation GET /api/v1/boards/{boardID}/archive/export archiveExportBoard
// swagger:operation GET /boards/{boardID}/archive/export archiveExportBoard
//
// Exports an archive of all blocks for one boards.
//
@ -85,7 +85,7 @@ func (a *API) handleArchiveExportBoard(w http.ResponseWriter, r *http.Request) {
}
func (a *API) handleArchiveExportTeam(w http.ResponseWriter, r *http.Request) {
// swagger:operation GET /api/v1/teams/{teamID}/archive/export archiveExportTeam
// swagger:operation GET /teams/{teamID}/archive/export archiveExportTeam
//
// Exports an archive of all blocks for all the boards in a team.
//
@ -154,7 +154,7 @@ func (a *API) handleArchiveExportTeam(w http.ResponseWriter, r *http.Request) {
}
func (a *API) handleArchiveImport(w http.ResponseWriter, r *http.Request) {
// swagger:operation POST /api/v1/teams/{teamID}/archive/import archiveImport
// swagger:operation POST /teams/{teamID}/archive/import archiveImport
//
// Import an archive of boards.
//

View File

@ -139,7 +139,7 @@ func isValidPassword(password string) error {
}
func (a *API) handleLogin(w http.ResponseWriter, r *http.Request) {
// swagger:operation POST /api/v1/login login
// swagger:operation POST /login login
//
// Login user
//
@ -220,7 +220,7 @@ func (a *API) handleLogin(w http.ResponseWriter, r *http.Request) {
}
func (a *API) handleLogout(w http.ResponseWriter, r *http.Request) {
// swagger:operation POST /api/v1/logout logout
// swagger:operation POST /logout logout
//
// Logout user
//
@ -271,7 +271,7 @@ func (a *API) handleLogout(w http.ResponseWriter, r *http.Request) {
}
func (a *API) handleRegister(w http.ResponseWriter, r *http.Request) {
// swagger:operation POST /api/v1/register register
// swagger:operation POST /register register
//
// Register new user
//
@ -369,7 +369,7 @@ func (a *API) handleRegister(w http.ResponseWriter, r *http.Request) {
}
func (a *API) handleChangePassword(w http.ResponseWriter, r *http.Request) {
// swagger:operation POST /api/v1/users/{userID}/changepassword changePassword
// swagger:operation POST /users/{userID}/changepassword changePassword
//
// Change a user's password
//

View File

@ -15,7 +15,7 @@ import (
)
const (
APIURLSuffix = "/api/v1"
APIURLSuffix = "/api/v2"
)
type RequestReaderError struct {

View File

@ -4,7 +4,7 @@
//
// Schemes: http, https
// Host: localhost
// BasePath: /api/v1
// BasePath: /api/v2
// Version: 1.0.0
// License: Custom https://github.com/mattermost/focalboard/blob/main/LICENSE.txt
// Contact: Focalboard<api@focalboard.com> https://www.focalboard.com

View File

@ -34,7 +34,7 @@ Refer to the [Mattermost API documentation here](https://api.mattermost.com/#tag
Pass this token as a bearer token to the Boards APIs, e.g.
```
curl -i -H "X-Requested-With: XMLHttpRequest" -H 'Authorization: Bearer abcdefghijklmnopqrstuvwxyz' https://community.mattermost.com/plugins/focalboard/api/v1/workspaces
curl -i -H "X-Requested-With: XMLHttpRequest" -H 'Authorization: Bearer abcdefghijklmnopqrstuvwxyz' https://community.mattermost.com/plugins/focalboard/api/v2/workspaces
```
Note that the `X-Requested-With: XMLHttpRequest` header is required to pass the CSRF check.

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -7,7 +7,7 @@ import {UserConfigPatch} from '../../src/user'
Cypress.Commands.add('apiRegisterUser', (data: Cypress.UserData, token?: string, failOnError?: boolean) => {
return cy.request({
method: 'POST',
url: '/api/v1/register',
url: '/api/v2/register',
body: {
...data,
token,
@ -22,7 +22,7 @@ Cypress.Commands.add('apiRegisterUser', (data: Cypress.UserData, token?: string,
Cypress.Commands.add('apiLoginUser', (data: Cypress.LoginData) => {
return cy.request({
method: 'POST',
url: '/api/v1/login',
url: '/api/v2/login',
body: {
...data,
type: 'normal',
@ -55,7 +55,7 @@ Cypress.Commands.add('apiInitServer', () => {
Cypress.Commands.add('apiDeleteBoard', (id: string) => {
return cy.request({
method: 'DELETE',
url: `/api/v1/boards/${encodeURIComponent(id)}`,
url: `/api/v2/boards/${encodeURIComponent(id)}`,
...headers(),
})
})
@ -71,7 +71,7 @@ const deleteBoards = (ids: string[]) => {
Cypress.Commands.add('apiResetBoards', () => {
return cy.request({
method: 'GET',
url: '/api/v1/teams/0/boards',
url: '/api/v2/teams/0/boards',
...headers(),
}).then((response) => {
if (Array.isArray(response.body)) {
@ -91,7 +91,7 @@ Cypress.Commands.add('apiSkipTour', (userID: string) => {
return cy.request({
method: 'PUT',
url: `/api/v1/users/${encodeURIComponent(userID)}/config`,
url: `/api/v2/users/${encodeURIComponent(userID)}/config`,
...headers(),
body,
})
@ -100,7 +100,7 @@ Cypress.Commands.add('apiSkipTour', (userID: string) => {
Cypress.Commands.add('apiGetMe', () => {
return cy.request({
method: 'GET',
url: '/api/v1/users/me',
url: '/api/v2/users/me',
...headers(),
}).then((response) => response.body.id)
})
@ -109,7 +109,7 @@ Cypress.Commands.add('apiChangePassword', (userId: string, oldPassword: string,
const body = {oldPassword, newPassword}
return cy.request({
method: 'POST',
url: `/api/v1/users/${encodeURIComponent(userId)}/changepassword`,
url: `/api/v2/users/${encodeURIComponent(userId)}/changepassword`,
...headers(),
body,
})

View File

@ -61,7 +61,7 @@ class OctoClient {
}
async login(username: string, password: string): Promise<boolean> {
const path = '/api/v1/login'
const path = '/api/v2/login'
const body = JSON.stringify({username, password, type: 'normal'})
const response = await fetch(this.getBaseURL() + path, {
method: 'POST',
@ -81,7 +81,7 @@ class OctoClient {
}
async logout(): Promise<boolean> {
const path = '/api/v1/logout'
const path = '/api/v2/logout'
const response = await fetch(this.getBaseURL() + path, {
method: 'POST',
headers: this.headers(),
@ -95,7 +95,7 @@ class OctoClient {
}
async getClientConfig(): Promise<ClientConfig | null> {
const path = '/api/v1/clientConfig'
const path = '/api/v2/clientConfig'
const response = await fetch(this.getBaseURL() + path, {
method: 'GET',
headers: this.headers(),
@ -109,7 +109,7 @@ class OctoClient {
}
async register(email: string, username: string, password: string, token?: string): Promise<{code: number, json: {error?: string}}> {
const path = '/api/v1/register'
const path = '/api/v2/register'
const body = JSON.stringify({email, username, password, token})
const response = await fetch(this.getBaseURL() + path, {
method: 'POST',
@ -121,7 +121,7 @@ class OctoClient {
}
async changePassword(userId: string, oldPassword: string, newPassword: string): Promise<{code: number, json: {error?: string}}> {
const path = `/api/v1/users/${encodeURIComponent(userId)}/changepassword`
const path = `/api/v2/users/${encodeURIComponent(userId)}/changepassword`
const body = JSON.stringify({oldPassword, newPassword})
const response = await fetch(this.getBaseURL() + path, {
method: 'POST',
@ -148,15 +148,15 @@ class OctoClient {
teamIdToUse = this.teamId === Constants.globalTeamId ? UserSettings.lastTeamId || this.teamId : this.teamId
}
return `/api/v1/teams/${teamIdToUse}`
return `/api/v2/teams/${teamIdToUse}`
}
private teamsPath(): string {
return '/api/v1/teams'
return '/api/v2/teams'
}
async getMe(): Promise<IUser | undefined> {
const path = '/api/v1/users/me'
const path = '/api/v2/users/me'
const response = await fetch(this.getBaseURL() + path, {headers: this.headers()})
if (response.status !== 200) {
return undefined
@ -166,7 +166,7 @@ class OctoClient {
}
async getMyBoardMemberships(): Promise<BoardMember[]> {
const path = '/api/v1/users/me/memberships'
const path = '/api/v2/users/me/memberships'
const response = await fetch(this.getBaseURL() + path, {headers: this.headers()})
if (response.status !== 200) {
return []
@ -176,7 +176,7 @@ class OctoClient {
}
async getUser(userId: string): Promise<IUser | undefined> {
const path = `/api/v1/users/${encodeURIComponent(userId)}`
const path = `/api/v2/users/${encodeURIComponent(userId)}`
const response = await fetch(this.getBaseURL() + path, {headers: this.headers()})
if (response.status !== 200) {
return undefined
@ -186,7 +186,7 @@ class OctoClient {
}
async patchUserConfig(userID: string, patch: UserConfigPatch): Promise<Record<string, string> | undefined> {
const path = `/api/v1/users/${encodeURIComponent(userID)}/config`
const path = `/api/v2/users/${encodeURIComponent(userID)}/config`
const body = JSON.stringify(patch)
const response = await fetch(this.getBaseURL() + path, {
headers: this.headers(),
@ -202,12 +202,12 @@ class OctoClient {
}
async exportBoardArchive(boardID: string): Promise<Response> {
const path = `/api/v1/boards/${boardID}/archive/export`
const path = `/api/v2/boards/${boardID}/archive/export`
return fetch(this.getBaseURL() + path, {headers: this.headers()})
}
async exportFullArchive(teamID: string): Promise<Response> {
const path = `/api/v1/teams/${teamID}/archive/export`
const path = `/api/v2/teams/${teamID}/archive/export`
return fetch(this.getBaseURL() + path, {headers: this.headers()})
}
@ -243,7 +243,7 @@ class OctoClient {
}
async getBlocksWithBlockID(blockID: string, boardID: string, optionalReadToken?: string): Promise<Block[]> {
let path = `/api/v1/boards/${boardID}/blocks?block_id=${blockID}`
let path = `/api/v2/boards/${boardID}/blocks?block_id=${blockID}`
const readToken = optionalReadToken || Utils.getReadToken()
if (readToken) {
path += `&read_token=${readToken}`
@ -252,7 +252,7 @@ class OctoClient {
}
async getAllBlocks(boardID: string): Promise<Block[]> {
let path = `/api/v1/boards/${boardID}/blocks?all=true`
let path = `/api/v2/boards/${boardID}/blocks?all=true`
const readToken = Utils.getReadToken()
if (readToken) {
path += `&read_token=${readToken}`
@ -301,7 +301,7 @@ class OctoClient {
async patchBlock(boardId: string, blockId: string, blockPatch: BlockPatch): Promise<Response> {
Utils.log(`patchBlock: ${blockId} block`)
const body = JSON.stringify(blockPatch)
return fetch(`${this.getBaseURL()}/api/v1/boards/${boardId}/blocks/${blockId}`, {
return fetch(`${this.getBaseURL()}/api/v2/boards/${boardId}/blocks/${blockId}`, {
method: 'PATCH',
headers: this.headers(),
body,
@ -324,7 +324,7 @@ class OctoClient {
async deleteBlock(boardId: string, blockId: string): Promise<Response> {
Utils.log(`deleteBlock: ${blockId} on board ${boardId}`)
return fetch(`${this.getBaseURL()}/api/v1/boards/${boardId}/blocks/${encodeURIComponent(blockId)}`, {
return fetch(`${this.getBaseURL()}/api/v2/boards/${boardId}/blocks/${encodeURIComponent(blockId)}`, {
method: 'DELETE',
headers: this.headers(),
})
@ -332,7 +332,7 @@ class OctoClient {
async undeleteBlock(boardId: string, blockId: string): Promise<Response> {
Utils.log(`undeleteBlock: ${blockId}`)
return fetch(`${this.getBaseURL()}/api/v1/boards/${encodeURIComponent(boardId)}/blocks/${encodeURIComponent(blockId)}/undelete`, {
return fetch(`${this.getBaseURL()}/api/v2/boards/${encodeURIComponent(boardId)}/blocks/${encodeURIComponent(blockId)}/undelete`, {
method: 'POST',
headers: this.headers(),
})
@ -340,7 +340,7 @@ class OctoClient {
async undeleteBoard(boardId: string): Promise<Response> {
Utils.log(`undeleteBoard: ${boardId}`)
return fetch(`${this.getBaseURL()}/api/v1/boards/${boardId}/undelete`, {
return fetch(`${this.getBaseURL()}/api/v2/boards/${boardId}/undelete`, {
method: 'POST',
headers: this.headers(),
})
@ -354,7 +354,7 @@ class OctoClient {
subscriberId: userId,
}
return fetch(this.getBaseURL() + '/api/v1/subscriptions', {
return fetch(this.getBaseURL() + '/api/v2/subscriptions', {
method: 'POST',
headers: this.headers(),
body: JSON.stringify(body),
@ -362,7 +362,7 @@ class OctoClient {
}
async unfollowBlock(blockId: string, blockType: string, userId: string): Promise<Response> {
return fetch(this.getBaseURL() + `/api/v1/subscriptions/${blockId}/${userId}`, {
return fetch(this.getBaseURL() + `/api/v2/subscriptions/${blockId}/${userId}`, {
method: 'DELETE',
headers: this.headers(),
})
@ -378,7 +378,7 @@ class OctoClient {
Utils.log(`\t ${block.type}, ${block.id}, ${block.title?.substr(0, 50) || ''}`)
})
const body = JSON.stringify(blocks)
return fetch(`${this.getBaseURL()}/api/v1/boards/${boardId}/blocks` + (sourceBoardID ? `?sourceBoardID=${encodeURIComponent(sourceBoardID)}` : ''), {
return fetch(`${this.getBaseURL()}/api/v2/boards/${boardId}/blocks` + (sourceBoardID ? `?sourceBoardID=${encodeURIComponent(sourceBoardID)}` : ''), {
method: 'POST',
headers: this.headers(),
body,
@ -395,7 +395,7 @@ class OctoClient {
})
const body = JSON.stringify(bab)
return fetch(this.getBaseURL() + '/api/v1/boards-and-blocks', {
return fetch(this.getBaseURL() + '/api/v2/boards-and-blocks', {
method: 'POST',
headers: this.headers(),
body,
@ -408,7 +408,7 @@ class OctoClient {
Utils.log(`\t Blocks ${blockIds.join(', ')}`)
const body = JSON.stringify({boards: boardIds, blocks: blockIds})
return fetch(this.getBaseURL() + '/api/v1/boards-and-blocks', {
return fetch(this.getBaseURL() + '/api/v2/boards-and-blocks', {
method: 'DELETE',
headers: this.headers(),
body,
@ -420,7 +420,7 @@ class OctoClient {
Utils.log(`createBoardMember: user ${member.userId} and board ${member.boardId}`)
const body = JSON.stringify(member)
const response = await fetch(this.getBaseURL() + `/api/v1/boards/${member.boardId}/members`, {
const response = await fetch(this.getBaseURL() + `/api/v2/boards/${member.boardId}/members`, {
method: 'POST',
headers: this.headers(),
body,
@ -436,7 +436,7 @@ class OctoClient {
async joinBoard(boardId: string): Promise<BoardMember|undefined> {
Utils.log(`joinBoard: board ${boardId}`)
const response = await fetch(this.getBaseURL() + `/api/v1/boards/${boardId}/join`, {
const response = await fetch(this.getBaseURL() + `/api/v2/boards/${boardId}/join`, {
method: 'POST',
headers: this.headers()
})
@ -452,7 +452,7 @@ class OctoClient {
Utils.log(`udpateBoardMember: user ${member.userId} and board ${member.boardId}`)
const body = JSON.stringify(member)
return fetch(this.getBaseURL() + `/api/v1/boards/${member.boardId}/members/${member.userId}`, {
return fetch(this.getBaseURL() + `/api/v2/boards/${member.boardId}/members/${member.userId}`, {
method: 'PUT',
headers: this.headers(),
body,
@ -462,7 +462,7 @@ class OctoClient {
async deleteBoardMember(member: BoardMember): Promise<Response> {
Utils.log(`deleteBoardMember: user ${member.userId} and board ${member.boardId}`)
return fetch(this.getBaseURL() + `/api/v1/boards/${member.boardId}/members/${member.userId}`, {
return fetch(this.getBaseURL() + `/api/v2/boards/${member.boardId}/members/${member.userId}`, {
method: 'DELETE',
headers: this.headers(),
})
@ -474,7 +474,7 @@ class OctoClient {
Utils.log(`\t Blocks ${babp.blockIDs.join(', ')}`)
const body = JSON.stringify(babp)
return fetch(this.getBaseURL() + '/api/v1/boards-and-blocks', {
return fetch(this.getBaseURL() + '/api/v2/boards-and-blocks', {
method: 'PATCH',
headers: this.headers(),
body,
@ -483,7 +483,7 @@ class OctoClient {
// Sharing
async getSharing(boardID: string): Promise<ISharing | undefined> {
const path = `/api/v1/boards/${boardID}/sharing`
const path = `/api/v2/boards/${boardID}/sharing`
const response = await fetch(this.getBaseURL() + path, {headers: this.headers()})
if (response.status !== 200) {
return undefined
@ -492,7 +492,7 @@ class OctoClient {
}
async setSharing(boardID: string, sharing: ISharing): Promise<boolean> {
const path = `/api/v1/boards/${boardID}/sharing`
const path = `/api/v2/boards/${boardID}/sharing`
const body = JSON.stringify(sharing)
const response = await fetch(
this.getBaseURL() + path,
@ -557,7 +557,7 @@ class OctoClient {
}
async getFileAsDataUrl(boardId: string, fileId: string): Promise<string> {
let path = '/api/v1/files/teams/' + this.teamId + '/' + boardId + '/' + fileId
let path = '/api/v2/files/teams/' + this.teamId + '/' + boardId + '/' + fileId
const readToken = Utils.getReadToken()
if (readToken) {
path += `?read_token=${readToken}`
@ -627,7 +627,7 @@ class OctoClient {
}
async getBoard(boardID: string): Promise<Board | undefined> {
let path = `/api/v1/boards/${boardID}`
let path = `/api/v2/boards/${boardID}`
const readToken = Utils.getReadToken()
if (readToken) {
path += `?read_token=${readToken}`
@ -653,7 +653,7 @@ class OctoClient {
query += `&toTeam=${encodeURIComponent(toTeam)}`
}
const path = `/api/v1/boards/${boardID}/duplicate${query}`
const path = `/api/v2/boards/${boardID}/duplicate${query}`
const response = await fetch(this.getBaseURL() + path, {
method: 'POST',
headers: this.headers(),
@ -671,7 +671,7 @@ class OctoClient {
if (asTemplate) {
query = '?asTemplate=true'
}
const path = `/api/v1/boards/${boardID}/blocks/${blockID}/duplicate${query}`
const path = `/api/v2/boards/${boardID}/blocks/${blockID}/duplicate${query}`
const response = await fetch(this.getBaseURL() + path, {
method: 'POST',
headers: this.headers(),
@ -690,7 +690,7 @@ class OctoClient {
}
async getBoardMembers(teamId: string, boardId: string): Promise<BoardMember[]> {
const path = `/api/v1/boards/${boardId}/members`
const path = `/api/v2/boards/${boardId}/members`
return this.getBoardMembersWithPath(path)
}
@ -706,7 +706,7 @@ class OctoClient {
async patchBoard(boardId: string, boardPatch: BoardPatch): Promise<Response> {
Utils.log(`patchBoard: ${boardId} board`)
const body = JSON.stringify(boardPatch)
return fetch(`${this.getBaseURL()}/api/v1/boards/${boardId}`, {
return fetch(`${this.getBaseURL()}/api/v2/boards/${boardId}`, {
method: 'PATCH',
headers: this.headers(),
body,
@ -715,14 +715,14 @@ class OctoClient {
async deleteBoard(boardId: string): Promise<Response> {
Utils.log(`deleteBoard: ${boardId}`)
return fetch(`${this.getBaseURL()}/api/v1/boards/${boardId}`, {
return fetch(`${this.getBaseURL()}/api/v2/boards/${boardId}`, {
method: 'DELETE',
headers: this.headers(),
})
}
async getSidebarCategories(teamID: string): Promise<Array<CategoryBlocks>> {
const path = `/api/v1/teams/${teamID}/categories`
const path = `/api/v2/teams/${teamID}/categories`
const response = await fetch(this.getBaseURL() + path, {headers: this.headers()})
if (response.status !== 200) {
return []
@ -732,7 +732,7 @@ class OctoClient {
}
async createSidebarCategory(category: Category): Promise<Response> {
const path = `/api/v1/teams/${category.teamID}/categories`
const path = `/api/v2/teams/${category.teamID}/categories`
const body = JSON.stringify(category)
return fetch(this.getBaseURL() + path, {
method: 'POST',
@ -742,7 +742,7 @@ class OctoClient {
}
async deleteSidebarCategory(teamID: string, categoryID: string): Promise<Response> {
const url = `/api/v1/teams/${teamID}/categories/${categoryID}`
const url = `/api/v2/teams/${teamID}/categories/${categoryID}`
return fetch(this.getBaseURL() + url, {
method: 'DELETE',
headers: this.headers(),
@ -750,7 +750,7 @@ class OctoClient {
}
async updateSidebarCategory(category: Category): Promise<Response> {
const path = `/api/v1/teams/${category.teamID}/categories/${category.id}`
const path = `/api/v2/teams/${category.teamID}/categories/${category.id}`
const body = JSON.stringify(category)
return fetch(this.getBaseURL() + path, {
method: 'PUT',
@ -760,7 +760,7 @@ class OctoClient {
}
async moveBlockToCategory(teamID: string, blockID: string, toCategoryID: string, fromCategoryID: string): Promise<Response> {
const url = `/api/v1/teams/${teamID}/categories/${toCategoryID || '0'}/blocks/${blockID}`
const url = `/api/v2/teams/${teamID}/categories/${toCategoryID || '0'}/blocks/${blockID}`
const payload = {
fromCategoryID,
}
@ -788,7 +788,7 @@ class OctoClient {
}
async getUserBlockSubscriptions(userId: string): Promise<Array<Subscription>> {
const path = `/api/v1/subscriptions/${userId}`
const path = `/api/v2/subscriptions/${userId}`
const response = await fetch(this.getBaseURL() + path, {headers: this.headers()})
if (response.status !== 200) {
return []
@ -799,7 +799,7 @@ class OctoClient {
// onboarding
async prepareOnboarding(teamId: string): Promise<PrepareOnboardingResponse | undefined> {
const path = `/api/v1/teams/${teamId}/onboard`
const path = `/api/v2/teams/${teamId}/onboard`
const response = await fetch(this.getBaseURL() + path, {
headers: this.headers(),
method: 'POST',

View File

@ -40,7 +40,7 @@ if [[ $# < 2 ]] ; then
exit 1
fi
curl --unix-socket /var/tmp/focalboard_local.socket http://localhost/api/v1/admin/users/$1/password -X POST -H 'Content-Type: application/json' -d '{ "password": "'$2'" }'
curl --unix-socket /var/tmp/focalboard_local.socket http://localhost/api/v2/admin/users/$1/password -X POST -H 'Content-Type: application/json' -d '{ "password": "'$2'" }'
```
After resetting a user's password (e.g. if they forgot it), direct them to change it from the user menu, by clicking on their username at the top of the sidebar.