From f2523abecce2f9b31617ee53d16487d0ac8af36a Mon Sep 17 00:00:00 2001 From: Moriz Wahl Date: Mon, 22 Nov 2021 19:05:09 +0100 Subject: [PATCH 1/8] add server users entity --- database/entity/ServerUser.ts | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 database/entity/ServerUser.ts diff --git a/database/entity/ServerUser.ts b/database/entity/ServerUser.ts new file mode 100644 index 000000000..7f857880e --- /dev/null +++ b/database/entity/ServerUser.ts @@ -0,0 +1,31 @@ +import { BaseEntity, Entity, PrimaryGeneratedColumn, Column } from 'typeorm' + +@Entity('server_users') +export class ServerUser extends BaseEntity { + @PrimaryGeneratedColumn('increment', { unsigned: true }) + id: number + + @Column({ length: 50 }) + username: string + + @Column({ type: 'bigint', unsigned: true }) + password: BigInt + + @Column({ length: 50, unique: true }) + email: string + + @Column({ length: 20, default: 'admin' }) + role: string + + @Column({ length: 20, default: 0 }) + activated: TinyInt + + @Column({ name: 'last_login', default: null, nullable: true }) + lastLogin: Date + + @Column({ name: 'created', default: () => 'CURRENT_TIMESTAMP' }) + created: Date + + @Column({ name: 'created', default: () => 'CURRENT_TIMESTAMP' }) + modified: Date +} From 885a01a1c2bf22156c04ca6bf48826a3469606c6 Mon Sep 17 00:00:00 2001 From: Moriz Wahl Date: Mon, 22 Nov 2021 19:09:38 +0100 Subject: [PATCH 2/8] fix data type of activated field --- database/entity/ServerUser.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/database/entity/ServerUser.ts b/database/entity/ServerUser.ts index 7f857880e..e776093ac 100644 --- a/database/entity/ServerUser.ts +++ b/database/entity/ServerUser.ts @@ -17,8 +17,8 @@ export class ServerUser extends BaseEntity { @Column({ length: 20, default: 'admin' }) role: string - @Column({ length: 20, default: 0 }) - activated: TinyInt + @Column({ default: 0 }) + activated: number @Column({ name: 'last_login', default: null, nullable: true }) lastLogin: Date From 847997542512a4e311ad4d6cdeb64c088ca11cde Mon Sep 17 00:00:00 2001 From: elweyn Date: Tue, 23 Nov 2021 08:05:52 +0100 Subject: [PATCH 3/8] Since we don't make a request to the login_server we need to catch if user email has been activated. --- backend/src/graphql/resolver/UserResolver.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/backend/src/graphql/resolver/UserResolver.ts b/backend/src/graphql/resolver/UserResolver.ts index 25f83bb09..fffd1f7e6 100644 --- a/backend/src/graphql/resolver/UserResolver.ts +++ b/backend/src/graphql/resolver/UserResolver.ts @@ -207,6 +207,7 @@ export class UserResolver { const loginUser = await loginUserRepository.findByEmail(email).catch(() => { throw new Error('No user with this credentials') }) + if (!loginUser.emailChecked) throw new Error('user email not validated') const passwordHash = SecretKeyCryptographyCreateKey(email, password) // return short and long hash const loginUserPassword = BigInt(loginUser.password.toString()) if (loginUserPassword !== passwordHash[0].readBigUInt64LE()) { From 52aa7e437ea2e01e0a6e5174902974115aafec7d Mon Sep 17 00:00:00 2001 From: ogerly Date: Tue, 23 Nov 2021 13:12:11 +0100 Subject: [PATCH 4/8] Added creation to useradmin model, adding call to apollo in backend. --- admin/src/graphql/searchUsers.js | 12 ++++ admin/src/views/UserSearch.vue | 56 +++++++------------ backend/src/graphql/model/UserAdmin.ts | 3 + backend/src/graphql/resolver/AdminResolver.ts | 7 ++- 4 files changed, 41 insertions(+), 37 deletions(-) create mode 100644 admin/src/graphql/searchUsers.js diff --git a/admin/src/graphql/searchUsers.js b/admin/src/graphql/searchUsers.js new file mode 100644 index 000000000..ceba5bc6e --- /dev/null +++ b/admin/src/graphql/searchUsers.js @@ -0,0 +1,12 @@ +import gql from 'graphql-tag' + +export const searchUsers = gql` + query($searchText: String!) { + searchUsers(searchText: $searchText) { + firstName + lastName + email + creation + } + } +` diff --git a/admin/src/views/UserSearch.vue b/admin/src/views/UserSearch.vue index 7d8d87cb5..2a978e1f0 100644 --- a/admin/src/views/UserSearch.vue +++ b/admin/src/views/UserSearch.vue @@ -6,6 +6,7 @@ v-model="criteria" class="shadow p-3 mb-5 bg-white rounded" placeholder="User suche" + @input="getUsers" > diff --git a/backend/src/graphql/model/UserAdmin.ts b/backend/src/graphql/model/UserAdmin.ts index 170b3df36..de2c45959 100644 --- a/backend/src/graphql/model/UserAdmin.ts +++ b/backend/src/graphql/model/UserAdmin.ts @@ -11,4 +11,7 @@ export class UserAdmin { @Field(() => String) lastName: string + + @Field(() => [Number]) + creation: number[] } diff --git a/backend/src/graphql/resolver/AdminResolver.ts b/backend/src/graphql/resolver/AdminResolver.ts index ce1496fa5..9af50faad 100644 --- a/backend/src/graphql/resolver/AdminResolver.ts +++ b/backend/src/graphql/resolver/AdminResolver.ts @@ -6,7 +6,7 @@ import { LoginUserRepository } from '../../typeorm/repository/LoginUser' @Resolver() export class AdminResolver { @Query(() => [UserAdmin]) - async getUsers(@Arg('searchText') searchText: string): Promise { + async searchUsers(@Arg('searchText') searchText: string): Promise { const loginUserRepository = getCustomRepository(LoginUserRepository) const loginUsers = await loginUserRepository.findBySearchCriteria(searchText) const users = loginUsers.map((loginUser) => { @@ -14,6 +14,11 @@ export class AdminResolver { user.firstName = loginUser.firstName user.lastName = loginUser.lastName user.email = loginUser.email + user.creation = [ + (Math.floor(Math.random() * 50) + 1) * 20, + (Math.floor(Math.random() * 50) + 1) * 20, + (Math.floor(Math.random() * 50) + 1) * 20, + ] return user }) return users From 35f297ece8b2a8e53ea4d1ae5ca233a00ca4c284 Mon Sep 17 00:00:00 2001 From: ogerly Date: Tue, 23 Nov 2021 13:24:09 +0100 Subject: [PATCH 5/8] Vue uses VueApollo to main. --- admin/src/main.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/admin/src/main.js b/admin/src/main.js index aa4cc3e03..46ee8a6f6 100644 --- a/admin/src/main.js +++ b/admin/src/main.js @@ -62,6 +62,8 @@ Vue.use(IconsPlugin) Vue.use(moment) +Vue.use(VueApollo) + addNavigationGuards(router, store) new Vue({ From d6e8d0cc6b46719f77a68b255acbc3d54abc4363 Mon Sep 17 00:00:00 2001 From: ogerly Date: Tue, 23 Nov 2021 13:27:39 +0100 Subject: [PATCH 6/8] unused import KlickTip and Int in type-graphql remove --- backend/src/graphql/model/UserAdmin.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/backend/src/graphql/model/UserAdmin.ts b/backend/src/graphql/model/UserAdmin.ts index de2c45959..cbf8dd21c 100644 --- a/backend/src/graphql/model/UserAdmin.ts +++ b/backend/src/graphql/model/UserAdmin.ts @@ -1,5 +1,4 @@ -import { ObjectType, Field, Int } from 'type-graphql' -import { KlickTipp } from './KlickTipp' +import { ObjectType, Field } from 'type-graphql' @ObjectType() export class UserAdmin { From 9873ac6eeee50f184d14d01ca63887bcfa0af4d7 Mon Sep 17 00:00:00 2001 From: ogerly Date: Tue, 23 Nov 2021 16:14:24 +0100 Subject: [PATCH 7/8] add user search in creation.vue --- admin/src/components/CreationFormular.vue | 13 ++--- admin/src/components/UserTable.vue | 10 ++-- admin/src/graphql/searchUsers.js | 2 +- admin/src/main.js | 1 - admin/src/views/Creation.vue | 64 ++++++++++------------- admin/src/views/CreationConfirm.vue | 33 ++++++------ admin/src/views/UserSearch.vue | 6 +-- 7 files changed, 57 insertions(+), 72 deletions(-) diff --git a/admin/src/components/CreationFormular.vue b/admin/src/components/CreationFormular.vue index a810528d6..0339cad45 100644 --- a/admin/src/components/CreationFormular.vue +++ b/admin/src/components/CreationFormular.vue @@ -4,9 +4,10 @@

{{ this.type === 'singleCreation' - ? 'Einzelschöpfung für ' + item.first_name + ' ' + item.last_name + '' + ? 'Einzelschöpfung für ' + item.firstName + ' ' + item.lastName + '' : 'Massenschöpfung für ' + Object.keys(this.itemsMassCreation).length + ' Mitglieder' }} + {{ item }}

Bitte wähle ein oder Mehrere Mitglieder aus für die du Schöpfen möchtest @@ -105,7 +106,6 @@ :disabled="radioSelected === '' || value <= 0 || text.length < 10" > Update Schöpfung ({{ type }},{{ pagetype }}) - {{ creationUserData }} ' + this.type + ' >> für ' + this.item.first_name + '') + alert('SUBMIT CREATION => ' + this.type + ' >> für ' + this.item.firstName + '') // erstellen eines Arrays (submitObj) mit allen Daten this.submitObj = [ { @@ -262,15 +262,12 @@ export default { // hinweis das eine ein einzelne Schöpfung abgesendet wird an (email) alert('UPDATE EINZEL SCHÖPFUNG ABSENDEN FÜR >> ') // umschreiben, update eine bestehende Schöpfung eine - this.creationUserData.datum = this.radioSelected.long this.creationUserData.creation_gdd = this.value this.creationUserData.text = this.text - - // this.$store.commit('update-creation-user-data', this.submitObj) } else { // hinweis das eine ein einzelne Schöpfung abgesendet wird an (email) - alert('EINZEL SCHÖPFUNG ABSENDEN FÜR >> ' + this.item.first_name + '') + alert('EINZEL SCHÖPFUNG ABSENDEN FÜR >> ' + this.item.firstName + '') // $store - offene Schöpfungen hochzählen this.$store.commit('openCreationsPlus', 1) } diff --git a/admin/src/components/UserTable.vue b/admin/src/components/UserTable.vue index d96438bcb..7cb34a59c 100644 --- a/admin/src/components/UserTable.vue +++ b/admin/src/components/UserTable.vue @@ -64,10 +64,9 @@ @@ -75,7 +74,7 @@ :icon="type === 'PageCreationConfirm' ? 'x' : 'eye-slash-fill'" aria-label="Help" > - Details verbergen von {{ row.item.first_name }} {{ row.item.last_name }} + Details verbergen von {{ row.item.firstName }} {{ row.item.lastName }} @@ -149,7 +148,7 @@ export default { }, data() { return { - creationData: [], + creationData: {}, overlay: false, overlayBookmarkType: '', overlayItem: [], @@ -217,9 +216,6 @@ export default { alert(JSON.stringify(item)) this.$emit('remove-confirm-result', item, 'remove') }, - getCreationInMonths(creation) { - return creation.split(',') - }, editCreationUserTable(row, rowItem) { alert('editCreationUserTable') if (!row.detailsShowing) { diff --git a/admin/src/graphql/searchUsers.js b/admin/src/graphql/searchUsers.js index ceba5bc6e..86e333845 100644 --- a/admin/src/graphql/searchUsers.js +++ b/admin/src/graphql/searchUsers.js @@ -1,7 +1,7 @@ import gql from 'graphql-tag' export const searchUsers = gql` - query($searchText: String!) { + query ($searchText: String!) { searchUsers(searchText: $searchText) { firstName lastName diff --git a/admin/src/main.js b/admin/src/main.js index 46ee8a6f6..3be3ae0bf 100644 --- a/admin/src/main.js +++ b/admin/src/main.js @@ -25,7 +25,6 @@ import moment from 'vue-moment' const httpLink = new HttpLink({ uri: CONFIG.GRAPHQL_URI }) const authLink = new ApolloLink((operation, forward) => { - const token = store.state.token operation.setContext({ diff --git a/admin/src/views/Creation.vue b/admin/src/views/Creation.vue index 0f88199f8..d3379159b 100644 --- a/admin/src/views/Creation.vue +++ b/admin/src/views/Creation.vue @@ -44,6 +44,7 @@