Advanced Search TS

This commit is contained in:
Geomitron
2021-04-02 22:24:06 -05:00
parent 265ae29f4b
commit e7a265529e
6 changed files with 146 additions and 67 deletions

View File

@@ -1,7 +1,8 @@
import { IPCInvokeHandler } from '../../shared/IPCHandler'
import { SongSearch, SearchType, SongResult } from '../../shared/interfaces/search.interface'
import { SongSearch, SongResult } from '../../shared/interfaces/search.interface'
import * as needle from 'needle'
import { serverURL } from '../../shared/Paths'
/**
* Handles the 'song-search' event.
*/
@@ -15,29 +16,20 @@ class SearchHandler implements IPCInvokeHandler<'song-search'> {
return new Promise<SongResult[]>((resolve, reject) => {
needle.request(
'get',
serverURL + `/api/search/${this.getSearchType(search)}`, {
query: search.query,
limit: search.length,
offset: search.offset
}, (err, response) => {
serverURL + `/api/search`, search, (err, response) => {
if (err) {
reject(err.message)
} else {
resolve(response.body)
if (response.body.errors) {
console.log(response.body)
resolve([])
} else {
resolve(response.body)
}
}
})
})
}
/**
* @returns the search api type that corresponds with `search.type`.
*/
private getSearchType(search: SongSearch) {
switch (search.type) {
case SearchType.Any: return 'general'
default: return '<<<ERROR>>>' // TODO: add more search types
}
}
}
export const searchHandler = new SearchHandler()

View File

@@ -1,18 +1,76 @@
/**
* Represents a user's song search query.
*/
export interface SongSearch {
export interface SongSearch { // TODO: make limit a setting that's not always 51
query: string
type: SearchType
quantity: 'all' | 'any'
similarity: 'similar' | 'exact'
fields: SearchFields
tags: SearchTags
instruments: SearchInstruments
difficulties: SearchDifficulties
minDiff: number
maxDiff: number
limit: number
offset: number
length: number
}
/**
* The list of possible search categories.
*/
export enum SearchType {
'Any', 'Name', 'Artist', 'Album', 'Genre', 'Year', 'Charter'
export function getDefaultSearch(): SongSearch {
return {
query: '',
quantity: 'all',
similarity: 'similar',
fields: { name: true, artist: true, album: true, genre: true, year: true, charter: true, tag: true },
tags: { 'sections': false, 'star power': false, 'forcing': false, 'taps': false, 'lyrics': false,
'video': false, 'stems': false, 'solo sections': false, 'open notes': false },
instruments: { guitar: false, bass: false, rhythm: false, keys: false,
drums: false, guitarghl: false, bassghl: false, vocals: false },
difficulties: { expert: false, hard: false, medium: false, easy: false },
minDiff: 0,
maxDiff: 6,
limit: 50 + 1,
offset: 0
}
}
export interface SearchFields {
name: boolean
artist: boolean
album: boolean
genre: boolean
year: boolean
charter: boolean
tag: boolean
}
export interface SearchTags {
'sections': boolean // Tag inverted
'star power': boolean // Tag inverted
'forcing': boolean // Tag inverted
'taps': boolean
'lyrics': boolean
'video': boolean
'stems': boolean
'solo sections': boolean
'open notes': boolean
}
export interface SearchInstruments {
guitar: boolean
bass: boolean
rhythm: boolean
keys: boolean
drums: boolean
guitarghl: boolean
bassghl: boolean
vocals: boolean
}
export interface SearchDifficulties {
expert: boolean
hard: boolean
medium: boolean
easy: boolean
}
/**