Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Documentación y Revisión Final #257

Merged
merged 9 commits into from
Nov 17, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
38 changes: 11 additions & 27 deletions backend/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,7 @@ Empresa
}
}
```
-----------------
### [POST] api/users/details
Obtener los detalles públicos de un usuario, dado su correo
> **Note**
Expand Down Expand Up @@ -121,7 +122,8 @@ Obtener los detalles públicos de un usuario, dado su correo
}
}
```
---

-----------------
## Estudiante
### [POST] api/students
Crea un estudiante
Expand Down Expand Up @@ -184,7 +186,8 @@ Actualiza un estudiante
"data": null
}
```
---
-----------------

## Mensajes
### [POST] api/messages/send
Crea un mensaje
Expand Down Expand Up @@ -301,7 +304,8 @@ Devuelve los mensajes de un chat dado el emisor y el receptor
}
}
```
---
-----------------

## Empresas
### [POST] api/companies
Crea una compañia
Expand Down Expand Up @@ -642,7 +646,8 @@ Retorna los estudiantes que se han postulado a una oferta
}
```

---
-----------------

## Carreras
### [GET] api/careers
Devuelve todas las carreras
Expand Down Expand Up @@ -678,27 +683,7 @@ Devuelve todas las carreras
}
}
```

### [POST] api/careers
Crea una carrera

## Params
``` json
{
"nombre" : string
"descripcion" : string
}
```

#### Response
``` json
{
"status": 200,
"message": "Career created successfully",
"data": nil
}
```
---
-----
## Postulaciones
### [POST] api/postulation
Crea una postulacíón de trabajo, cuando un estudiante se postula a una oferta
Expand Down Expand Up @@ -749,7 +734,6 @@ Devuelve las postulaciones de un Estudiante.
]
}
}

```

### [DELETE] api/postulations/?id_postulacion=1
Expand All @@ -766,7 +750,7 @@ Elimina una postulación. El usuario se obtiene del token. Se pasa el id de la p
}
```

---
-----------------
## Administradores
### [GET] api/admins/students
Retorna información de estudiantes para el panel de administradores
Expand Down
56 changes: 33 additions & 23 deletions backend/controllers/files.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,12 +15,13 @@ import (
"strings"
)

// Updates the profile picture of the user
func UpdateProfilePicture() gin.HandlerFunc {
return func(c *gin.Context) {
user, err := utils.TokenExtractUsername(c)
user, err := utils.TokenExtractUsername(c) // get the username from the token
acceptedFileTypes := []string{"png", "jpg", "jpeg"}

if err != nil {
if err != nil { // if the token is invalid
c.JSON(http.StatusUnauthorized, responses.StandardResponse{
Status: http.StatusUnauthorized,
Message: "Unauthorized. Cannot get information from token. " + err.Error(),
Expand All @@ -34,12 +35,12 @@ func UpdateProfilePicture() gin.HandlerFunc {
fmt.Println("Username upload: " + user_stripped)

// single file
fileHeader, _ := c.FormFile("file")
fileHeader, _ := c.FormFile("file") // get the file from the request

// get the file type from filename
fileType := fileHeader.Filename[strings.LastIndex(fileHeader.Filename, ".")+1:]

if !utils.Contains(acceptedFileTypes, fileType) {
if !utils.Contains(acceptedFileTypes, fileType) { // if the file type is not accepted
c.JSON(http.StatusBadRequest, responses.StandardResponse{
Status: http.StatusBadRequest,
Message: "Invalid file type. Accepted file types are " + strings.Join(acceptedFileTypes, ", "),
Expand All @@ -48,12 +49,12 @@ func UpdateProfilePicture() gin.HandlerFunc {
return
}

// generate a random image.
randomNumber := rand.Intn(9999999999-1111111111) + 1111111111
newFileName := user_stripped + "_" + fmt.Sprint(randomNumber) + "." + fileType

fileHeader.Filename = newFileName

dst := "./uploads/" + newFileName
dst := "./uploads/" + newFileName // destination

// Eliminar archivos antiguos con el mismo prefijo de usuario
if err := deleteFilesWithPrefix("./uploads/", user_stripped); err != nil {
Expand All @@ -77,6 +78,7 @@ func UpdateProfilePicture() gin.HandlerFunc {
return
}

// Update the profile picture in the database
if userType == "student" {
err = configs.DB.Model(&models.Estudiante{}).Where("correo = ?", user).Updates(models.Estudiante{Foto: newFileName}).Error
} else if userType == "enterprise" {
Expand Down Expand Up @@ -118,6 +120,7 @@ func UpdateProfilePicture() gin.HandlerFunc {
return
}

// return the filename to the client
c.JSON(http.StatusOK, responses.StandardResponse{
Status: http.StatusOK,
Message: "File uploaded successfully",
Expand All @@ -128,12 +131,13 @@ func UpdateProfilePicture() gin.HandlerFunc {
}
}

// Updates the CV of the user
func UpdateCV() gin.HandlerFunc {
return func(c *gin.Context) {
user, err := utils.TokenExtractUsername(c)
acceptedFileTypes := []string{"pdf"}

if err != nil {
if err != nil { // if the token is invalid
c.JSON(http.StatusUnauthorized, responses.StandardResponse{
Status: http.StatusUnauthorized,
Message: "Unauthorized. Cannot get information from token. " + err.Error(),
Expand All @@ -144,7 +148,7 @@ func UpdateCV() gin.HandlerFunc {

// strip username from email. ignoring everything after @
user_stripped := user[:strings.Index(user, "@")]
fmt.Println("Username upload: " + user_stripped)
fmt.Println("Username upload: " + user_stripped) // single file (print-debbuging)

// single file
file, _ := c.FormFile("file")
Expand All @@ -161,6 +165,7 @@ func UpdateCV() gin.HandlerFunc {
return
}

// generate a random image.
randomNumber := rand.Intn(9999999999-1111111111) + 1111111111
newFileName := user_stripped + "_" + fmt.Sprint(randomNumber) + "." + fileType

Expand Down Expand Up @@ -191,6 +196,7 @@ func UpdateCV() gin.HandlerFunc {
return
}

// Update the profile picture in the database
if userType != "student" {
c.JSON(http.StatusUnauthorized, responses.StandardResponse{
Status: http.StatusUnauthorized,
Expand All @@ -200,6 +206,7 @@ func UpdateCV() gin.HandlerFunc {
return
}

// Update the profile picture in the database
err = configs.DB.Model(&models.Estudiante{}).Where("correo = ?", user).Updates(models.Estudiante{CV: newFileName}).Error

// Save locally
Expand Down Expand Up @@ -236,6 +243,7 @@ func UpdateCV() gin.HandlerFunc {
return
}

// return the filename to the client
c.JSON(http.StatusOK, responses.StandardResponse{
Status: http.StatusOK,
Message: "File uploaded successfully",
Expand All @@ -246,26 +254,26 @@ func UpdateCV() gin.HandlerFunc {
}
}

// Deletes the profile picture of the user
func deleteFilesWithPrefix(directory, prefix string) error {
files, err := os.ReadDir(directory)
files, err := os.ReadDir(directory) // read the directory
if err != nil {
return err
}
} // iterate over the files

for _, file := range files {
//fmt.Println(file.Name())
if strings.HasPrefix(file.Name(), prefix) {
if strings.HasPrefix(file.Name(), prefix) { // if the file starts with the prefix
filePath := filepath.Join(directory, file.Name())
fmt.Println("Deleting file: " + filePath)
fmt.Println("Deleting file: " + filePath) // delete the file
if err := os.Remove(filePath); err != nil {
return err
}
}
}

return nil
}

// Returns the profile picture of the user
func GetProfilePicture() gin.HandlerFunc {
return func(c *gin.Context) {
filename := c.Param("filename")
Expand All @@ -282,9 +290,9 @@ func GetProfilePicture() gin.HandlerFunc {
return
}

defer func(Body io.ReadCloser) {
defer func(Body io.ReadCloser) { // Cerrar el cuerpo de la respuesta del servidor de archivos externo
err := Body.Close()
if err != nil {
if err != nil { // Si hay un error al cerrar el cuerpo de la respuesta del servidor de archivos externo
c.JSON(http.StatusInternalServerError, responses.StandardResponse{
Status: http.StatusInternalServerError,
Message: "Error al cerrar el cuerpo de la respuesta del servidor de archivos externo: " + err.Error(),
Expand All @@ -294,7 +302,7 @@ func GetProfilePicture() gin.HandlerFunc {
}
}(resp.Body)

if resp.StatusCode != http.StatusOK {
if resp.StatusCode != http.StatusOK { // Si el código de estado de la respuesta del servidor de archivos externo no es 200
c.JSON(http.StatusNotFound, responses.StandardResponse{
Status: http.StatusNotFound,
Message: "Archivo no encontrado en el servidor de archivos externo",
Expand All @@ -321,14 +329,15 @@ func GetProfilePicture() gin.HandlerFunc {
}
}

// Returns the CV of the user
func GetCV() gin.HandlerFunc {
return func(c *gin.Context) {
filename := c.Param("filename")
fileURL := configs.FileServer + "pdf/" + filename
filename := c.Param("filename") // Obtener el nombre del archivo de la URL
fileURL := configs.FileServer + "pdf/" + filename // Construir la URL del servidor de archivos externo

// Realizar una solicitud GET al servidor de archivos externo
resp, err := http.Get(fileURL)
if err != nil {
if err != nil { // Si hay un error al realizar la solicitud GET, devolver un error al cliente
c.JSON(http.StatusNotFound, responses.StandardResponse{
Status: http.StatusNotFound,
Message: "Error al obtener el archivo: " + err.Error(),
Expand All @@ -337,19 +346,20 @@ func GetCV() gin.HandlerFunc {
return
}

// Cerrar el cuerpo de la respuesta del servidor de archivos externo
defer func(Body io.ReadCloser) {
err := Body.Close()
if err != nil {
if err != nil { // Si hay un error al cerrar el cuerpo de la respuesta del servidor de archivos externo
c.JSON(http.StatusInternalServerError, responses.StandardResponse{
Status: http.StatusInternalServerError,
Message: "Error al cerrar el cuerpo de la respuesta del servidor de archivos externo: " + err.Error(),
Data: nil,
})
return
}
}(resp.Body)
}(resp.Body) // Cerrar el cuerpo de la respuesta del servidor de archivos externo

if resp.StatusCode != http.StatusOK {
if resp.StatusCode != http.StatusOK { // Si el código de estado de la respuesta del servidor de archivos externo no es 200
c.JSON(http.StatusNotFound, responses.StandardResponse{
Status: http.StatusNotFound,
Message: "Archivo no encontrado en el servidor de archivos externo",
Expand Down
Loading
Loading