Merge branch 'main' of 10.11.10.35:ScheduleTogether/Backend
All checks were successful
/ build (push) Successful in 5m4s

This commit is contained in:
zervo 2024-12-06 07:18:31 +01:00
commit 9a95946b48
7 changed files with 484 additions and 15 deletions

View file

@ -1 +0,0 @@
../../build/ci/build.yaml

View file

@ -0,0 +1,22 @@
on: [push]
jobs:
build:
runs-on: docker
steps:
# Step 1: Check out the code
- uses: actions/checkout@v3
# Step 2: Set up go environment
- uses: actions/setup-go@v4
with:
go-version-file: '/workspace/ScheduleTogether/Backend/go.mod'
# Step 3: Set the working directory and build the project
- run: go build -x -v -o=stbackend -buildvcs=true ./cmd/stbackend/main.go
working-directory: /workspace/ScheduleTogether/Backend
# Step 4: Upload the build artifact
- uses: actions/upload-artifact@v3
with:
name: build-artifact
path: ./Backend/stbackend

View file

@ -0,0 +1,459 @@
openapi: 3.0.0
info:
description: "This is the API specification for the ScheduleTogether Backend."
version: 0.1.0
title: ScheduleTogether Backend
termsOfService: http://zervo.org/terms/
contact:
email: contact@dev.zervo.org
license:
name: AGPL 3.0
url: https://www.gnu.org/licenses/agpl-3.0.html
tags:
- name: account
description: Everything related to account management
externalDocs:
description: Find out more
url: https://git.zervo.org/ScheduleTogether/Backend/src/branch/main/internal/api/handlers/account_handler.go
- name: users
description: Everything related to user management
externalDocs:
description: Find out more
url: https://git.zervo.org/ScheduleTogether/Backend/src/branch/main/internal/api/handlers/users_handler.go
- name: friends
description: Everything related to friends management
externalDocs:
description: Find out more
url: https://git.zervo.org/ScheduleTogether/Backend/src/branch/main/internal/api/handlers/friends_handler.go
paths:
/account/register:
post:
tags:
- account
summary: Register a new user account
description: "Used to register a new user account. By default, newly created unverified accounts will be deleted after a while. To fully complete registration, an account verify request must be sent following the registration request."
operationId: registerAccount
requestBody:
$ref: "#/components/requestBodies/AccountRegister"
responses:
"400":
description: Request body validation failed
content:
application/json:
schema:
$ref: "#/components/schemas/CommonError"
"200":
description: Registration successful
content:
application/json:
schema:
$ref: "#/components/schemas/AccountRegisterResponse"
/account/verify:
post:
tags:
- account
summary: Verify a registered account
description: "Used to verify a newly registered user account. AKA complete user account registration."
operationId: verifyAccount
requestBody:
$ref: "#/components/requestBodies/AccountVerify"
responses:
"200":
description: Verification successful
content:
application/json:
schema:
$ref: "#/components/schemas/CommonMessage"
"400":
description: Invalid UUID or verification token
content:
application/json:
schema:
$ref: "#/components/schemas/CommonError"
/account/signin:
post:
tags:
- account
summary: Sign in to an existing user account
description: "Used to retrieve a session (jwt) token for a user account, that can in turn be used to authenticate subsequent requests."
operationId: signinAccount
requestBody:
$ref: "#/components/requestBodies/AccountSignin"
responses:
"401":
description: Authentication failed
content:
application/json:
schema:
$ref: "#/components/schemas/CommonError"
"400":
description: Request body validation failed
content:
application/json:
schema:
$ref: "#/components/schemas/CommonError"
"200":
description: Signed in successfully
content:
application/json:
schema:
$ref: "#/components/schemas/AccountSigninResponse"
/account/logout:
post:
tags:
- account
summary: Log out of a user account
description: "Used to invalidate a user account session (aka log out) based on context. REQUIRES: Authentication."
operationId: logoutAccount
responses:
"401":
description: Unauthorized
"200":
description: Successfully logged out
content:
application/json:
schema:
$ref: "#/components/schemas/CommonMessage"
/users:
get:
tags:
- users
summary: Get all users
description: "WILL BE PAGINATED IN THE FUTURE. Get all available users on the instance. REQUIRES: Authentication, GetAllUsers permission."
operationId: getUsers
responses:
"500":
description: Something went wrong
content:
application/json:
schema:
$ref: "#/components/schemas/CommonError"
"401":
description: Unauthorized
"200":
description: Successfully got all users
content:
application/json:
schema:
$ref: "#/components/schemas/GetAllUsersResponse"
/users/id/{userId}:
get:
tags:
- users
summary: Get user by internal ID
description: "Get user information about one account by internal user account ID. REQUIRES: Authentication, GetUserById permission."
operationId: getUserById
parameters:
- in: path
name: userId
schema:
type: integer
required: true
description: Numeric internal ID of the user to get
responses:
"401":
description: Unauthorized
"400":
description: Invalid parameters
content:
application/json:
schema:
$ref: "#/components/schemas/CommonError"
"404":
description: User not found
content:
application/json:
schema:
$ref: "#/components/schemas/CommonError"
"200":
description: Successfully got user
content:
application/json:
schema:
$ref: "#/components/schemas/DetailedUser"
/users/uuid/{userUuid}:
get:
tags:
- users
summary: Get user by UUID
description: "Get user information about one account by public user account UUID. REQUIRES: Authentication, GetUserByUuid permission."
operationId: getUserByUuid
parameters:
- in: path
name: userUuid
schema:
type: string
required: true
description: UUID of user to get
responses:
"401":
description: Unauthorized
"400":
description: Invalid parameters
content:
application/json:
schema:
$ref: "#/components/schemas/CommonError"
"404":
description: User not found
content:
application/json:
schema:
$ref: "#/components/schemas/CommonError"
"200":
description: Successfully got user
content:
application/json:
schema:
$ref: "#/components/schemas/DetailedUser"
/users/self:
get:
tags:
- users
summary: Get own user by session
description: "Get user information about the account which was used to authenticate the request. REQUIRES: Authentication, GetOwnUser permission."
operationId: getOwnUser
responses:
"401":
description: Unauthorized
"200":
description: Successfully got user
content:
application/json:
schema:
$ref: "#/components/schemas/DetailedUser"
/friends/add:
post:
tags:
- friends
summary: Create a friend request
description: "Create (AKA send) a friend request to another user account. The request is sent from the account used to perform this POST to the provided target account. REQUIRES: Authentication, SendFriendRequest permission."
operationId: addFriend
requestBody:
$ref: "#/components/requestBodies/FriendAdd"
responses:
"401":
description: Unauthorized
"400":
description: User does not exist, Already friends with user or Request already sent
content:
application/json:
schema:
$ref: "#/components/schemas/CommonError"
"200":
description: Friend request added successfully
content:
application/json:
schema:
$ref: "#/components/schemas/CommonMessage"
/friends/accept:
post:
tags:
- friends
summary: Accept an incoming friend request
description: "Accept an incoming friend request to your user account, from another user account. The request is accepted by the account used to perform this POST request. REQUIRES: Authentication, AcceptFriendRequest permission."
operationId: acceptFriend
requestBody:
$ref: "#/components/requestBodies/FriendAccept"
responses:
"401":
description: Unauthorized
"400":
description: User does not exist, You are already friends with user or Friend request not found
content:
application/json:
schema:
$ref: "#/components/schemas/CommonError"
"200":
description: Friend request accepted successfully
content:
application/json:
schema:
$ref: "#/components/schemas/CommonMessage"
/friends:
get:
tags:
- friends
summary: Get current incoming friend requests
description: "Get all current incoming friend requests to the user account used to authorize this POST request. REQUIRES: Authentication, GetOwnFriendRequests permission."
operationId: getFriendRequests
responses:
"401":
description: Unauthorized
"200":
description: Retrieved all incoming friend requests successfully
content:
application/json:
schema:
$ref: "#/components/schemas/FriendGetRequestsResponse"
externalDocs:
description: Find out more about ScheduleTogether
url: https://git.zervo.org/ScheduleTogether
servers:
- url: http://localhost:8080
- url: https://stbackend.swagger.io/v2
components:
requestBodies:
AccountRegister:
content:
application/json:
schema:
$ref: "#/components/schemas/AccountRegisterRequest"
AccountVerify:
content:
application/json:
schema:
$ref: "#/components/schemas/AccountVerifyRequest"
AccountSignin:
content:
application/json:
schema:
$ref: "#/components/schemas/AccountSigninRequest"
FriendAdd:
content:
application/json:
schema:
$ref: "#/components/schemas/FriendAddRequest"
FriendAccept:
content:
application/json:
schema:
$ref: "#/components/schemas/FriendAcceptRequest"
schemas:
CommonError:
type: object
properties:
error:
type: string
description: A string describing the error
CommonMessage:
type: object
properties:
message:
type: string
description: A message
DetailedUser:
type: object
properties:
id:
type: integer
description: Internal user ID
uuid:
type: string
description: Public unique user identifier
username:
type: string
firstName:
type: string
lastName:
type: string
email:
type: string
verified:
type: boolean
friends:
type: array
items:
type: string
AccountRegisterRequest:
type: object
properties:
firstName:
type: string
lastName:
type: string
username:
type: string
minLength: 5
maxLength: 18
email:
type: string
password:
type: string
minLength: 8
maxLength: 128
AccountRegisterResponse:
type: object
properties:
message:
type: string
description: A message describing the result
uuid:
type: string
description: The UUID of the newly created user
mustVerify:
type: boolean
description: Whether or not user needs to send account verify request to complete registration
AccountVerifyRequest:
type: object
properties:
uuid:
type: string
description: The UUID of the user account to verify
token:
type: string
description: The verification token
AccountSigninRequest:
type: object
properties:
username:
type: string
password:
type: string
AccountSigninResponse:
type: object
properties:
token:
type: string
description: The token to be used for authenticating all requests for this session
GetAllUsersResponse:
type: array
items:
$ref: "#/components/schemas/DetailedUser"
FriendRequest:
type: object
properties:
created_at:
type: string
description: Timestamp at which the friend request was created
source_username:
type: string
description: The username of the requesting user
source_uuid:
type: string
description: The UUID of the requesting user
target_uuid:
description: The UUID of the receiving user
FriendAddRequest:
type: object
properties:
username:
type: string
description: The username of the target user
FriendAcceptRequest:
type: object
properties:
uuid:
type: string
description: The UUID of the user from which you want to accept a friend request
FriendGetRequestsResponse:
type: object
properties:
amount:
type: integer
description: The amount of incoming friend requests
requests:
type: array
items:
$ref: "#/components/schemas/FriendRequest"

View file

@ -137,7 +137,7 @@ paths:
application/json:
schema:
$ref: "#/components/schemas/GetAllUsersResponse"
/users/{userId}:
/users/id/{userId}:
get:
tags:
- users

View file

@ -1,12 +0,0 @@
on: [push]
jobs:
build:
runs-on: docker
steps:
- run: go build -x -v -o=stbackend -buildvcs=true ./cmd/stbackend/main.
- uses: actions/upload-artifact@v3
with:
name: build-artifact
path: ./stbackend

1
build/ci/build.yml Symbolic link
View file

@ -0,0 +1 @@
../../.forgejo/workflows/build.yml

View file

@ -36,7 +36,7 @@ import (
func UsersHandler_RegisterRoutes(party iris.Party) {
party.Use(middlewares.Authenticate()) // only allow authenticated users for following endpoints
party.Get("/", middlewares.Authorize(perms.GetAllUsers), UsersGet_Handler)
party.Get("/:id", middlewares.Authorize(perms.GetUserById), UsersGetById_Handler)
party.Get("/id/:id", middlewares.Authorize(perms.GetUserById), UsersGetById_Handler)
party.Get("/uuid/:uuid", middlewares.Authorize(perms.GetUserByUuid), UsersGetByUuid_Handler)
party.Get("/self", middlewares.Authorize(perms.GetOwnUser), UsersGetSelf_Handler)
}