diff --git a/db/migration/base/005.up.cm_usr_cmid.sql b/db/migration/base/005.up.cm_usr_cmid.sql new file mode 100644 index 0000000..2b909e7 --- /dev/null +++ b/db/migration/base/005.up.cm_usr_cmid.sql @@ -0,0 +1,3 @@ +alter table cm_usr drop constraint uq_company_usr; +alter table cm_usr rename cm_id to cmid; +alter table cm_usr add constraint uq_cm_usr unique (cmid, usr_id); \ No newline at end of file diff --git a/svc/api/zhandler.go b/svc/api/zhandler.go index f052678..a1c075a 100644 --- a/svc/api/zhandler.go +++ b/svc/api/zhandler.go @@ -2,6 +2,7 @@ package api import ( "fmt" + "git.makki.io/makki/libgo/mhttp" "git.notitek.com.tr/common/notgo/napi" "git.notitek.com.tr/common/notgo/nauth" "net/http" @@ -19,6 +20,20 @@ import ( ) func HttpHandler(re enums.TRunEnv) http.Handler { + lookup := &mhttp.Lookup{ + DoClientCheck: true, + Funcs: map[string]mhttp.LookupFunc{ + "entegrator": napi.Entegrators, + + "invmarket": napi.InvMarket, + + "usr": napi.Usr, + "rates": napi.Currency, + }, + CompanyCheckQueries: []string{"mmitem", "acchart", "ficomp"}, + JwtAuth: svc.S.JWT, + } + mux := chi.NewRouter() // Gerekli middleware stack @@ -55,11 +70,20 @@ func HttpHandler(re enums.TRunEnv) http.Handler { //protected end points mr.Group(func(r chi.Router) { // Seek, verify and validate JWT tokens - r.Use(jwtauth.Verifier(svc.S.JWT)) + r.Use(jwtauth.Verify(svc.S.JWT, jwtauth.TokenFromHeader, jwtauth.TokenFromCookie, jwtauth.TokenFromQuery)) // Handle valid / invalid tokens. r.Use(nauth.CheckTokenValidity) + // Set clientID + r.Use(nauth.ClientID) + + // Handle valid / invalid tokens. + r.Use(nauth.CheckTokenValidity) + + // lookup + r.Method("post", "/lookup/{query}", lookup) + // sy routes r.Get("/sy/companies", napi.CompanyList) diff --git a/ui/package.json b/ui/package.json index a4e656e..2c393cb 100644 --- a/ui/package.json +++ b/ui/package.json @@ -19,6 +19,7 @@ "jwt-decode": "^4.0.0", "pinia": "^2.0.11", "quasar": "^2.8.0", + "reconnecting-websocket": "^4.4.0", "vue": "^3.4.18", "vue-i18n": "^9.9.0", "vue-router": "^4.0.12", diff --git a/ui/quasar.config.js b/ui/quasar.config.js index 2beedce..52e6956 100644 --- a/ui/quasar.config.js +++ b/ui/quasar.config.js @@ -64,6 +64,7 @@ module.exports = configure(function (ctx) { // analyze: true, env: { showLangSelect: false, + wsActive: false, apiAddr: (() => { if (process.env.CUSTOM_API) { return process.env.CUSTOM_API @@ -150,6 +151,8 @@ module.exports = configure(function (ctx) { 'Loading', 'Dialog', 'Meta', + 'LocalStorage', + 'SessionStorage' ], }, diff --git a/ui/src/boot/bus.js b/ui/src/boot/bus.js index 253f14a..cd01913 100644 --- a/ui/src/boot/bus.js +++ b/ui/src/boot/bus.js @@ -3,12 +3,14 @@ import { EventBus } from 'quasar' import { boot } from 'quasar/wrappers' -export default boot(({ app }) => { - const bus = new EventBus() +const bus = new EventBus() +export default boot(({ app }) => { // for Options API app.config.globalProperties.$bus = bus // for Composition API app.provide('bus', bus) }) + +export { bus } diff --git a/ui/src/stores/login.js b/ui/src/stores/login.js index f2184ff..992b8b3 100644 --- a/ui/src/stores/login.js +++ b/ui/src/stores/login.js @@ -3,6 +3,7 @@ import { LocalStorage } from 'quasar' import { api } from 'boot/axios' import { jwtDecode } from "jwt-decode" import Router from 'src/router/index' +import {bus} from 'boot/bus' export const sessionName = 'bresSession' @@ -10,17 +11,26 @@ const defaultState = { LoggedIn: false, IsAdmin: false, Token: '', - UsrKSUID: '', + UsrKsuid: '', UsrEmail: '', - UsrFullname: '', + UsrFullName: '', Username: '', - ClientKSUID: '', + ClientKsuid: '', ClientCode: '', LicenseCode: '', - PkgConf: {} + PkgConf: {}, + + companyID: null } +bus.on('companySelect', (companyID) => { + const store = useLoginStore() + //store.companyID = companyID + store.setCompanyID(companyID) +}) + + export const useLoginStore = defineStore('login', { state: () => { return JSON.parse(JSON.stringify(defaultState)) @@ -28,6 +38,11 @@ export const useLoginStore = defineStore('login', { getters: {}, actions: { + setCompanyID(companyID) { + this.companyID = companyID + this.save() + }, + login (payload) { // kaldıysa önceki session'ı uçuralım LocalStorage.remove(sessionName) @@ -58,6 +73,14 @@ export const useLoginStore = defineStore('login', { } }, + updateProfile (payload) { + this.UsrFullName = payload.fullname + this.UsrEmail = payload.email + this.Username = payload.username + + this.save() + }, + updateState (payload) { Object.assign(this, payload) api.defaults.headers.common['Authorization'] = `Bearer ${payload.Token}` @@ -76,9 +99,17 @@ export const useLoginStore = defineStore('login', { } }, + save () { + const pl = {} + Object.keys(defaultState).forEach((key) => { + pl[key] = this[key] + }) + LocalStorage.set(sessionName, pl) + }, + IsLoggedIn () { - return this.LoggedIn - } + return this.LoggedIn + }, } }) diff --git a/ui/yarn.lock b/ui/yarn.lock index a1f434a..7dfd5a9 100644 --- a/ui/yarn.lock +++ b/ui/yarn.lock @@ -2593,6 +2593,11 @@ readdirp@~3.6.0: dependencies: picomatch "^2.2.1" +reconnecting-websocket@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/reconnecting-websocket/-/reconnecting-websocket-4.4.0.tgz#3b0e5b96ef119e78a03135865b8bb0af1b948783" + integrity sha512-D2E33ceRPga0NvTDhJmphEgJ7FUYF0v4lr1ki0csq06OdlxKfugGzN0dSkxM/NfqCxYELK4KcaTOUOjTV6Dcng== + register-service-worker@^1.7.2: version "1.7.2" resolved "https://registry.yarnpkg.com/register-service-worker/-/register-service-worker-1.7.2.tgz#6516983e1ef790a98c4225af1216bc80941a4bd2"