diff --git a/controller/authorizationUsersController.go b/controller/authorizationUsersController.go
new file mode 100644
index 0000000..120373d
--- /dev/null
+++ b/controller/authorizationUsersController.go
@@ -0,0 +1,260 @@
+package controller
+
+import (
+ "fmt"
+ "httpTable/model"
+ "httpTable/user_session"
+ "net/http"
+)
+
+// AuthorizationUsersController cтруктура используется для конструктора контроллер
+type AuthorizationUsersController struct {
+ modelUser *model.AuthorizationUsersModel
+ modelTable *model.TableModel
+}
+
+// NewAuthorizationUsersController конструктор контроллера, возращающий экземпляр структуры AuthorizationUsersController
+// со свойствами modelTable и modelUser контроллера модели
+func NewAuthorizationUsersController() *AuthorizationUsersController {
+ return &AuthorizationUsersController{
+ modelUser: model.NewAuthorizationUsersModel(),
+ modelTable: model.NewTableModel(),
+ }
+}
+
+//readURL приватная функция считывающая имя и пароль пользователя
+func readURL(res http.ResponseWriter, req *http.Request) (string, string) {
+ req.ParseForm()
+ name := req.FormValue("username")
+ password := req.FormValue("password")
+ return name, password
+}
+
+// GetAuthorizationUsers метод контроллера при авторизации
+func (aut *AuthorizationUsersController) GetAuthorizationUsers(res http.ResponseWriter, req *http.Request) int {
+ //получение имени и пароля пользователя из URL строки
+ name, password := readURL(res, req)
+ //если пароль и пользователь пустой выводит сообщение
+ if name == `` && password == `` {
+
+ messageUser := `
+
+
+ Введите свои данные
+
+
+ Введите свои данные
+
+
+ `
+ html := []byte(messageUser)
+ res.Write(html)
+ return 0
+ }
+ name, err := aut.modelUser.GetAuthorizationUsers(name, password)
+ //если пароль и имя пользователя не совпадает выводит сообщение
+ if err != nil {
+ messageUserError :=
+ `
+
+
+ Извините, пароль или имя с ошибкой, введите еще раз или пройдите РЕГИСТРАЦИЮ
+
+
+ Извините, пароль или имя с ошибкой, введите еще раз или пройдите РЕГИСТРАЦИЮ
+
+
+ `
+
+ Errhtml := []byte(messageUserError)
+ res.Write(Errhtml)
+ return 0
+ }
+ token, err := TokenGet(res, req)
+ if err != nil {
+ fmt.Printf("Ошибка в полученном токене", err)
+ }
+ user_session.SetFirstNameToken(name, token)
+ user_session.Set(token, 0, 0)
+ return 1
+
+}
+
+// AddNewUser метод контроллера по добавлению новых пользователей
+func (aut *AuthorizationUsersController) AddNewUser(res http.ResponseWriter, req *http.Request) int {
+ //получение имени и пароля пользователя из URL строки
+ name, password := readURL(res, req)
+ //если пароль и имя не заданы выводит сообщение
+ if name == `` && password == `` {
+ messageUser :=
+ `
+
+
+ Для регистрации,введите свои данные
+
+
+ Для регистрации,введите свои данные
+
+
+ `
+
+ html := []byte(messageUser)
+ res.Write(html)
+
+ return 0
+ }
+ req.ParseForm()
+ repeatPassword := req.FormValue("repeatpassword")
+ if repeatPassword != password {
+ messageUser :=
+ `
+
+
+ Пароль, не совпадает с паролем подтверждения введите свои данные повторно
+
+
+ Пароль, не совпадает с паролем подтверждения введите свои данные повторно
+
+
+ `
+
+ html := []byte(messageUser)
+ res.Write(html)
+ return 0
+ }
+ //проверка имени на отсутсвие повторений
+ name, err := aut.modelUser.AddNewUser(name, password, ``)
+ if err != nil {
+ messageUserError := `
+
+
+ Извините такой пользователь уже существует, введите свои данные снова
+
+
+ Извините такой пользователь уже существует, введите свои данные снова
+
+
+ `
+
+ Errhtml := []byte(messageUserError)
+ res.Write(Errhtml)
+ return 0
+ }
+ //создание и отправка cookie файлов
+ token, err := TokenGet(res, req)
+ if err != nil {
+ fmt.Printf("Ошибка в полученном токене", err)
+ }
+ _, err = aut.modelUser.AddNewUser(name, password, token)
+ return 1
+}
+
+// DeleteUser удаляет пользователя из БД при вводе правильных: пароля и имени
+func (aut *AuthorizationUsersController) DeleteUser(res http.ResponseWriter, req *http.Request) {
+ //получение имени и пароля пользователя из URL строки
+ name, password := readURL(res, req)
+ //если пароль и имя пользователя пустые выводит сообщение
+ if name == `` && password == `` {
+ messageUser := `
+
+
+ Если Вы, хотите удалить пользователя, введите свои данные
+
+
+ Если Вы, хотите удалить пользователя, введите свои данные
+
+
+ `
+ html := []byte(messageUser)
+ res.Write(html)
+ return
+ }
+ //проверка имени и пароля, в случае ошибки, вывод сообщения
+ name, err := aut.modelUser.DeleteUser(name, password)
+ if err != nil {
+ messageUserError :=
+ `
+
+
+ Извините, пароль или имя с ошибкой, введите свои данные снова
+
+
+ Извините, пароль или имя с ошибкой, введите свои данные снова
+
+
+ `
+ Errhtml := []byte(messageUserError)
+ res.Write(Errhtml)
+ return
+ }
+ messageUserError := `
+
+ Ваш пользователь удален с сайта САЙТ`
+ Errhtml := []byte(messageUserError)
+ res.Write(Errhtml)
+}
+
+// LogOutUser метод контроллера по сбросу куки файлов и выходу из текущей сессии
+func (aut *AuthorizationUsersController) LogOutUser(res http.ResponseWriter, req *http.Request) {
+ token, err := TokenVerification(res, req)
+ fmt.Printf("Токен из GetAuthorizationUsers контроллера", token)
+ if err != nil {
+ fmt.Printf("Ошибка такого токена нет в БД")
+ }
+ aut.modelUser.LogOutUser(token)
+ messageUserError := `
+
+ Вы успешно вышли из текущей сессии, для продолжения работы прошу авторизоваться АВТОРИЗАЦИЯ`
+ Errhtml := []byte(messageUserError)
+ res.Write(Errhtml)
+}
diff --git a/controller/tableController.go b/controller/tableController.go
index e61c7fa..1c698a9 100644
--- a/controller/tableController.go
+++ b/controller/tableController.go
@@ -1,11 +1,15 @@
package controller
import (
+ "fmt"
+ "httpTable/cookies"
"httpTable/model"
"net/http"
"strconv"
)
+const nameCookie = "html-table_coookie"
+
// TableController cтруктура используется для конструктора контроллер
type TableController struct {
model *model.TableModel
@@ -18,6 +22,8 @@ func NewTableController() *TableController {
model: model.NewTableModel(),
}
}
+
+//приватный метод для вывода повторяющихся частей таблицы на печать
func (t *TableController) tableMiddle(row int, column int) string {
var numberRow int
var tableMain string
@@ -39,75 +45,149 @@ func (t *TableController) tableMiddle(row int, column int) string {
}
// ResertTable метод сброса таблицы до состояния 2х2
-func (t *TableController) ResetTable(res http.ResponseWriter, req *http.Request) {
- t.model.ResetTable()
- row, column := t.model.GetCurrentTable()
+func (t *TableController) ResetTable(res http.ResponseWriter, req *http.Request) error {
+ value, err := TokenVerification(res, req)
+ if err != nil {
+ fmt.Sprintf("Проблема с токеном в контроллера в методе ResetTable", err)
+ return err
+ }
+ t.model.ResetTable(value)
+ row, column, name := t.model.GetCurrentTable(value)
//заголовок таблицы
tableHTML := `
- СБРОС ТАБЛИЦЫ
+ СБРОС ТАБЛИЦЫ ` + name + `
`
tableMidle := t.tableMiddle(row, column)
- tableHTML = tableHTML + tableMidle
+ tableFinish :=
+ ` ДОБАВЛЕНИЕ СТРОК
+ ДОБАВЛЕНИЕ КОЛОНОК
+ ТЕКУЩЕЕ СОСТОЯНИЕ ТАБЛИЦЫ
+ СБРОС ТАБЛИЦЫ `
+ tableHTML = tableHTML + tableMidle + tableFinish
//отправка таблицы в браузер
res.Header().Set("Content-Type", "text/html")
html := []byte(tableHTML)
res.Write(html)
+ return err
}
// AddRow метод контроллера по выводу таблицы с добавлением при каждом клике дополнительной строки
-func (t *TableController) AddRow(res http.ResponseWriter, req *http.Request) {
- t.model.AddRow()
- row, column := t.model.GetCurrentTable()
+func (t *TableController) AddRow(res http.ResponseWriter, req *http.Request) error {
+ value, err := TokenVerification(res, req)
+ if err != nil {
+ fmt.Sprintf("Проблема с токеном в контроллере в методе AddRow", err)
+ return err
+ }
+ t.model.AddRow(value)
+ row, column, name := t.model.GetCurrentTable(value)
//заголовок таблицы
tableHTML := `
- ТАБЛИЦА КОГДА ПРИБАВЛЯЕТСЯ СТРОКА
+ ДОБАВЛЕНИЕ СТРОК ` + name + `
- `
+
`
//цикл по конкотинации таблицы в зависимости от количества строк и столбцов
tableMain := t.tableMiddle(row, column)
- table := tableHTML + tableMain
+ tableFinish :=
+ ` ДОБАВЛЕНИЕ СТРОК
+ ДОБАВЛЕНИЕ КОЛОНОК
+ ТЕКУЩЕЕ СОСТОЯНИЕ ТАБЛИЦЫ
+ СБРОС ТАБЛИЦЫ `
+
+ table := tableHTML + tableMain + tableFinish
//отправка таблицы в браузер
res.Header().Set("Content-Type", "text/html")
html := []byte(table)
res.Write(html)
+ return nil
}
//AddColoms метод контроллера по выводу таблицы с добавлением при каждом клике дополнительной строки
-func (t *TableController) AddColumn(res http.ResponseWriter, req *http.Request) {
- t.model.AddColumns()
- row, column := t.model.GetCurrentTable()
+func (t *TableController) AddColumn(res http.ResponseWriter, req *http.Request) error {
+ value, err := TokenVerification(res, req)
+ if err != nil {
+ fmt.Sprintf("Проблема с токеном в контроллера в методе AddColumn", err)
+ return err
+ }
+ t.model.AddColumns(value)
+ row, column, name := t.model.GetCurrentTable(value)
//начало таблицы
tableHTML := `
- ТАБЛИЦА КОГДА ПРИБАВЛЯЕТСЯ КОЛОНКА
+ ДОБАВЛЕНИЕ СТОЛБЦОВ ` + name + `
- `
+
`
tableMain := t.tableMiddle(row, column)
- table := tableHTML + tableMain
+ tableFinish :=
+ `ДОБАВЛЕНИЕ СТРОК
+ ДОБАВЛЕНИЕ КОЛОНОК
+ ТЕКУЩЕЕ СОСТОЯНИЕ ТАБЛИЦЫ
+ СБРОС ТАБЛИЦЫ `
+
+ table := tableHTML + tableMain + tableFinish
//отправка таблицы в браузер
res.Header().Set("Content-Type", "text/html")
html := []byte(table)
res.Write(html)
+ return nil
}
// GetCurrentTable метод контроллера по выводу таблицы в текущем состоянии
-func (t *TableController) GetCurrentTable(res http.ResponseWriter, req *http.Request) {
- row, column := t.model.GetCurrentTable()
+func (t *TableController) GetCurrentTable(res http.ResponseWriter, req *http.Request) error {
+ value, err := TokenVerification(res, req)
+ if err != nil {
+ fmt.Sprintf("Проблема с токеном в контроллере в методе GetCurrentTable", err)
+ return err
+ }
+ row, column, name := t.model.GetCurrentTable(value)
tableHTML := `
- ТЕКУЩАЯ ТАБЛИЦА
+ ТЕКУЩАЯ ТАБЛИЦА ` + name + `
- `
+
`
tableMain := t.tableMiddle(row, column)
- table := tableHTML + tableMain
+ tableFinish :=
+ `ДОБАВЛЕНИЕ СТРОК
+ ДОБАВЛЕНИЕ КОЛОНОК
+ ТЕКУЩЕЕ СОСТОЯНИЕ ТАБЛИЦЫ
+ СБРОС ТАБЛИЦЫ `
+
+ table := tableHTML + tableMain + tableFinish
+
+ if value == "" {
+ table = ""
+ }
//отправка таблицы в браузер
res.Header().Set("Content-Type", "text/html")
html := []byte(table)
res.Write(html)
+ return nil
+}
+
+// TokenVerification функция для проверки соответсвия куки файлам- файлам пользователя
+func TokenVerification(res http.ResponseWriter, req *http.Request) (string, error) {
+ token, err := cookies.GetCookie(req, nameCookie)
+ if err != nil {
+ fmt.Printf("Нет cookies файлов или неправильный токен метод tokenVerification")
+ return "", err
+ }
+ return token, err
+}
+
+// TokenGet метод для полученияТокенов и имен файлов- cookie
+func TokenGet(res http.ResponseWriter, req *http.Request) (string, error) {
+ cookie := &http.Cookie{Name: nameCookie}
+ value, err := cookies.SetCookie(res, *cookie)
+ if err != nil {
+ fmt.Printf("Проблема с токеном в контроллере в методе tokenVerification%v\n\t", err)
+ return value, err
+ } else {
+ fmt.Printf("ВСЕ ХОРОШО")
+ }
+ return value, err
}
diff --git a/cookies/cookiesMethods.go b/cookies/cookiesMethods.go
new file mode 100644
index 0000000..868303e
--- /dev/null
+++ b/cookies/cookiesMethods.go
@@ -0,0 +1,39 @@
+package cookies
+
+import (
+ "fmt"
+ "httpTable/user_session"
+ "net/http"
+)
+
+// Cookie структура cookie-файлов
+type Cookie struct {
+ Name string
+ Value string
+}
+
+//переменная доступа с структуре Cookie
+var cookies *Cookie
+
+// SetCookie функция установка cookie файлов для нового пользователя
+func SetCookie(res http.ResponseWriter, cookie http.Cookie) (string, error) {
+ cookie.Value = user_session.SetCookie()
+ http.SetCookie(res, &cookie)
+ return cookie.Value, nil
+}
+
+// GetCookie функция по получению значения имени и значения Токена с браузера
+func GetCookie(res *http.Request, name string) (string, error) {
+ cookie, err := res.Cookie(name)
+ if err != nil {
+ fmt.Printf("Ошибка в имени cookie-файла в контроллере функции Get ", err)
+ return ``, err
+ }
+ _, _, _, err = user_session.Get(cookie.Value)
+ if err != nil {
+ fmt.Printf("Ошибка в имени cookie-файла в контроллере функции Get", err)
+
+ return ``, err
+ }
+ return cookie.Value, nil
+}
diff --git a/go.mod b/go.mod
index aaf703b..c728062 100644
--- a/go.mod
+++ b/go.mod
@@ -2,4 +2,8 @@ module httpTable
go 1.18
-require github.com/gorilla/mux v1.8.0 // indirect
+require (
+ github.com/dgrijalva/jwt-go v3.2.0+incompatible // indirect
+ github.com/golang-jwt/jwt/v4 v4.4.3 // indirect
+ github.com/gorilla/mux v1.8.0 // indirect
+)
diff --git a/go.sum b/go.sum
index 5350288..0f568e9 100644
--- a/go.sum
+++ b/go.sum
@@ -1,2 +1,6 @@
+github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM=
+github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
+github.com/golang-jwt/jwt/v4 v4.4.3 h1:Hxl6lhQFj4AnOX6MLrsCb/+7tCj7DxP7VA+2rDIq5AU=
+github.com/golang-jwt/jwt/v4 v4.4.3/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0=
github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI=
github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So=
diff --git a/main.go b/main.go
index d7a4e01..4ffab39 100644
--- a/main.go
+++ b/main.go
@@ -5,11 +5,17 @@ import (
"fmt"
"github.com/gorilla/mux"
"httpTable/controller"
+ "httpTable/userData"
+ "httpTable/user_session"
"log"
"net/http"
)
func main() {
+ //инициализация map-пользователей при запуске приложения
+ userData.UsersInitializationData()
+ //инициация map-cookies при начале работы приложения
+ user_session.InitializationSession()
router := mux.NewRouter()
fmt.Println("Сервер запустился")
//router.HandleFunc регистрация первого маршрута, с URL оканчивающимся на "/reset" и методом GET, создает новый экземпляр конструктора
@@ -17,9 +23,12 @@ func main() {
router.HandleFunc(
"/reset",
func(res http.ResponseWriter, req *http.Request) {
- //userCtrl := controller.NewUserCtrl()
table := controller.NewTableController()
- table.ResetTable(res, req)
+ err := table.ResetTable(res, req)
+ if err != nil {
+ http.Redirect(res, req, "/auth", http.StatusSeeOther)
+ return
+ }
},
).Methods("GET")
//router.HandleFunc регистрация первого маршрута, с URL оканчивающимся на "/add_row" и методом GET, создает новый экземпляр конструктора
@@ -27,9 +36,12 @@ func main() {
router.HandleFunc(
"/add_row",
func(res http.ResponseWriter, req *http.Request) {
- //userCtrl := controller.NewUserCtrl()
table := controller.NewTableController()
- table.AddRow(res, req)
+ err := table.AddRow(res, req)
+ if err != nil {
+ http.Redirect(res, req, "/auth", http.StatusSeeOther)
+ return
+ }
},
).Methods("GET")
//router.HandleFunc регистрация первого маршрута, с URL оканчивающимся на "/add_col" и методом GET, создает новый экземпляр конструктора
@@ -37,9 +49,12 @@ func main() {
router.HandleFunc(
"/add_col",
func(res http.ResponseWriter, req *http.Request) {
- //userCtrl := controller.NewUserCtrl()
table := controller.NewTableController()
- table.AddColumn(res, req)
+ err := table.AddColumn(res, req)
+ if err != nil {
+ http.Redirect(res, req, "/auth", http.StatusSeeOther)
+ return
+ }
},
).Methods("GET")
//router.HandleFunc регистрация первого маршрута, с URL оканчивающимся на "/" и методом GET, создает новый экземпляр конструктора
@@ -47,11 +62,61 @@ func main() {
router.HandleFunc(
"/",
func(res http.ResponseWriter, req *http.Request) {
- //userCtrl := controller.NewUserCtrl()
table := controller.NewTableController()
- table.GetCurrentTable(res, req)
+ err := table.GetCurrentTable(res, req)
+ if err != nil {
+ http.Redirect(res, req, "/auth", http.StatusSeeOther)
+ return
+ }
},
).Methods("GET")
+ //router.HandleFunc регистрация первого маршрута, с URL оканчивающимся на "/auth" и методом GET, создает новый экземпляр конструктора
+ //контроллера, прием-передача параметров функции контроллера GetAuthorizationUsers
+ router.HandleFunc(
+ "/auth",
+ func(res http.ResponseWriter, req *http.Request) {
+ table := controller.NewAuthorizationUsersController()
+ num := table.GetAuthorizationUsers(res, req)
+ //перенаправление на другой роут в случае если пользовать зарегистрировался
+ if num == 1 {
+ http.Redirect(res, req, "/", http.StatusSeeOther)
+ return
+ }
+ },
+ ).Methods("GET")
+ //router.HandleFunc регистрация первого маршрута, с URL оканчивающимся на "/register" и методом GET, создает новый экземпляр конструктора
+ //контроллера, прием-передача параметров функции контроллера AddNewUser
+ router.HandleFunc(
+ "/register",
+ func(res http.ResponseWriter, req *http.Request) {
+ table := controller.NewAuthorizationUsersController()
+ num := table.AddNewUser(res, req)
+ //перенаправление на другой роут в случае если пользовать зарегистрировался
+ if num == 1 {
+ http.Redirect(res, req, "/", http.StatusSeeOther)
+ return
+ }
+ },
+ ).Methods("GET")
+ //router.HandleFunc регистрация первого маршрута, с URL оканчивающимся на "/delete" и методом GET, создает новый экземпляр конструктора
+ //контроллера, прием-передача параметров функции контроллера DeleteUser
+ router.HandleFunc(
+ "/delete",
+ func(res http.ResponseWriter, req *http.Request) {
+ table := controller.NewAuthorizationUsersController()
+ table.DeleteUser(res, req)
+ },
+ ).Methods("GET")
+ //router.HandleFunc регистрация первого маршрута, с URL оканчивающимся на "/logout" и методом GET, создает новый экземпляр конструктора
+ //контроллера, прием-передача параметров функции контроллера LogOutUser
+ router.HandleFunc(
+ "/logout",
+ func(res http.ResponseWriter, req *http.Request) {
+ table := controller.NewAuthorizationUsersController()
+ table.LogOutUser(res, req)
+ },
+ ).Methods("GET")
+
log.Println("Starting HTTP server on :4000")
log.Fatal(http.ListenAndServe(":4000", router))
}
diff --git a/model/authorizationUsersModel.go b/model/authorizationUsersModel.go
new file mode 100644
index 0000000..ab0e705
--- /dev/null
+++ b/model/authorizationUsersModel.go
@@ -0,0 +1,60 @@
+package model
+
+import (
+ "fmt"
+ "httpTable/userData"
+ "httpTable/user_session"
+)
+
+// TableModel труктура используется для конструктора контроллер
+type AuthorizationUsersModel struct {
+ module *TableModel
+}
+
+// NewTableModel конструктор контроллера, возращающий экземпляр структуры TableModel
+// со свойством model контроллера модели
+func NewAuthorizationUsersModel() *AuthorizationUsersModel {
+ return &AuthorizationUsersModel{
+ NewTableModel(),
+ }
+}
+
+// GetAuthorizationUsers метод модели по входу на сайт
+func (aut *AuthorizationUsersModel) GetAuthorizationUsers(name string, password string) (string, error) {
+ name, err := userData.Get(name, password)
+ if err != nil {
+ fmt.Println("Ошибка в имени или пароле пользователя метода GetAuthorizationUsers модели", err)
+ }
+ return name, err
+}
+
+// AddNewUser метод модели по добавлению нового пользователя
+func (aut *AuthorizationUsersModel) AddNewUser(name string, password string, token string) (string, error) {
+ var err error
+ if token == `` {
+ name, err := userData.Add(name, password)
+ if err != nil {
+ fmt.Println("Ошибка в имени или пароле пользователя метода AddNewUser модели", err)
+ }
+ return name, err
+ } else {
+ user_session.SetFirstNameToken(name, token)
+ user_session.Set(token, 0, 0)
+ }
+ return name, err
+}
+
+// DeleteUser метод модели по удалению пользователя, после ввода пароля и имени пользователя
+func (aut *AuthorizationUsersModel) DeleteUser(name string, password string) (string, error) {
+ name, err := userData.Delete(name, password)
+ if err != nil {
+ fmt.Println("Ошибка в имени или пароле пользователя метода AddNewUser модели", err)
+ }
+ return name, err
+}
+
+// LogOutUser метод модели по удалению текущей сессии пользователя
+func (aut *AuthorizationUsersModel) LogOutUser(token string) {
+ user_session.LogOutToken(token)
+
+}
diff --git a/model/tableModel.go b/model/tableModel.go
index a18deac..3c3b5b1 100644
--- a/model/tableModel.go
+++ b/model/tableModel.go
@@ -1,7 +1,7 @@
package model
import (
- "httpTable/table_metadata"
+ "httpTable/user_session"
)
// TableModel труктура используется для конструктора контроллер
@@ -15,22 +15,32 @@ func NewTableModel() *TableModel {
}
// ResetTable метод модели возвращающие параметры таблицы 2х2
-func (t *TableModel) ResetTable() {
- table_metadata.TableInf.Row = 2
- table_metadata.TableInf.Column = 2
+func (t *TableModel) ResetTable(value string) {
+ user_session.Set(value, user_session.Row, user_session.Column)
}
// AddRow метод модели добавляющий 1 строку после каждого обновления URL
-func (t *TableModel) AddRow() {
- table_metadata.TableInf.Row++
+func (t *TableModel) AddRow(value string) {
+ row, column, value, _ := user_session.Get(value)
+ row++
+ user_session.Set(value, row, column)
}
// AddColumns AddRow метод модели добавляющий 1 колонку после каждого обновления URL
-func (t *TableModel) AddColumns() {
- table_metadata.TableInf.Column++
+func (t *TableModel) AddColumns(value string) {
+ row, column, value, _ := user_session.Get(value)
+ column++
+ user_session.Set(value, row, column)
}
// GetCurrentTable метод возвращающий текущие параметры таблицы без изменения
-func (t *TableModel) GetCurrentTable() (row int, colum int) {
- return table_metadata.TableInf.Row, table_metadata.TableInf.Column
+func (t *TableModel) GetCurrentTable(value string) (int, int, string) {
+ row, column, valueNon, _ := user_session.Get(value)
+ if valueNon == `` {
+ row = user_session.Row
+ column = user_session.Column
+ }
+ nameUser, _ := user_session.GetName(value)
+ user_session.Set(value, row, column)
+ return row, column, nameUser
}
diff --git a/table_metadata/tableMetaData.go b/table_metadata/tableMetaData.go
index e8bdb4f..7c4fd05 100644
--- a/table_metadata/tableMetaData.go
+++ b/table_metadata/tableMetaData.go
@@ -1,8 +1,7 @@
package table_metadata
+// TableMetaData структура таблицы
type TableMetaData struct {
Row int
Column int
}
-
-var TableInf = TableMetaData{Row: 2, Column: 2}
diff --git a/userData/userSession.go b/userData/userSession.go
new file mode 100644
index 0000000..8bd2232
--- /dev/null
+++ b/userData/userSession.go
@@ -0,0 +1,15 @@
+package userData
+
+import (
+ "httpTable/user_data"
+ "sync"
+)
+
+// UserVerification структура хранения Имени пользователя-пароля
+type UserVerification struct {
+ userVerif map[string]user_data.UserDataVerification
+ lock sync.RWMutex
+}
+
+//переменная доступа к структуре UserVerification
+var user UserVerification
diff --git "a/userData/\321\201onfigUser.go" "b/userData/\321\201onfigUser.go"
new file mode 100644
index 0000000..48b2bec
--- /dev/null
+++ "b/userData/\321\201onfigUser.go"
@@ -0,0 +1,74 @@
+package userData
+
+import (
+ "errors"
+ "fmt"
+ "httpTable/user_data"
+ "httpTable/user_session"
+)
+
+// UsersInitializationData запускается при запуске приложения создает map Имя пользователя-пароль
+func UsersInitializationData() {
+ user.userVerif = make(map[string]user_data.UserDataVerification)
+}
+
+// Get функция проверяет соответсвие Имени-пользователя -пароля
+func Get(name string, password string) (string, error) {
+ var err error
+ user.lock.Lock()
+ defer user.lock.Unlock()
+ if valueMap, ok := user.userVerif[name]; ok {
+ if password == valueMap.Password {
+ return name, nil
+ fmt.Printf("Совпало полностью")
+ } else {
+ fmt.Printf("Необходимо создать новый токен")
+ err = errors.New("Такого пароля нет в базе данных ошибка метода Get userData")
+ return "", err
+ }
+ } else {
+ err = errors.New("Такого пользователя нет в базе данных ошибка метода Get userData")
+ return "", err
+
+ }
+ return name, err
+}
+
+// Add функция добавляет нового пользователя и его пароль
+func Add(name string, password string) (string, error) {
+ var err error
+ user.lock.Lock()
+ defer user.lock.Unlock()
+ if _, ok := user.userVerif[name]; ok {
+ err := errors.New("Пользователь с таким именем уже существует, укажите другое имя")
+ return "", err
+ } else {
+ user.userVerif[name] = user_data.UserDataVerification{password}
+ return name, nil
+ }
+
+ return name, err
+}
+
+// Delete функция удаляет пользователя и его пароль из БД
+func Delete(name string, password string) (string, error) {
+ var err error
+ user.lock.Lock()
+ defer user.lock.Unlock()
+ if valueMap, ok := user.userVerif[name]; ok {
+ if password == valueMap.Password {
+ delete(user.userVerif, name)
+ user_session.DeleteToken(name)
+ fmt.Printf("Совпало полностью")
+ return name, nil
+
+ } else {
+ err = errors.New("Такого пароля нет в базе данных ошибка метода Delete userData")
+ return "", nil
+ }
+ } else {
+ err := errors.New("Пользователь с таким именем уже существует, укажите другое имя")
+ return name, err
+ }
+ return name, err
+}
diff --git a/user_data/userDataVerification.go b/user_data/userDataVerification.go
new file mode 100644
index 0000000..3bda3bf
--- /dev/null
+++ b/user_data/userDataVerification.go
@@ -0,0 +1,6 @@
+package user_data
+
+// UserDataVerification структура необходимая для хранения соответсвия имени пользователя-пароля
+type UserDataVerification struct {
+ Password string
+}
diff --git a/user_session/config.go b/user_session/config.go
new file mode 100644
index 0000000..f9aa1ea
--- /dev/null
+++ b/user_session/config.go
@@ -0,0 +1,132 @@
+package user_session
+
+import (
+ "crypto/md5"
+ "encoding/hex"
+ "errors"
+ "fmt"
+ "httpTable/table_metadata"
+ "strconv"
+)
+
+// Row начальные значения таблицы
+const Row = 2
+const Column = 2
+
+// InitializationSession -функция запускающаяся когда первый раз запустили приложение для инициализации карт
+//Имени пользователя-пароля и Имени пользователя-токенов, Токен-имя пользователя
+func InitializationSession() {
+ session.userInfo = make(map[string]table_metadata.TableMetaData)
+ userName.infoName = make(map[string][]string)
+ tokenName.tokenName = make(map[string]string)
+}
+
+// SetFirstNameToken функция для осуществления первого входа пользователя после регистрации
+func SetFirstNameToken(name string, token string) {
+ tokenName.lock.Lock()
+ defer tokenName.lock.Unlock()
+ if _, ok := tokenName.tokenName[token]; ok {
+ fmt.Printf("Такой токен есть")
+ } else {
+ tokenName.tokenName[token] = name
+ }
+ userName.lock.Lock()
+ defer userName.lock.Unlock()
+ if _, ok := userName.infoName[name]; ok {
+ userName.infoName[name] = append(userName.infoName[name], token)
+ } else {
+ userName.infoName[name] = append(userName.infoName[name], token)
+ }
+}
+
+// LogOutToken функция сброса текущей сессии удаляет запись в map
+func LogOutToken(token string) {
+ session.lock.Lock()
+ defer session.lock.Unlock()
+
+ if _, ok := session.userInfo[token]; ok {
+ delete(session.userInfo, token)
+ }
+}
+
+// DeleteToken функция удаления сессии пользователя
+func DeleteToken(name string) {
+ userName.lock.Lock()
+ defer userName.lock.Unlock()
+ if valueMap, ok := userName.infoName[name]; ok {
+ delete(userName.infoName, name)
+ for _, value := range valueMap {
+ fmt.Printf("value", value)
+ if _, ok := userName.infoName[value]; ok {
+ fmt.Printf("userName.infoName[value]", userName.infoName[value])
+ delete(userName.infoName, value)
+ }
+ session.lock.Lock()
+ defer session.lock.Unlock()
+ if _, ok := session.userInfo[value]; ok {
+ delete(session.userInfo, value)
+ }
+ }
+ }
+}
+
+//функция получения имени пользователя по токену
+func GetName(value string) (string, error) {
+ var err error
+ if valueToken, ok := tokenName.tokenName[value]; ok {
+ name := valueToken
+ return name, nil
+ } else {
+ err = errors.New("Токена нет в базе данных ошибка метода GetName config")
+ }
+ return "", err
+}
+
+// Get функция получение строк и колонок из map по Токену
+func Get(value string) (int, int, string, error) {
+ var rows int
+ var columns int
+ var err error
+ session.lock.Lock()
+ defer session.lock.Unlock()
+ if valueMap, ok := session.userInfo[value]; ok {
+ rows = valueMap.Row
+ columns = valueMap.Column
+ } else {
+ fmt.Printf("Токена нет в базе данных ошибка метода Get config")
+ err := errors.New("Токена нет в базе данных ошибка метода Get config")
+ return 0, 0, ``, err
+ }
+ return rows, columns, value, err
+}
+
+//полусение нового уникального id для генерации токена под нового пользователя
+func SetCookie() string {
+ token.lock.Lock()
+ defer token.lock.Unlock()
+ token.id++
+ token := createToken(token.id)
+ return token
+}
+
+// Set функция присвоения нового значения map по значению Токена
+func Set(value string, row int, column int) {
+ session.lock.Lock()
+ defer session.lock.Unlock()
+
+ if _, ok := session.userInfo[value]; ok {
+ session.userInfo[value] = table_metadata.TableMetaData{row, column}
+ } else {
+ session.userInfo[value] = table_metadata.TableMetaData{Row, Column}
+ }
+ fmt.Printf("session.userInfo из config", session.userInfo)
+}
+
+//createJWTToken-функция создания нового Токена для нового пользователя
+func createToken(id int) string {
+ idString := strconv.Itoa(id)
+ tokenString := key + idString
+ tokenByte := md5.Sum([]byte(tokenString))
+ token := hex.EncodeToString(tokenByte[:])
+ return token
+}
diff --git a/user_session/userSession.go b/user_session/userSession.go
new file mode 100644
index 0000000..d1b62c4
--- /dev/null
+++ b/user_session/userSession.go
@@ -0,0 +1,45 @@
+package user_session
+
+import (
+ "httpTable/table_metadata"
+ "sync"
+)
+
+// UserSession структура состаящая из map значение токена-ключ, количество строк и столбцов структура
+type UserSession struct {
+ userInfo map[string]table_metadata.TableMetaData
+ lock sync.RWMutex
+}
+
+//переменная для доступа к структуре UserSession
+var session UserSession
+
+// UserName структура хранящая Имя пользователя-токены с которых пользователь заходит
+type UserName struct {
+ infoName map[string][]string
+ lock sync.RWMutex
+}
+
+//переменная для доступа к структуре UserName
+var userName UserName
+
+// TokenName структура хранящая Токен-имя пользователя
+type TokenName struct {
+ tokenName map[string]string
+ lock sync.RWMutex
+}
+
+//переменная для доступа к структуре TokenName
+var tokenName TokenName
+
+// Token структура токена, для инициализации уникального токена
+type Token struct {
+ id int
+ key string
+ lock sync.RWMutex
+}
+
+//переменная для доступа к структуре Token
+var token Token
+
+const key = "my new token for table api"