feat: some unsuccessful aviation stack migrations

This commit is contained in:
2025-07-17 15:55:43 +02:00
parent 65d60e6636
commit 2877247ef1
12 changed files with 2006 additions and 71 deletions

4
.gitignore vendored
View File

@@ -35,4 +35,6 @@ report.[0-9]_.[0-9]_.[0-9]_.[0-9]_.json
*.sqlite
/src/generated/prisma
flightawaretest.json
flightawaretest.json
NOTES.md
accounts.json

View File

@@ -0,0 +1,844 @@
{
"attribution": "https://github.com/ngneat/falso/blob/main/packages/falso/src/lib/first-name.json",
"data": {
"withAccents": {
"male": [
"Adrián",
"Ægir",
"Álvaro",
"André",
"Andrés",
"Árni",
"Asbjørn",
"Björn",
"César",
"Daníel",
"Davíð",
"Emílio",
"Fañch",
"François",
"František",
"Gísli",
"Götz",
"Guðjón",
"Guðmundur",
"Günter",
"Halldór",
"Hans-Jörg",
"Hans-Jürgen",
"Hüseyin",
"Iñaki",
"János",
"Jesús",
"Jiří",
"Jóhann",
"Jóhannes",
"Jokūbas",
"Jón",
"José",
"Jörn",
"Julião",
"Jürgen",
"Kristján",
"Maël",
"Magnús",
"Mathéo",
"Mátyás",
"Michał",
"Noël",
"Nuñez",
"Ólafur",
"Óscar",
"Øyvind",
"Páll",
"Paweł",
"Pétur",
"Ramón",
"Raúl",
"René",
"Ruairí",
"Rubén",
"Seán",
"Sérgio",
"Sigurður",
"Sönke",
"Stefán",
"Tomáš",
"Þorsteinn"
],
"female": [
"Ædel",
"Agnès",
"Alícia",
"Änne",
"Antónia",
"Ásta",
"Auður",
"Cäcilia",
"Chloë",
"Claúdia",
"Dörte",
"Elín",
"Elísabet",
"Eliška",
"Františka",
"Glória",
"Grażyna",
"Guðbjörg",
"Guðný",
"Guðrún",
"Henriëtte",
"Ingibjörg",
"Íris",
"Jóhanna",
"Jóna",
"Júlia",
"Käte",
"Katrín",
"Kolbrún",
"Kristín",
"KŠthe",
"Letícia",
"Lídia",
"Lúcia",
"Małgorzata",
"Margrét",
"María",
"Mónica",
"Natália",
"Ólöf",
"Patrícia",
"Ragnheiður",
"Renée",
"Ružena",
"Siân",
"Sigríður",
"Sigrún",
"Sílvia",
"Sørina",
"Věra",
"Virgínia",
"Zoë",
"Þóra",
"Þórunn"
]
},
"withoutAccents": {
"male": [
"Abdul",
"Abdullahi",
"Abubakar",
"Adam",
"Adamu",
"Adiy",
"Ahmad",
"Ajay",
"Akira",
"Alan",
"Alberto",
"Alejandro",
"Aleksander",
"Aleksandr",
"Aleksey",
"Alex",
"Alexander",
"Alexey",
"Ali",
"Aliyu",
"Aminu",
"Amit",
"Amiyr",
"Amiyt",
"Amnuai",
"Amphon",
"Anah",
"Anan",
"Andreas",
"Andrew",
"Andrey",
"Andri",
"Andries",
"Andrzej",
"Anil",
"Anthony",
"Anton",
"Antonio",
"Arnar",
"Artur",
"Artyom",
"Arun",
"Ashok",
"Atli",
"Avraham",
"Bartosz",
"Bello",
"Bernd",
"Bin",
"Birgir",
"Bjarni",
"Blessing",
"Bongani",
"Brian",
"Bunmi",
"Carlos",
"Carol",
"Chan",
"Chao",
"Charles",
"Charoen",
"Chen",
"Cheng",
"Christian",
"Christopher",
"Colin",
"Daniel",
"Daniyel",
"Dariusz",
"David",
"Denis",
"Dennis",
"Diego",
"Dieter",
"Dilip",
"Dinesh",
"Dmitriy",
"Dmitry",
"Einar",
"Eliyahu",
"Emmanuel",
"Evgeniy",
"Fernando",
"Fran",
"Francis",
"Francisco",
"Francisco-Javier",
"Frank",
"Franz",
"Gang",
"Gareth",
"Gary",
"George",
"Gerhard",
"Graham",
"Grzegorz",
"Gunnar",
"Guy",
"Haim",
"Haiyan",
"Hans",
"Hans-Ulrich",
"Haruna",
"Hassan",
"Heike",
"Heinz",
"Helgi",
"Helmut",
"Hendrik",
"Herbert",
"Hideo",
"Hiromi",
"Hiroshi",
"Hong",
"Horst",
"Hui",
"Ian",
"Ibrahim",
"Idris",
"Igor",
"Ilya",
"Isa",
"Isaac",
"Isah",
"Ivan",
"Jabulani",
"Jacek",
"Jacobus",
"Jakub",
"James",
"Jan",
"Janusz",
"Javier",
"Jean",
"Jerzy",
"Jesus",
"Jason",
"Jianguo",
"Jianhua",
"Jianjun",
"Jianping",
"Jin",
"Joan",
"Johan",
"Johannes",
"John",
"Jonathan",
"Jorge",
"Jose",
"Jose-Antonio",
"Jose-Luis",
"Jose-Manuel",
"Jose-Maria",
"Josef",
"Joseph",
"Joyce",
"Juan",
"Kabiru",
"Kai",
"Kamil",
"Karen",
"Karl",
"Karl-Heinz",
"Katsumi",
"Kazuo",
"Kelvin",
"Kenji",
"Kenneth",
"Kevin",
"Kiran",
"Kirill",
"Kiyoshi",
"Kjartan",
"Klaus",
"Ko",
"Koichi",
"Koji",
"Konstantin",
"Koshi",
"Krishna",
"Kristinn",
"Krzysztof",
"Kun",
"Lakshmi",
"Lan",
"Laxmi",
"Lei",
"Li",
"Lihua",
"Lijun",
"Lilian",
"Lin",
"Ling",
"Liping",
"Liyor",
"Luis",
"Lukasz",
"Maciej",
"Mahmood",
"Maksim",
"Manfred",
"Manoj",
"Manuel",
"Marcin",
"Mardkhay",
"Marek",
"Mariusz",
"Mark",
"Martin",
"Masami",
"Masao",
"Mateusz",
"Matt",
"Matthew",
"Meiyr",
"Michael",
"Michal",
"Miguel",
"Miguel-Angel",
"Mikhail",
"Min",
"Ming",
"Mitsuo",
"Miykhael",
"Miykhal",
"Mo",
"Mohamed",
"Mohammad",
"Mohammed",
"Mohan",
"Moses",
"Moshe",
"Mpho",
"Muhammad",
"Muhammed",
"Mukesh",
"Musa",
"Narong",
"Nathan",
"Nicola",
"Nikita",
"Nikolay",
"Ning",
"Nkosinathi",
"Noam",
"Oleg",
"Omer",
"Otieno",
"Pablo",
"Patrick",
"Paul",
"Pavel",
"Pawel",
"Pedro",
"Peng",
"Peter",
"Petrus",
"Philip",
"Pieter",
"Ping",
"Piotr",
"Prasit",
"Prasoet",
"Pricha",
"Pushpa",
"Qiang",
"Qing",
"Radha",
"Rafael",
"Ragnar",
"Raj",
"Rajendra",
"Rajesh",
"Raju",
"Rakesh",
"Ram",
"Ramesh",
"Raphael",
"Rattana",
"Ravi",
"Richard",
"Robert",
"Roman",
"Rong",
"Roy",
"Ryan",
"Salisu",
"Saman",
"Samran",
"Samuel",
"Sani",
"Sanjay",
"Santosh",
"Sam",
"Sammy",
"Sawat",
"Sebastian",
"Sergey",
"Sergio",
"Shankar",
"Shay",
"Shigeru",
"Shimon",
"Shlomo",
"Shoji",
"Sibusiso",
"Simon",
"Sipho",
"Sombat",
"Sombun",
"Somchai",
"Somchit",
"Somkhit",
"Somkiat",
"Sommai",
"Somnuek",
"Somphon",
"Somphong",
"Somsak",
"Sri",
"Stefan",
"Stephen",
"Steve",
"Steven",
"Suman",
"Sunday",
"Sunil",
"Sunthon",
"Suresh",
"Sushila",
"Suwit",
"Sveinn",
"Tadashi",
"Takashi",
"Takeshi",
"Tal",
"Tebogo",
"Thabo",
"Thawi",
"Themba",
"Thomas",
"Thulani",
"Tomasz",
"Toshio",
"Udom",
"Umar",
"Uriy",
"Usman",
"Uwe",
"Victor",
"Vijay",
"Viktor",
"Vincent",
"Vinod",
"Vladimir",
"Walter",
"Wanchai",
"Waraphon",
"Wei",
"Werner",
"Wichai",
"Wichian",
"Willem",
"William",
"Winai",
"Wirat",
"Wirot",
"Wojciech",
"Wolfgang",
"Xiang",
"Xiaohong",
"Xiaoli",
"Xiaoping",
"Xiaoyan",
"Xin",
"Xolani",
"Yaakv",
"Yahaya",
"Yakubu",
"Yan",
"Yasuo",
"Yhudah",
"Ying",
"Yisrael",
"Yong",
"Yosef",
"Yoshie",
"Yoshimi",
"Yoshio",
"Yu",
"Yue",
"Yukio",
"Yun",
"Yuriy",
"Yusuf",
"Yuval",
"Zbigniew",
"Zhen",
"Zhiqiang"
],
"female": [
"Agata",
"Agnieszka",
"Aisha",
"Akira",
"Aleksandra",
"Alina",
"Alyona",
"Amina",
"Amnuai",
"Ana",
"Ana-Maria",
"Anah",
"Anan",
"Anastasiya",
"Andrea",
"Angela",
"Anita",
"Ann",
"Anna",
"Anong",
"Antonia",
"Asha",
"Barbara",
"Beata",
"Berglind",
"Bin",
"Birgit",
"Birna",
"Blessing",
"Brigitte",
"Bunmi",
"Busisiwe",
"Carmen",
"Carol",
"Caroline",
"Catherine",
"Chan",
"Chanah",
"Chao",
"Charoen",
"Chayah",
"Chen",
"Cheng",
"Christa",
"Christine",
"Claire",
"Claudia",
"Cristina",
"Darya",
"Dolores",
"Dorota",
"Edda",
"Ekaterina",
"Elena",
"Elisabeth",
"Elizabeth",
"Elke",
"Emiko",
"Emma",
"Erika",
"Erla",
"Erna",
"Ester",
"Esther",
"Eunice",
"Eva",
"Eugenia",
"Ewa",
"Faith",
"Fatima",
"Fiona",
"Fran",
"Francisca",
"Fumiko",
"Galina",
"Gabra",
"Gisela",
"Gita",
"Grace",
"Hadiza",
"Haiyan",
"Hanna",
"Haruna",
"Hauwa",
"Heike",
"Helen",
"Helga",
"Hildur",
"Hiroko",
"Hiromi",
"Hisako",
"Hong",
"Hui",
"Hulda",
"Inga",
"Ingrid",
"Irina",
"Isa",
"Isabel",
"Isah",
"Iwona",
"Jackline",
"Jan",
"Jane",
"Janet",
"Jean",
"Jennifer",
"Jianhua",
"Jianping",
"Jin",
"Joan",
"Joanna",
"Johanna",
"Josefa",
"Joy",
"Joyce",
"Juan",
"Julie",
"Justyna",
"Kai",
"Kanchana",
"Karen",
"Karin",
"Karolina",
"Kasia",
"Katarzyna",
"Katsumi",
"Keiko",
"Kiran",
"Kiyoko",
"Kristina",
"Kseniya",
"Kun",
"Lakshmi",
"Lalita",
"Lan",
"Latda",
"Laura",
"Laxmi",
"Leah",
"Lei",
"Li",
"Lihua",
"Lijun",
"Lilian",
"Lilja",
"Lin",
"Linda",
"Lindiwe",
"Ling",
"Liping",
"Lisa",
"Lucia",
"Lucy",
"Lyubov",
"Lyudmila",
"Magda",
"Magdalena",
"Mali",
"Manju",
"Margaret",
"Maria",
"Maria-Isabel",
"Maria-Jose",
"Maria-Pilar",
"Marina",
"Mariya",
"Marta",
"Martha",
"Mary",
"Maryam",
"Masako",
"Masami",
"Mei",
"Mercy",
"Michal",
"Michiko",
"Mieko",
"Min",
"Mina",
"Ming",
"Miriam",
"Miyoko",
"Mo",
"Monika",
"Mpho",
"Na",
"Nadezhda",
"Nan",
"Nancy",
"Natalya",
"Ngozi",
"Nicola",
"Ning",
"Nittaya",
"Noam",
"Nobuko",
"Nokuthula",
"Nonhlanhla",
"Noriko",
"Nushi",
"Olga",
"Omer",
"Patricia",
"Paula",
"Paulina",
"Peng",
"Petra",
"Phonthip",
"Pilar",
"Ping",
"Prani",
"Purity",
"Pushpa",
"Qing",
"Rachel",
"Radha",
"Rattana",
"Rebecca",
"Reiko",
"Rekha",
"Renate",
"Rita",
"Rong",
"Rosa",
"Rose",
"Rut",
"Ruth",
"Ryoko",
"Sabine",
"Sachiko",
"Samran",
"Santosh",
"Sara",
"Sarah",
"Sam",
"Sammy",
"Sawat",
"Shanti",
"Sharon",
"Shay",
"Shizuko",
"Shoshanah",
"Sibongile",
"Sita",
"Sombat",
"Sombun",
"Somchit",
"Somkhit",
"Sommai",
"Somnuek",
"Somphon",
"Somphong",
"Sri",
"Steinunn",
"Sukanya",
"Suman",
"Sunday",
"Sunita",
"Suphaphon",
"Susan",
"Susanne",
"Sushila",
"Svetlana",
"Takako",
"Tamar",
"Tatyana",
"Tal",
"Tebogo",
"Teruko",
"Thawi",
"Tomiko",
"Toshiko",
"Unnur",
"Urai",
"Urmila",
"Ursula",
"Usha",
"Valentina",
"Victoria",
"Wanjiru",
"Wanphen",
"Watsana",
"Wei",
"Wilai",
"Xiang",
"Xiaohong",
"Xiaoli",
"Xiaoping",
"Xiaoyan",
"Xin",
"Yael",
"Yan",
"Yasuko",
"Yelena",
"Yhudiyt",
"Ying",
"Yoko",
"Yong",
"Yoshie",
"Yoshiko",
"Yoshimi",
"Yu",
"Yue",
"Yuko",
"Yuliya",
"Yun",
"Yuval",
"Zainab",
"Zandile",
"Zanele",
"Zhen"
]
}
}
}

View File

@@ -0,0 +1,923 @@
{
"attribution": "https://github.com/ngneat/falso/blob/main/packages/falso/src/lib/last-name.json",
"data": {
"withAccents": [
"Æbelø",
"Æbeltoft",
"Ágústsdóttir",
"Ágústsson",
"Álvarez",
"Árnadóttir",
"Árnason",
"Ásgeirsdóttir",
"Ãshaikh",
"Beneš",
"Benešová",
"Baldursdóttir",
"Birgisdóttir",
"Bjarnadóttir",
"Björnsdóttir",
"Björnsson",
"Böttcher",
"Černá",
"Černý",
"Chávez",
"Ðekić",
"Díaz",
"Ðorðić",
"Dvořák",
"Dvořáková",
"Einarsdóttir",
"Fernández",
"Fialová",
"Förster",
"Friðriksson",
"Fröhlich",
"García",
"Gísladóttir",
"Gíslason",
"Göbel",
"Gómez",
"Groß",
"Gunnarsdóttir",
"Guðjónsdóttir",
"Guðjónsson",
"Guðmundsdóttir",
"Guðmundsson",
"Günther",
"Halldórsdóttir",
"Halldórsson",
"Gutiérrez",
"Guzmán",
"Hájek",
"Haraldsdóttir",
"Harðardóttir",
"Harðarson",
"Helgadóttir",
"Hernández",
"Hauksdóttir",
"Horák",
"Horáková",
"Jabłoński",
"Jäger",
"Jasiński",
"Jiménez",
"Jóhannesdóttir",
"Jóhannesson",
"Jóhannsdóttir",
"Jóhannsson",
"Jónasdóttir",
"Jónasson",
"Jónsdóttir",
"Jónsson",
"Kamiński",
"Karlsdóttir",
"Kjartansdóttir",
"Köhler",
"König",
"Kozłowski",
"Králová",
"Krejčí",
"Kristinsdóttir",
"Kristjánsdóttir",
"Kristjánsson",
"Krüger",
"Kučera",
"Kučerová",
"Łapiński",
"Löffler",
"López",
"Łuczak",
"Łukaszewski",
"Magnúsdóttir",
"Magnússon",
"Marková",
"Martínez",
"Meißner",
"Méndez",
"Möller",
"Müller",
"Muñoz",
"Novák",
"Nováková",
"Novotná",
"Novotný",
"Nuñez",
"Núñez",
"Ødegård",
"Őhlschlägerová",
"Ólafsdóttir",
"Ólafsson",
"Őllösová",
"Olszewski",
"Őri",
"Őrségi-Zölderdő",
"Óskarsdóttir",
"Óskarsson",
"Øvergård",
"Őzse",
"Pálsdóttir",
"Pálsson",
"Pawłowski",
"Peña",
"Pérez",
"Pétursdóttir",
"Pétursson",
"Pokorná",
"Pokorný",
"Pospíšil",
"Pospíšilová",
"Procházka",
"Procházková",
"Ragnarsdóttir",
"Ramírez",
"Ríos",
"Rodríguez",
"Sánchez",
"Schäfer",
"Schröder",
"Schütz",
"Sigurðardóttir",
"Sigurðsson",
"Sigurjónsdóttir",
"Sigurjónsson",
"Sokołowski",
"Stefánsdóttir",
"Stefánsson",
"Sveinsdóttir",
"Svobodová",
"Szczepański",
"Szymański",
"Urbański",
"Ūsas",
"Ūžien",
"Vásquez",
"Veselá",
"Veselý",
"Weiß",
"Żak",
"Žáková",
"Zemanová",
"Zieliński",
"Žukauskas",
"Žukauskienė",
"Þórðardóttir",
"Þórðarson",
"Þorsteinsdóttir",
"Þorsteinsson"
],
"withoutAccents": [
"Abdi",
"Abdullahi",
"Abe",
"Abubakar",
"Achieng",
"Adamczyk",
"Adamu",
"Adan",
"Adebayo",
"Adhiambo",
"Adri",
"Agbaria",
"Aguilar",
"Ahmad",
"Ahmed",
"Akinyi",
"Akpan",
"Ali",
"Aliev",
"Aliyu",
"Allen",
"Alonso",
"Alvarez",
"Amadi",
"Aminu",
"Andreev",
"Andreeva",
"Ansari",
"Anyango",
"Aoki",
"Arai",
"Arnarson",
"Ashknaziy",
"Atieno",
"Attias",
"Audu",
"Avraham",
"Ayutthaya",
"Azulay",
"Baba",
"Bai",
"Bailey",
"Baker",
"Bakker",
"Bala",
"Baldursson",
"Baloyi",
"Baran",
"Barasa",
"Barman",
"Bauer",
"Becker",
"Begam",
"Begum",
"Behera",
"Bekher",
"Bello",
"Bennett",
"Ber",
"Bevan",
"Bibi",
"Birgisson",
"Biswas",
"Bitton",
"Bjarnason",
"Blanco",
"Blom",
"Borkowski",
"Bos",
"Botha",
"Bowen",
"Braun",
"Brouwer",
"Brown",
"Bunma",
"Bunmi",
"Bunsi",
"Buthelezi",
"Cai",
"Cano",
"Cao",
"Carter",
"Castillo",
"Castro",
"Cele",
"Ceng",
"Chaichana",
"Chand",
"Chanthara",
"Chauke",
"Chebet",
"Chen",
"Cheng",
"Chepkemoi",
"Cherinsuk",
"Cheruiyot",
"Chided",
"Chmielewski",
"Chukwu",
"Clark",
"Clarke",
"Coetzee",
"Cohen",
"Collins",
"Cook",
"Cooper",
"Cortes",
"Cruz",
"Cui",
"Czarnecki",
"Dahan",
"Dai",
"Das",
"Dauda",
"David",
"Davies",
"Davis",
"Dayan",
"De-Bruijn",
"De-Graaf",
"De-Groot",
"De-Jong",
"Dekker",
"Delgado",
"Deng",
"Devi",
"Diaz",
"Dijkstra",
"Ding",
"Dlamini",
"Dominguez",
"Dong",
"Du-Plessis",
"Dube",
"Duda",
"Dudek",
"Dumont",
"Edwards",
"Egorov",
"Egorova",
"Einarsson",
"Elbaz",
"Eliyahu",
"Ellis",
"Emmanuel",
"Endo",
"Espinoza",
"Esteban",
"Evans",
"Eze",
"Fan",
"Fang",
"Feldman",
"Feng",
"Fernandez",
"Fiala",
"Fischer",
"Flores",
"Friedman",
"Frolova",
"Fu",
"Fuchs",
"Fujii",
"Fujita",
"Fukuda",
"Gaby",
"Gao",
"Garba",
"Garcia",
"Garrido",
"Garza",
"Ghosh",
"Gil",
"Golan",
"Goldstein",
"Gomez",
"Gonzales",
"Gonzalez",
"Goto",
"Govender",
"Grabowski",
"Green",
"Greenberg",
"Griffiths",
"Gu",
"Guerrero",
"Gumede",
"Gunnarsson",
"Guo",
"Gupta",
"Gutierrez",
"Hahn",
"Hall",
"Han",
"Haraldsson",
"Harle",
"Harle-Cowan",
"Harris",
"Harrison",
"Hartmann",
"Haruna",
"Hasegawa",
"Hashimoto",
"Hasna",
"Hassan",
"Hauksson",
"Hayashi",
"He",
"Helgason",
"Hen",
"Hendriks",
"Herbulot",
"Hernandez",
"Herrera",
"Herrmann",
"Hill",
"Hoekstra",
"Hoffmann",
"Hofmann",
"Hongthong",
"Hopkins",
"Howells",
"Hu",
"Huang",
"Huber",
"Hughes",
"Huisman",
"Hussein",
"Ibrahim",
"Idris",
"Iglesias",
"Igwe",
"Ikeda",
"Inoue",
"Isa",
"Isaac",
"Isah",
"Ishii",
"Ishikawa",
"Ito",
"Ivanov",
"Ivanova",
"Jabarin",
"Jackson",
"Jacobs",
"Jadhav",
"Jakubowski",
"James",
"Jankowski",
"Jansen",
"Janssen",
"Jaworski",
"Jenkins",
"Jia",
"Jiang",
"Jimenez",
"Jin",
"John",
"Johnson",
"Jones",
"Joseph",
"Juma",
"Jung",
"Kaczmarek",
"Kaiser",
"Kamau",
"Karanja",
"Kariuki",
"Karlsson",
"Kato",
"Katz",
"Kaur",
"Keller",
"Khan",
"Khatib",
"Khatoon",
"Khatun",
"Khoury",
"Khoza",
"Khumalo",
"Kibet",
"Kikuchi",
"Kim",
"Kimani",
"Kimura",
"King",
"Kjartansson",
"Klein",
"Kobayashi",
"Koch",
"Koech",
"Kok",
"Kondo",
"Kongkaeo",
"Koster",
"Kovalenko",
"Kowalczyk",
"Kowalski",
"Kozlov",
"Kozlova",
"Krause",
"Krawczyk",
"Kristinsson",
"Kubiak",
"Kucharski",
"Kuipers",
"Kumar",
"Kumari",
"Kuznetsov",
"Kuznetsova",
"Kwiatkowski",
"Lal",
"Lang",
"Langat",
"Lange",
"Lavyan",
"Lawal",
"Lebedeva",
"Lee",
"Lehmann",
"Levy",
"Lewandowski",
"Lewis",
"Li",
"Liang",
"Liao",
"Lim",
"Lin",
"Lis",
"Liu",
"Llewellyn",
"Lloyd",
"Lopez",
"Lozano",
"Lu",
"Luo",
"Ma",
"Maas",
"Mabaso",
"Macharia",
"Maciejewski",
"Maeda",
"Magomedov",
"Mahagna",
"Mahato",
"Mahlangu",
"Mahto",
"Maier",
"Maina",
"Majewski",
"Makarov",
"Makarova",
"Malinowski",
"Malkah",
"Maluleke",
"Mandal",
"Marciniak",
"Marek",
"Marin",
"Martin",
"Martinez",
"Masarweh",
"Maseko",
"Mathebula",
"Matsumoto",
"Matthews",
"Mayer",
"Mazibuko",
"Mazur",
"Mazurek",
"Mbatha",
"Medina",
"Meier",
"Meijer",
"Mendoza",
"Meng",
"Meyer",
"Mhamid",
"Mhlongo",
"Michalak",
"Michalski",
"Mikhaylov",
"Mikhaylova",
"Mishra",
"Mitchell",
"Mizrahi",
"Mkhize",
"Mofokeng",
"Mohamed",
"Mohammed",
"Mokoena",
"Molefe",
"Molina",
"Mondal",
"Moore",
"Mor",
"Morales",
"Moreno",
"Morgan",
"Mori",
"Morozov",
"Morozova",
"Morris",
"Moshe",
"Mthembu",
"Mthethwa",
"Mtshali",
"Muhammad",
"Muhammadu",
"Muhammed",
"Mulder",
"Murakami",
"Musa",
"Mustapha",
"Muthoni",
"Mutua",
"Mutuku",
"Mwangi",
"Naidoo",
"Nakajima",
"Nakamura",
"Nakano",
"Navarro",
"Nayak",
"Ndlovu",
"Nel",
"Neumann",
"Ngcobo",
"Ngobeni",
"Ngubane",
"Nguyen",
"Ngwenya",
"Nikitina",
"Nikolaev",
"Nikolaeva",
"Njeri",
"Njoroge",
"Njuguna",
"Nkosi",
"Novikov",
"Novikova",
"Nowak",
"Nowakowski",
"Nowicki",
"Ntuli",
"Nxumalo",
"Nyambura",
"Oakley",
"Ochieng",
"Odhiambo",
"Ogawa",
"Ohana",
"Ohayon",
"Ojo",
"Okada",
"Okafor",
"Okeke",
"Okon",
"Okoro",
"Okoth",
"Omar",
"Omer",
"Omondi",
"Ono",
"Onyango",
"Ortega",
"Ortiz",
"Ostrowski",
"Ota",
"Otieno",
"Ouma",
"Owen",
"Owino",
"Pal",
"Pan",
"Panya",
"Paramar",
"Parker",
"Parry",
"Paswan",
"Patel",
"Patil",
"Pavlov",
"Pavlova",
"Pawlak",
"Peeters",
"Peng",
"Peretz",
"Perez",
"Peter",
"Peters",
"Petrov",
"Petrova",
"Pfeiffer",
"Phillips",
"Photsi",
"Pietrzak",
"Pillay",
"Piotrowski",
"Popov",
"Popova",
"Powell",
"Prasad",
"Pretorius",
"Price",
"Prieto",
"Prins",
"Pritchard",
"Pugh",
"Qiu",
"Rabiu",
"Radebe",
"Ragnarsson",
"Ram",
"Ramirez",
"Ramos",
"Rani",
"Rathod",
"Ray",
"Rees",
"Ren",
"Reuben",
"Reyes",
"Richards",
"Richardson",
"Richter",
"Rivera",
"Roberts",
"Robinson",
"Rodriguez",
"Rogers",
"Romanov",
"Romanova",
"Romero",
"Rosenberg",
"Rotich",
"Rowlands",
"Roy",
"Rubio",
"Ruiz",
"Rungrueang",
"Rumbelow",
"Rutkowski",
"Sadowski",
"Saeli",
"Saelim",
"Saengthong",
"Saetan",
"Saetang",
"Saeueng",
"Sah",
"Saha",
"Sahu",
"Saidu",
"Saito",
"Sakai",
"Sakamoto",
"Salazar",
"Salisu",
"Samuel",
"Sanchez",
"Sangthong",
"Sani",
"Santiago",
"Santos",
"Sanz",
"Sarkar",
"Sasaki",
"Sato",
"Sawicki",
"Schmid",
"Schmidt",
"Schmitt",
"Schmitz",
"Schneider",
"Scholz",
"Schouten",
"Schulz",
"Schulze",
"Schwartz",
"Schwarz",
"Scott",
"Segel",
"Sekh",
"Sergeeva",
"Serrano",
"Shaikh",
"Shalom",
"Shapiro",
"Sharabi",
"Sharma",
"Shaw",
"Shehu",
"Shemesh",
"Shevchenko",
"Shi",
"Shimizu",
"Sibiya",
"Sichantha",
"Sikora",
"Simiyu",
"Singh",
"Sisuk",
"Sithole",
"Sitwat",
"Smee",
"Smirnov",
"Smirnova",
"Smit",
"Smith",
"Smits",
"Sokolov",
"Sokolova",
"Sombun",
"Song",
"Soto",
"Smoakley",
"Starr",
"Stepanov",
"Stepanova",
"Su",
"Suad",
"Suarez",
"Suissa",
"Sukkasem",
"Sulaiman",
"Suleiman",
"Sun",
"Sunday",
"Suwan",
"Suzuki",
"Sveinsson",
"Svoboda",
"Szewczyk",
"Takahashi",
"Takeuchi",
"Tal",
"Tan",
"Tanaka",
"Tang",
"Taylor",
"Thakur",
"Thomas",
"Thompson",
"Thongdi",
"Thongkham",
"Thongsuk",
"Tian",
"Tomaszewski",
"Torres",
"Tshabalala",
"Turner",
"Udo",
"Ueda",
"Umar",
"Umaru",
"Usman",
"Vaknin",
"Valdez",
"Van-Beek",
"Van-Dam",
"Van-den-Berg",
"Van-der-Heijden",
"Van-der-Linden",
"Van-Dijk",
"Vargas",
"Vasilev",
"Vasileva",
"Vazquez",
"Vega",
"Venter",
"Verhoeven",
"Vermeulen",
"Visser",
"Volkov",
"Volkova",
"Vos",
"Wafula",
"Wagner",
"Wairimu",
"Walczak",
"Walker",
"Walter",
"Walters",
"Wambua",
"Wambui",
"Wang",
"Wangui",
"Wanjala",
"Wanjiku",
"Ward",
"Watanabe",
"Watkins",
"Watson",
"Weber",
"Wei",
"Wekesa",
"Wen",
"Werner",
"White",
"Wieczorek",
"Wilk",
"Willems",
"Williams",
"Wilson",
"Witkowski",
"Wojciechowski",
"Wolf",
"Wood",
"Wright",
"Wu",
"Xiao",
"Xie",
"Xu",
"Yaakv",
"Yadav",
"Yahaya",
"Yakovleva",
"Yakubu",
"Yamada",
"Yamaguchi",
"Yamamoto",
"Yamashita",
"Yamazaki",
"Yan",
"Yang",
"Yao",
"Ye",
"Yin",
"Yosef",
"Yoshida",
"Young",
"Yu",
"Yuan",
"Yusuf",
"Zajac",
"Zakharov",
"Zakharova",
"Zalewski",
"Zawadzki",
"Zaytseva",
"Zhang",
"Zhao",
"Zheng",
"Zhong",
"Zhou",
"Zhu",
"Zimmermann",
"Zoabi",
"Zulu",
"Zwane"
]
}
}

90
aviationstack/main.py Normal file
View File

@@ -0,0 +1,90 @@
from selenium import webdriver
from selenium.webdriver.support.ui import Select
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium_stealth import stealth
import random
import string
import json
from pickledb import PickleDB
import random_address
import time
db = PickleDB("accounts.json")
def random_name():
with open("aviationstack/first_names.json", "r") as f:
first_names = json.load(f)
with open("aviationstack/last_names.json", "r") as f:
last_names = json.load(f)
return {
"first": random.choice(first_names['data']['withoutAccents']['male']),
"last": random.choice(last_names['data']['withoutAccents'])
}
def random_password(length=12):
characters = string.ascii_letters + string.digits + string.punctuation
return ''.join(random.choice(characters) for i in range(length))
browser_opts = Options()
browser_opts.add_experimental_option("excludeSwitches", ["enable-automation"])
browser_opts.add_experimental_option('useAutomationExtension', False)
browser_opts.add_argument("--disable-blink-features=AutomationControlled")
browser_opts.add_argument("--disable-infobars")
# firefox user agent
browser_opts.add_argument("Mozilla/5.0 (X11; Linux x86_64; rv:140.0) Gecko/20100101 Firefox/140.0")
browser = webdriver.Chrome(options=browser_opts)
browser.maximize_window()
browser.get("https://aviationstack.com/signup/free")
cookies = browser.find_elements("xpath", '//*[@id="cookiescript_close"]')
if cookies:
print("closing cookie popup")
cookies[0].click()
names = random_name()
email = f"{names['first'].lower()}.{names['last'].lower()}@whatisham.eu.org"
passwd = random_password()
address = random_address.real_random_address_by_state("CA")
browser.find_element("id", "first_name").send_keys(names['first'])
browser.find_element("id", "last_name").send_keys(names['last'])
browser.find_element("id", "email").send_keys(email)
browser.find_element("id", "password").send_keys(passwd)
browser.find_element("id", "address_free").send_keys(address['address1'])
browser.find_element("id", "post_code_free").send_keys(address['postalCode'])
country_select = Select(browser.find_element("id", "country_code_free"))
country_select.select_by_visible_text("United States")
state_select = Select(browser.find_element("class name", "state-select"))
state_select.select_by_value("California")
browser.find_element("id", "city_free").send_keys(address['city'])
browser.execute_script("window.scrollTo(0, document.body.scrollHeight);")
input("Please complete the captcha and press Enter to continue...")
browser.find_element("class name", "signup_button_submit").click()
time.sleep(5)
browser.get("https://aviationstack.com/dashboard")
try:
wait = WebDriverWait(browser, 15)
accessKey = wait.until(EC.visibility_of_element_located((By.CLASS_NAME, "alert_inner")))
access_key_text = accessKey.text
print(f"Access Key: {access_key_text}")
except Exception as e:
print(f"Could not find access key element: {e}")
access_key_text = None
db.set(email, {
"password": passwd,
"access_key": access_key_text
})
db.save()

View File

@@ -3,6 +3,10 @@
"module": "src/index.ts",
"type": "module",
"private": true,
"scripts": {
"dev": "bun --watch .",
"importAccs": "bun run src/importAccounts.ts"
},
"devDependencies": {
"@types/bun": "latest"
},

View File

@@ -0,0 +1,6 @@
-- CreateTable
CREATE TABLE "ASAccount" (
"email" TEXT NOT NULL PRIMARY KEY,
"password" TEXT NOT NULL,
"key" TEXT NOT NULL
);

View File

@@ -0,0 +1,20 @@
/*
Warnings:
- You are about to drop the `ASAccount` table. If the table is not empty, all the data it contains will be lost.
*/
-- DropTable
PRAGMA foreign_keys=off;
DROP TABLE "ASAccount";
PRAGMA foreign_keys=on;
-- CreateTable
CREATE TABLE "AsAccount" (
"email" TEXT NOT NULL PRIMARY KEY,
"password" TEXT NOT NULL,
"key" TEXT NOT NULL,
"usage" INTEGER NOT NULL DEFAULT 0,
"createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updatedAt" DATETIME NOT NULL
);

View File

@@ -0,0 +1,8 @@
/*
Warnings:
- A unique constraint covering the columns `[email]` on the table `AsAccount` will be added. If there are existing duplicate values, this will fail.
*/
-- CreateIndex
CREATE UNIQUE INDEX "AsAccount_email_key" ON "AsAccount"("email");

View File

@@ -0,0 +1,2 @@
-- AlterTable
ALTER TABLE "AsAccount" ADD COLUMN "lastResetDate" DATETIME;

View File

@@ -11,66 +11,77 @@ datasource db {
}
model Flight {
id String @id @default(cuid())
userId String
channelId String
id String @id @default(cuid())
userId String
channelId String
// identifiers
faFlightId String @unique // fa_flight_id
ident String // flight number
identIcao String // ICAO ident
identIata String? // IATA ident (can be null)
faFlightId String @unique // fa_flight_id
ident String // flight number
identIcao String // ICAO ident
identIata String? // IATA ident (can be null)
// aircraft info
registration String? // tail number
aircraftType String? // e.g., "A320"
registration String? // tail number
aircraftType String? // e.g., "A320"
// route info
originIcao String // icao code (lemg)
originIata String // iata code (agp)
originName String // airport name
originCity String // city name
destinationIcao String // icao code
destinationIata String // iata code
destinationName String // airport name
destinationCity String // city name
originIcao String // icao code (lemg)
originIata String // iata code (agp)
originName String // airport name
originCity String // city name
destinationIcao String // icao code
destinationIata String // iata code
destinationName String // airport name
destinationCity String // city name
// timing (stored in iso 8601 format on the api)
scheduledOut DateTime?
scheduledOff DateTime // takeoff time
scheduledOn DateTime // landing time
scheduledIn DateTime?
estimatedOut DateTime?
estimatedOff DateTime?
estimatedOn DateTime?
estimatedIn DateTime?
actualOut DateTime?
actualOff DateTime?
actualOn DateTime?
actualIn DateTime?
scheduledOut DateTime?
scheduledOff DateTime // takeoff time
scheduledOn DateTime // landing time
scheduledIn DateTime?
estimatedOut DateTime?
estimatedOff DateTime?
estimatedOn DateTime?
estimatedIn DateTime?
actualOut DateTime?
actualOff DateTime?
actualOn DateTime?
actualIn DateTime?
// status and delays
status String // "Scheduled", "Delayed", etc.
departureDelay Int? // minutes
arrivalDelay Int? // minutes
cancelled Boolean @default(false)
diverted Boolean @default(false)
status String // "Scheduled", "Delayed", etc.
departureDelay Int? // minutes
arrivalDelay Int? // minutes
cancelled Boolean @default(false)
diverted Boolean @default(false)
// more useful info
progressPercent Int? // 0-100
gateOrigin String?
gateDestination String?
terminalOrigin String?
progressPercent Int? // 0-100
gateOrigin String?
gateDestination String?
terminalOrigin String?
terminalDestination String?
// metadata
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
@@index([userId])
@@index([faFlightId])
@@index([scheduledOff])
}
}
model AsAccount {
email String @id @unique
password String
key String
usage Int @default(0)
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
lastResetDate DateTime?
}

25
src/importAccounts.ts Normal file
View File

@@ -0,0 +1,25 @@
import { PrismaClient } from "@prisma/client";
import { readFile } from "fs/promises";
const db = new PrismaClient();
const accountsJson = JSON.parse(await readFile('accounts.json', "utf-8")) as Record<string, Account>;
const accounts = Object.entries(accountsJson).map(([email, account]) => ({
email,
password: account.password,
key: account.access_key,
}));
await db.asAccount.createMany({
data: accounts,
})
await db.$disconnect();
console.log(`Imported ${accounts.length} accounts.`);
interface Account {
password: string;
access_key: string;
}

View File

@@ -117,52 +117,56 @@ export class FlightUpdater {
private async updateSingleFlight(flight: Flight) {
console.log(`updating flight ${flight.ident} (${flight.id})`);
try {
if (flight.actualIn) {
const currentFlight = await db.flight.findUnique({
where: { id: flight.id }
});
if (!currentFlight || currentFlight.actualIn) {
this.removeFlightPolling(flight.id);
return;
}
const flightInfo = await flightAware.getFlightInfo(flight.faFlightId);
const flightInfo = await flightAware.getFlightInfo(currentFlight.faFlightId);
const newData = flightInfo.flights[0];
if (!newData) return;
const changes = [];
if (flight.status !== newData.status) {
if (currentFlight.status !== newData.status) {
changes.push(`Status: ${newData.status}`);
}
if (Math.abs((flight.departureDelay || 0) - (newData.departure_delay || 0)) > 10) {
if (Math.abs((currentFlight.departureDelay || 0) - (newData.departure_delay || 0)) > 10) {
changes.push(`Departure delay: ${newData.departure_delay || 0} minutes`);
}
if (flight.gateOrigin !== newData.gate_origin && newData.gate_origin) {
if (currentFlight.gateOrigin !== newData.gate_origin && newData.gate_origin) {
changes.push(`Gate changed to: ${newData.gate_origin}`);
}
if (!flight.actualOff && newData.actual_off) {
if (!currentFlight.actualOff && newData.actual_off) {
changes.push('✈️ Flight has taken off!');
this.adjustFlightPolling(flight.id, flight);
}
if (!flight.actualOn && newData.actual_on) {
if (!currentFlight.actualOn && newData.actual_on) {
changes.push('🛬 Flight has landed!');
this.removeFlightPolling(flight.id);
}
if (!flight.cancelled && newData.cancelled) {
if (!currentFlight.cancelled && newData.cancelled) {
changes.push('❌ Flight cancelled');
this.removeFlightPolling(flight.id);
}
if (!flight.diverted && newData.diverted) {
if (!currentFlight.diverted && newData.diverted) {
changes.push(`🚨 Flight diverted to ${newData.destination.code_iata} (${newData.destination.name})`);
}
// smart progress updates (0 - 10, 10 - 20, etc.)
if (flight.progressPercent !== null && newData.progress_percent !== null && newData.actual_off && !newData.actual_on) {
const oldTens = Math.floor((flight.progressPercent || 0) / 10);
// 10 multiple updates (0 - 10, 10 - 20, etc.)
if (currentFlight.progressPercent !== null && newData.progress_percent !== null && newData.actual_off && !newData.actual_on) {
const oldTens = Math.floor((currentFlight.progressPercent || 0) / 10);
const newTens = Math.floor(newData.progress_percent / 10);
if (oldTens !== newTens && newData.progress_percent !== 100) {
@@ -193,10 +197,10 @@ export class FlightUpdater {
}
if (changes.length > 0) {
const message = `🔔 *${flight.ident}* (${flight.originIata}${flight.destinationIata})\n${changes.join('\n')}`;
const message = `🔔 *${currentFlight.ident}* (${currentFlight.originIata}${currentFlight.destinationIata})\n${changes.join('\n')}`;
await app.client.chat.postMessage({
channel: flight.channelId,
channel: currentFlight.channelId,
text: message
});
}
@@ -209,21 +213,17 @@ export class FlightUpdater {
}
private adjustFlightPolling(flightId: string, flight: Flight, isError: boolean = false) {
// clear current interval
const existingInterval = this.flightIntervals.get(flightId);
if (existingInterval) {
clearInterval(existingInterval);
}
// calculate interval
let newInterval = this.calculatePollInterval(flight);
// increase interval in case of errors
if (isError) {
newInterval *= 2;
}
// update interval
const interval = setInterval(() => this.updateSingleFlight(flight), newInterval);
this.flightIntervals.set(flightId, interval);
}