mirror of
				https://github.com/Unleash/unleash.git
				synced 2025-10-27 11:02:16 +01:00 
			
		
		
		
	fix: add migration
This commit is contained in:
		
							parent
							
								
									875fb7734c
								
							
						
					
					
						commit
						d73293c576
					
				| @ -29,6 +29,7 @@ import EnvironmentStore from './environment-store'; | ||||
| import FeatureTagStore from './feature-tag-store'; | ||||
| import { FeatureEnvironmentStore } from './feature-environment-store'; | ||||
| import { ClientMetricsStoreV2 } from './client-metrics-store-v2'; | ||||
| import UserSplashStore from './user-splash-store'; | ||||
| 
 | ||||
| export const createStores = ( | ||||
|     config: IUnleashConfig, | ||||
| @ -85,6 +86,7 @@ export const createStores = ( | ||||
|             eventBus, | ||||
|             getLogger, | ||||
|         ), | ||||
|         userSplashStore: new UserSplashStore(db, eventBus, getLogger), | ||||
|     }; | ||||
| }; | ||||
| 
 | ||||
|  | ||||
| @ -47,10 +47,7 @@ export default class UserSplashStore implements IUserSplashStore { | ||||
|         return userSplash.map(rowToField); | ||||
|     } | ||||
| 
 | ||||
|     async getSplash( | ||||
|         userId: number, | ||||
|         splashId: string, | ||||
|     ): Promise<IUserSplash> { | ||||
|     async getSplash(userId: number, splashId: string): Promise<IUserSplash> { | ||||
|         const userSplash = await this.db | ||||
|             .table<IUserSplashTable>(TABLE) | ||||
|             .select() | ||||
| @ -92,10 +89,7 @@ export default class UserSplashStore implements IUserSplashStore { | ||||
|         return present; | ||||
|     } | ||||
| 
 | ||||
|     async get({ | ||||
|         userId, | ||||
|         splashId, | ||||
|     }: IUserSplashKey): Promise<IUserSplash> { | ||||
|     async get({ userId, splashId }: IUserSplashKey): Promise<IUserSplash> { | ||||
|         return this.getSplash(userId, splashId); | ||||
|     } | ||||
| 
 | ||||
|  | ||||
| @ -7,6 +7,7 @@ import { IUnleashServices } from '../../types/services'; | ||||
| import UserService from '../../services/user-service'; | ||||
| import SessionService from '../../services/session-service'; | ||||
| import UserFeedbackService from '../../services/user-feedback-service'; | ||||
| import UserSplashService from 'lib/services/user-splash-service'; | ||||
| 
 | ||||
| interface IChangeUserRequest { | ||||
|     password: string; | ||||
| @ -22,6 +23,8 @@ class UserController extends Controller { | ||||
| 
 | ||||
|     private sessionService: SessionService; | ||||
| 
 | ||||
|     private userSplashService: UserSplashService; | ||||
| 
 | ||||
|     constructor( | ||||
|         config: IUnleashConfig, | ||||
|         { | ||||
| @ -29,12 +32,14 @@ class UserController extends Controller { | ||||
|             userService, | ||||
|             sessionService, | ||||
|             userFeedbackService, | ||||
|             userSplashService, | ||||
|         }: Pick< | ||||
|             IUnleashServices, | ||||
|             | 'accessService' | ||||
|             | 'userService' | ||||
|             | 'sessionService' | ||||
|             | 'userFeedbackService' | ||||
|             | 'userSplashService' | ||||
|         >, | ||||
|     ) { | ||||
|         super(config); | ||||
| @ -57,6 +62,7 @@ class UserController extends Controller { | ||||
|         const feedback = await this.userFeedbackService.getAllUserFeedback( | ||||
|             user, | ||||
|         ); | ||||
|         //const splash = await this.userSplashService.getAllUserSplash(user);
 | ||||
| 
 | ||||
|         // TODO: remove this line after we remove it from db.
 | ||||
|         delete user.permissions; | ||||
|  | ||||
| @ -27,6 +27,7 @@ import FeatureToggleService from './feature-toggle-service'; | ||||
| import EnvironmentService from './environment-service'; | ||||
| import FeatureTagService from './feature-tag-service'; | ||||
| import ProjectHealthService from './project-health-service'; | ||||
| import UserSplashService from './user-splash-service'; | ||||
| 
 | ||||
| export const createServices = ( | ||||
|     stores: IUnleashStores, | ||||
| @ -72,6 +73,7 @@ export const createServices = ( | ||||
|         accessService, | ||||
|         featureToggleServiceV2, | ||||
|     ); | ||||
|     const userSplashService = new UserSplashService(stores, config); | ||||
| 
 | ||||
|     return { | ||||
|         accessService, | ||||
| @ -100,6 +102,7 @@ export const createServices = ( | ||||
|         userFeedbackService, | ||||
|         featureTagService, | ||||
|         projectHealthService, | ||||
|         userSplashService, | ||||
|     }; | ||||
| }; | ||||
| 
 | ||||
|  | ||||
| @ -28,14 +28,12 @@ export default class UserSplashService { | ||||
|             return await this.userSplashStore.getAllUserSplashs(user.id); | ||||
|         } catch (err) { | ||||
|             this.logger.error(err); | ||||
| 
 | ||||
|             return []; | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     async getSplash( | ||||
|         user_id: number, | ||||
|         splash_id: string, | ||||
|     ): Promise<IUserSplash> { | ||||
|     async getSplash(user_id: number, splash_id: string): Promise<IUserSplash> { | ||||
|         return this.userSplashStore.getSplash(user_id, splash_id); | ||||
|     } | ||||
| 
 | ||||
|  | ||||
| @ -23,6 +23,7 @@ import EnvironmentService from '../services/environment-service'; | ||||
| import FeatureTagService from '../services/feature-tag-service'; | ||||
| import ProjectHealthService from '../services/project-health-service'; | ||||
| import ClientMetricsServiceV2 from '../services/client-metrics/client-metrics-service-v2'; | ||||
| import UserSplashService from '../services/user-splash-service'; | ||||
| 
 | ||||
| export interface IUnleashServices { | ||||
|     accessService: AccessService; | ||||
| @ -51,4 +52,5 @@ export interface IUnleashServices { | ||||
|     userFeedbackService: UserFeedbackService; | ||||
|     userService: UserService; | ||||
|     versionService: VersionService; | ||||
|     userSplashService: UserSplashService; | ||||
| } | ||||
|  | ||||
| @ -1,7 +1,7 @@ | ||||
| import { Store } from './store'; | ||||
| 
 | ||||
| export interface IUserSplash { | ||||
|     seen?: boolean; | ||||
|     seen: boolean; | ||||
|     splashId: string; | ||||
|     userId: number; | ||||
| } | ||||
| @ -11,8 +11,7 @@ export interface IUserSplashKey { | ||||
|     splashId: string; | ||||
| } | ||||
| 
 | ||||
| export interface IUserSplashStore | ||||
|     extends Store<IUserSplash, IUserSplashKey> { | ||||
| export interface IUserSplashStore extends Store<IUserSplash, IUserSplashKey> { | ||||
|     getAllUserSplashs(userId: number): Promise<IUserSplash[]>; | ||||
|     getSplash(userId: number, splashId: string): Promise<IUserSplash>; | ||||
|     updateSplash(splash: IUserSplash): Promise<IUserSplash>; | ||||
|  | ||||
| @ -8,18 +8,17 @@ exports.up = function (db, cb) { | ||||
|         splash_id TEXT,  | ||||
|         seen BOOLEAN NOT NULL DEFAULT false,  | ||||
|         PRIMARY KEY (user_id, splash_id)); | ||||
|         CREATE INDEX user_splash_user_id_idx ON user_splash (user_id); | ||||
|     );`,
 | ||||
|         CREATE INDEX user_splash_user_id_idx ON user_splash (user_id);`,
 | ||||
|         cb, | ||||
|     ); | ||||
| }; | ||||
| 
 | ||||
| exports.down = function (db, cb) { | ||||
|   db.runSql( | ||||
|     ` | ||||
|     db.runSql( | ||||
|         ` | ||||
|     DROP INDEX user_splash_user_id_idx; | ||||
|     DROP TABLE user_splash; | ||||
| `,
 | ||||
|     cb, | ||||
| ); | ||||
|         cb, | ||||
|     ); | ||||
| }; | ||||
|  | ||||
							
								
								
									
										15
									
								
								src/migrations/20211109103930-add-splash-entry-for-users.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								src/migrations/20211109103930-add-splash-entry-for-users.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,15 @@ | ||||
| exports.up = function (db, cb) { | ||||
|     db.runSql(`SELECT * FROM users`, (err, results) => { | ||||
|         results.rows.forEach((user) => { | ||||
|             db.runSql( | ||||
|                 `INSERT INTO user_splash(splash_id, user_id, seen) VALUES (?, ?, ?)`, | ||||
|                 ['environments', user.id, false], | ||||
|             ); | ||||
|         }); | ||||
|         cb(); | ||||
|     }); | ||||
| }; | ||||
| 
 | ||||
| exports.down = function (db, cb) { | ||||
|     db.runSql('DELETE FROM user_splash', cb); | ||||
| }; | ||||
| @ -8,7 +8,7 @@ process.nextTick(async () => { | ||||
|             createConfig({ | ||||
|                 db: { | ||||
|                     user: 'unleash_user', | ||||
|                     password: 'some_password', | ||||
|                     password: 'passord', | ||||
|                     host: 'localhost', | ||||
|                     port: 5432, | ||||
|                     database: 'unleash', | ||||
|  | ||||
							
								
								
									
										65
									
								
								src/test/fixtures/fake-user-splash-store.ts
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										65
									
								
								src/test/fixtures/fake-user-splash-store.ts
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,65 @@ | ||||
| import { | ||||
|     IUserSplashKey, | ||||
|     IUserSplash, | ||||
|     IUserSplashStore, | ||||
| } from 'lib/types/stores/user-splash-store'; | ||||
| 
 | ||||
| export default class FakeUserSplashStore implements IUserSplashStore { | ||||
|     // eslint-disable-next-line @typescript-eslint/no-unused-vars
 | ||||
|     getAllUserSplashs(userId: number): Promise<IUserSplash[]> { | ||||
|         return Promise.resolve([]); | ||||
|     } | ||||
| 
 | ||||
|     // eslint-disable-next-line @typescript-eslint/no-unused-vars
 | ||||
|     getSplash(userId: number, splashId: string): Promise<IUserSplash> { | ||||
|         return Promise.resolve({ seen: false, userId: 123, splashId: 'env' }); | ||||
|     } | ||||
| 
 | ||||
|     // eslint-disable-next-line @typescript-eslint/no-unused-vars
 | ||||
|     updateSplash(splash: IUserSplash): Promise<IUserSplash> { | ||||
|         return Promise.resolve({ seen: false, userId: 123, splashId: 'env' }); | ||||
|     } | ||||
| 
 | ||||
|     // eslint-disable-next-line @typescript-eslint/no-unused-vars
 | ||||
|     exists(key: IUserSplashKey): Promise<boolean> { | ||||
|         return Promise.resolve(false); | ||||
|     } | ||||
| 
 | ||||
|     // eslint-disable-next-line @typescript-eslint/no-unused-vars
 | ||||
|     get(key: IUserSplashKey): Promise<IUserSplash> { | ||||
|         return Promise.resolve(undefined); | ||||
|     } | ||||
| 
 | ||||
|     // eslint-disable-next-line @typescript-eslint/no-unused-vars
 | ||||
|     getAll(): Promise<IUserSplash[]> { | ||||
|         return Promise.resolve([]); | ||||
|     } | ||||
| 
 | ||||
|     // eslint-disable-next-line @typescript-eslint/no-unused-vars
 | ||||
|     getAllUserFeedback(userId: number): Promise<IUserSplash[]> { | ||||
|         return Promise.resolve([]); | ||||
|     } | ||||
| 
 | ||||
|     // eslint-disable-next-line @typescript-eslint/no-unused-vars
 | ||||
|     getFeedback(userId: number, feedbackId: string): Promise<IUserSplash> { | ||||
|         return Promise.resolve(undefined); | ||||
|     } | ||||
| 
 | ||||
|     // eslint-disable-next-line @typescript-eslint/no-unused-vars
 | ||||
|     updateFeedback(feedback: IUserSplash): Promise<IUserSplash> { | ||||
|         return Promise.resolve(undefined); | ||||
|     } | ||||
| 
 | ||||
|     // eslint-disable-next-line @typescript-eslint/no-unused-vars
 | ||||
|     delete(key: IUserSplashKey): Promise<void> { | ||||
|         return Promise.resolve(undefined); | ||||
|     } | ||||
| 
 | ||||
|     // eslint-disable-next-line @typescript-eslint/no-unused-vars
 | ||||
|     deleteAll(): Promise<void> { | ||||
|         return Promise.resolve(undefined); | ||||
|     } | ||||
| 
 | ||||
|     // eslint-disable-next-line @typescript-eslint/no-unused-vars
 | ||||
|     destroy(): void {} | ||||
| } | ||||
							
								
								
									
										2
									
								
								src/test/fixtures/store.ts
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								src/test/fixtures/store.ts
									
									
									
									
										vendored
									
									
								
							| @ -24,6 +24,7 @@ import FakeFeatureTypeStore from './fake-feature-type-store'; | ||||
| import FakeResetTokenStore from './fake-reset-token-store'; | ||||
| import FakeFeatureToggleClientStore from './fake-feature-toggle-client-store'; | ||||
| import FakeClientMetricsStoreV2 from './fake-client-metrics-store-v2'; | ||||
| import FakeUserSplashStore from './fake-user-splash-store'; | ||||
| 
 | ||||
| const createStores: () => IUnleashStores = () => { | ||||
|     const db = { | ||||
| @ -59,6 +60,7 @@ const createStores: () => IUnleashStores = () => { | ||||
|         featureTypeStore: new FakeFeatureTypeStore(), | ||||
|         resetTokenStore: new FakeResetTokenStore(), | ||||
|         sessionStore: new FakeSessionStore(), | ||||
|         userSplashStore: new FakeUserSplashStore(), | ||||
|     }; | ||||
| }; | ||||
| 
 | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user